单片机系列(2)流水灯程序是如何写入单片机的

2019-04-15 19:14发布

在上一篇中《单片机实现跑马灯》中我们完成了一个漂亮的流水灯,里面有一段代码我们来分析一下吧,看看单片机是怎么理解这段代码的。                                        
《单片机实现跑马灯》(点击图片跳转)

#include    //此文件中定义了51的一些特殊功能寄存器
void Delay10ms(unsigned int);   //误差 0us
void main()     //主函数 while(1) { P2  = 0x00;     //置P0口为低电平 Delay10ms(50);  //调用延时程序 P2  = 0xff;     //置P0口为高电平 Delay10ms(50);  // 调用延时程序 }}
void Delay10ms(unsigned int c)   //误差 0us{    unsigned char a,b;    for(;c>0;c--)        for(b=38;b>0;b--)            for(a=130;a>0;a--);}

为什么我们可以直接给P2赋值呢?哪里定义了这个变量,打开Keil的安装目录(例如我的在C:KeilC51INCREG51.H)我们可以看到一个头文件,内容里面定义了P2.粘贴一部分如下。

#ifndef __REG51_H__#define __REG51_H__
/*  BYTE Register  */sfr P0   = 0x80;sfr P1   = 0x90;sfr P2   = 0xA0;sfr P3   = 0xB0;sfr PSW  = 0xD0;sfr ACC  = 0xE0;sfr B    = 0xF0;sfr SP   = 0x81;sfr DPL  = 0x82;sfr DPH  = 0x83;
此处省略........
#endif

sfr P2   = 0xA0这句话的意思是把单片机内部地址0xA0处的这个寄存器重新起名叫P2,所以我们在程序中可以直接操作P2来操作地址0xA0处的寄存器。如下图这是STC89C52RC单片机的管脚分布,P0, P1, P2分别对应8个管脚。
对应实物图如下  ↓↓
进入main()函数(程序的入口)后我们让P2寄存器赋值为0意思就是让P2对应的8个IO口电压为低电平,此时发光二极管不亮。然后一段延时后再给P2寄存器赋值为FF(二进制为1111 1111)意思让P2对应的8个IO口电压为高电平。while语句就是让无限循环这一过程。

Delay10ms()函数是一个延时程序,感觉好像在做无用功。单片机工作和人一样有心跳的,这个心跳我们称为时钟周期,如果外接晶振(上图右下角所示)那么这个时钟周期就是这个晶振频率的倒数(如12MHZ的晶振,它的时钟周期就是1/12us),它是单片机中的最小时间单位。我们让单片机没执行一个程序指令就需要消耗一个机器周期(对应多个时钟周期)这样就会延时。

噢耶!程序有了,是怎么将程序烧写到单片机的呢?

就是这个小家伙将程序烧写到单片机的,但是它不是什么神兵利器,它只是做了一件很简单的事情。它里面最核心的就是USB转UART模块,功能是把RS-232电平(PC机输出一般12v)和TTL电平(单片机输出一般5v)相互转换。

然后我们可以看到连接图中TXD和RXD两个管脚,TXD 发送数据Transmit(tx) Data的缩写,RXD接收数据Receive(rx) Data的简写。所以注意这两个接口连接需要互换。将USB一头插到PC机上安装驱动后使用STC单片机烧写工具擦除之前程序写入新的程序。

将发光二极管一个管脚接地另一个串联一个100欧电阻接到P2相应8个管脚就可以跑我们刚刚写入的程序了。

提示:Keil、STC-ISP工具下载和其他疑问请关注公众号后留言询问,吉格斯看到会回复你的。