单片机c51开发之开发实例

单片机c51开发之开发实例

  1. 让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);

}

},

发表回复

您的电子邮箱地址不会被公开。