Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15770
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-15 18:03
个人简介

穷且益坚,不坠青云之志

文章分类
文章存档

2014年(2)

我的朋友

分类: 嵌入式

2014-06-15 23:34:40

/*
**********************************
 @Brief: LED flashing
 @date: 15/6/2014
 @author: ling yun di wang
**********************************
*/
#include "reg52.h"#include "reg52.h"
#include "intrins.h"
sbit D2 = P2^3;
#define uint unsigned int 
void delay(uint c);
void main()
{
    D2 = 0;
    P1 = 0xfe;
while(1)
{
    delay(100);
    P1 = _crol_(P1,1); //crol is a library function that rotates left some bits and return the value of the rotated character
}

}
/*
**********************************
 @Brief: delay function
 @param: none
 @return: none
**********************************
*/

void delay(uint c)
{
    uint x,y;
    for(x=c;x>0;x--)  
        for(y=300;y>0;y--);
}

写代码之初遇到的几个问题:
/*首先要查看原理图,判断相应管脚的接入方式,再通过电路、电器特性来判断最终实现目的的管脚输入输出、电平高低分配的原则。*/
原理图如:
1.#define uint unsigned int  
     宏定义的应用很广泛,define和typedef的用法可以起到求简去繁的目的。宏定义之后不能加“;” 否则会提示uint类型的变量没有定义
2.子程序的调用
    C语言是模块化语言,习惯的写法就是将功能模块化,用子函数来表示,在主程序中来调用它。这样使程序看起来简洁,清楚,方便后期维护。
3.函数的原型声明
    在void delay(); 函数调用之前要对函数原型(prototype)进行声明,否则会提示missing function-prototype

4.循环左移之库函数_crol_(P1,1),实现流水灯
    流水灯的实现方法就是将初始的LED1亮灯情况进行循环左移一位,此时应用库函数_crol_(P1,1)来实现。蜂鸣器是应用到PNP型三极管,通         过压降的方式导通蜂鸣器线路,通过pio2.3输出一个低电平,实现蜂鸣器发声。(注重库函数的学习与使用)
5.delay()函数

    对于LED的闪烁无非就是控制LED的管脚输出高电平和低电平,此部分通过查看原理图以及LED SPEC可知。但是要实现闪烁并不能单纯的给出
      D1 = 0;
      D1 = 1;
    这样只能显示LED灯是常亮的,原因在于没有加延时函数,也就是说亮灭持续的时间太短,我们通过肉眼查看不出来。

    所以加上delay()函数。delay函数的加入有几种办法:
(1)通过for循环
         for(x=200;x>0;x--)  
              for(y=300;y>0;y--);
(2)通过while循环
         while(a--);
delay时间的设置也就是闪烁周期和时钟周期有关。时钟周期就是晶振振荡周期,机器周期就是12个时钟周期。指令周期是指CPU完成一条指令需要执行的时间,可能是一个机器周期也可能是几个机器周期。所以要调节具体的闪烁周期要知道单片机的时钟周期就是晶振周期,然后在keil软件中设置一下,进入调试界面之后,如右图可见
标红的地方sec就是程序执行的时间,可在D1 = 1处也就是LED熄灭的语句之前加上断点,来运行查看左边经历的时间,由此来微调闪烁周期。

阅读(5551) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~