单片机c51开发之开发实例
- 让led指示灯不断闪烁的代码实例
好了,相信自己,你已经足够强大,对自己说我能做到,我行,
你现在的水平已经可以编一个让led指示灯不断闪烁的代码:
下面我们来实现
- 我们要把led指示灯的一脚接到单片机的一个I/O口输出脚上即接到单片机的一个针脚上,
我们配套的开发板上的单片机c8051f340(高速型51单片机)一共有40个I/O口引脚,其他8个脚都是比如用作电源输入等无关的功能,可以先忽略,
这40个I/O口分别为P0,P1,P2,P3,P4共5个P口,每个P口有8个引脚,比如P0口就有
P0.1到P0.7这8个脚,
我们看到这款开发板上有我们需要的led指示灯2个(还有一个是电源灯,不管它),可以用来做这个让led指示灯不断闪烁的实验
这个单片机上有P0,P1,P2,P3,P4共5个P口,每个P口有8个引脚,比如P0口就有
P0.1到P0.7这8个脚,
,比如我们把led指示灯的一脚接到单片机的P2.7 这个引脚上,如下图:

硬件上就如上图这样连接led指示灯和单片机
可以想象,由于led 指示灯一脚已经接电源负极了,如果再在另一脚即所连接的单片机的P2.7脚上输出个正电压即高电平1,这个led 指示灯的2脚就变为1正1负了,就会承受一个电压,所以此刻,led指示灯会亮,如果另一脚即所连接的单片机的P2.7脚上也输出个负电压即低电平0,那么这个led 指示灯的2脚就变为1负1负了,负负抵消,就不会承受任何电压,所以此刻,led指示灯会灭
所以让led 指示灯不断闪烁,我们的任务就是在单片机的P2.7脚上循环输出高电平1和低电平0,
比如先输出1,再0.5秒后再输出0,再0.5秒后输出1,再0.5秒后输出0……………….,不断循环下去
下面我们开始写代码:
写代码前要学习一点:所有的c51程序代码都是从void main()函数开始执行的(void 表示这个main函数执行完不返回任何值),
安装【电脑软件\keil4.0–c8051f340或51单片机编程专用】这个keil4.0软件,用来编程,
安装完打开keil4.0, 新建立1个单片机代码项目:点菜单栏Project/New uVision Project,输入工程名后再选择工程文件保存目录再点确定保存,
然后弹出选择单片机型号的对话框,选择Silicon Laboratories Inc的c8051f340这个单片机,然后点OK,
然后点【否】来不加入STARTUP.A51,
然后点菜单栏的File>New 新建源码文件,再点File>Save保存源码文件,输入文件名main.c ,取名为main.c,
然后点保存,
然后左侧切换到project选项卡,里面在Source Group 1这个目录图标上鼠标右击,点Add Files To Group ‘Source Group 1’,然后刚才新建立main.c文件,点Add按钮,使main.c这个文件加入到代码工程,参与编译,
然后左侧切换到project选项卡, Target 1这个目录图标上鼠标右击,点Options for ‘Target 1’,
弹出的对话框里选择Output选项卡,里面Name of Execuable比如填入abc,然后把Create HEX file选项勾起来(不然无法生成hex烧写文件,无法烧写程序到单片机里)
然后左侧切换到project选项卡,双击里面的main.c,进入main.c源码文件的编辑,
下面开始给main.c源码文件编写代码:
我们先把控制led用的P2.7引脚映射到aaa变量:
sbit aaa=P2^7;
然后,我们开始写main主函数:
sbit aaa=P2^7;
void main(){
}
下一步要写main()内的函数内容,我们首先点亮led,用aaa=1;就行,使p2.7脚输出高电平,来点亮led
即:
sbit aaa=P2^7;
void main(){
aaa=1;
}
我们再定义一个延时函数,用来在led灯亮后,延时0.5秒再熄灭.:
void yanshi(int shijian){
for(int t=0;t< shijian;t=t+1){
for(int t2=0;t2< 1000;t2=t2+1){
}
}
}
不知道大家看懂这段代码没,因为可以经过计算得到一次for循环执行时间大约为几个单片机的时钟节拍,大约为1微秒(对于c8051f340这个单片机的处理速度来说),所以
for(int t2=0;t2< 1000;t2=t2+1){
}
这个一共执行1000次,大约能延时1毫秒时间.
而
for(int t=0;t< shijian;t=t+1){
for(int t2=0;t2< 1000;t2=t2+1){
}
}
就是循环shijian里定义的次数 次的for(int t2=0;t2< 1000;t2=t2+1){}这个,就是for(int t2=0;t2< 1000;t2=t2+1){}
这个东西本身再整体循环shijian里定义的次数 次,比如shijian=1000时,就是循环1000次for(int t2=0;t2< 1000;t2=t2+1){},一次for(int t2=0;t2< 1000;t2=t2+1){}用时1毫秒,所以循环1000次for(int t2=0;t2< 1000;t2=t2+1){},就是用时1000毫秒,也就是用时1秒,
所以如果我们循环1500次,就能达到延时1.5秒的效果,即这样调用延时函数:yanshi(1500);
所以我们再次修改我们的此次的实验代码为:
void yanshi(int shijian){
for(int t=0;t< shijian;t=t+1){
for(int t2=0;t2< 1000;t2=t2+1){
}
}
}
sbit aaa=P2^7;
void main(){
aaa=1;
yanshi(1500);
aaa=0;
yanshi(1500);
}
但是这样只能实现闪一下led灯就不再循环闪了,
所以我们再加一个循环代码:把aaa=1;yanshi(1500);aaa=0 ;yanshi(1500);改为
for(;;){
aaa=1;yanshi(1500);aaa=0; yanshi(1500);
}
,其中for(;;){ 。。。。。。}表示无限次循环执行{ 。。。。。。 }里的代码,
所以我们再次修改我们的此次实验代码为:
void yanshi(int shijian){
for(int t=0;t< shijian;t=t+1){
for(int t2=0;t2< 1000;t2=t2+1){
}
}
}
sbit aaa=P2^7;
void main(){
for(;;){
aaa=1;
yanshi(1500);
aaa=0;
yanshi(1500);
}
},