单片机C语言程序设计实训100例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第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);
          }
        }