
第3章 基础程序设计
通过对前两章的学习,读者进一步熟悉了8051 单片机的基本硬件结构与内部资源,归纳了用C语言开发单片机程序必须参考和重点掌握的技术内容,了解了用C语言开发调试单片机系统的优势,同时,还熟悉了Proteus的基本操作,Proteus与μ V3的联合调试技术等,这为本章及后续章节Proteus环境下C语言程序设计案例的学习调试与研究作好了准备。
本章案例全面涉及8051单片机内部资源的程序设计及基本外围元件的应用,案例包括3部分:
第1部分是1~23号案例,涉及基本I/O控制,包括LED、数码管、按键、开关与继电器、蜂鸣器等程序设计。
第2部分是24~42号案例,主要涉及外部中断与定时计数器程序设计。
第3部分是43~48号案例,内容涉及串口控制,包括通过串口进行串并、并串转换、双单片机通信、单片机与PC通信等。
通过对这些案例的学习研究与跟踪调试,并对各案例中提出的修改要求或新的设计目标的实践与实训,读者将全面掌握8051单片机的C语言基础程序设计技术,熟练使用C语言控制和运用单片机内部资源,为8051单片机扩展资源的应用及8051单片机系统的综合设计打下良好基础。
3.1 闪烁的LED
本例单片机P1.0引脚连接LED,程序按设定的时间间隔取反P1.0,使LED按固定时间间隔持续闪烁。
本例电路如图3-1所示,注意电路中限流电阻R2的阻值不能过大,否则LED不会闪烁。

图3-1 闪烁的LED电路
程序设计调试与实训:
本程序头文件reg51.h不能省略,否则,编译时将会提示:
TEXT1.C(??): error C202: 'P1': undefined identifier
Keil C认为P1是未定义的标识符,因为头文件reg51.h定义了所有的特殊功能寄存(SFR),错误提示中(??)是错误所在的行号。当然,读者也可以在省略该头文件时,添加一行代码:sfr P1= 0x90; 因为P1的地址为0x90。
注意本例中的延时子程序放在main()函数前面,如果要放在main()函数后,则在#define的下面添加以下相应的函数申明语句:
void DelayMS(uint x);
要增加延时间隔时,可修改源程序中的延时值150,由于参数类型为uint,因此,最大可设延时为65535,如果延时参数类型为uchar,则参数最大值不要超过255。
另外,本程序及后续多道程序中均有uchar和uint的宏定义,虽然并非每个程序都同时使用了uchar和uint类型,但本书几乎所有程序中都同时定义了这两种类型。
读者阅读调试后可修改本例,控制多个LED闪烁,并改变它们的闪烁速度。
源程序代码:
//----------------------------------------------------------------- // 名称: 闪烁的LED //----------------------------------------------------------------- // 说明: LED按设定的时间间隔闪烁。 //----------------------------------------------------------------- #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit LED = P1^0; //----------------------------------------------------------------- // 延时 //----------------------------------------------------------------- void DelayMS(uint x) { uchar i; while(x--) { for(i = 0; i < 120; i++); } } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { while(1) { LED = ~LED; DelayMS(150); } }