全部博文(215)
分类: 嵌入式
2014-06-19 10:17:06
原文地址:51单片机学习笔记之流水灯加蜂鸣器 作者:凌云帝王
/*
**********************************
@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()函数
所以加上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熄灭的语句之前加上断点,来运行查看左边经历的时间,由此来微调闪烁周期。