C51单片机 简单的交通红绿灯设计二

连同上文 C51单片机 简单的交通红绿灯设计一

设计二中选择使用定时器代替延时函数,定时器的介绍我找到一篇简单易懂的文章----C51的定时器_从入门到捕蛇者说的博客

延时函数与定时器的区别:延时函数会占据CPU的使用权,如果正在进行延时,其他动作需要等延时结束才能进行,而配置定时器可以打开中断函数,独立进行,不占据CPU。

总览一:数码管用来显示数字。

二:LED交通灯本质上就是二极管,含有红绿黄,作为交通灯。

三:配置计时器用以计时。(计时器的使用)

对于第二条,我本想用lcd1602显示屏做的,但...lcd1602在底层配置的时候应该是连动到了引脚,lcd1602显示的时候会干扰到二极管的亮灭,所以我还是用了前文的一个数码管。

#include <REGX51.H>
unsigned int count=0,led_count=0;
unsigned int Number;
sbit Green_Light = P1^5;
sbit Yellow_Light = P1^6;
sbit Red_Light = P1^7;
unsigned int i=0;
unsigned int x[23]={10,9,8,7,6,5,4,3,2,1,3,2,1,10,9,8,7,6,5,4,3,2,1};
void Timer0_init()
{
    TMOD = 0x01;
    TL0 = 0x00;
    TH0 = 0xDC;//定时器的初始化配置成10ms进入一次中断函数。
    TF0 = 0;
    TR0 = 1;//用以计时,当爆表后TF0会跳转为1(通过上述配置即10ms后TF0=1)
    ET0=1;
    EA=1;
    PT0=0;
}
void NiXie(unsigned char Number)
{
        switch(Number)
    {
        case 0:P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=0;break;
        case 1:P0_1=P0_2=0;break;
        case 2:P0_0=P0_1=P0_3=P0_4=P0_6=0;break;
        case 3:P0_0=P0_1=P0_2=P0_3=P0_6=0;break;
        case 4:P0_1=P0_2=P0_5=P0_6=0;break;
        case 5:P0_0=P0_2=P0_3=P0_5=P0_6=0;break;
        case 6:P0_0=P0_2=P0_3=P0_4=P0_5=P0_6=0;break;
        case 7:P0_0=P0_1=P0_2=0;break;
        case 8:P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=P0_6=0;break;
        case 9:P0_0=P0_1=P0_2=P0_3=P0_5=P0_6=0;break;
        case 10:P0_6=0;break;
    }
}
void main()
{
    Green_Light = 1,Red_Light = 1,Yellow_Light=1;
    Number = 10;
    Timer0_init();//初始化工作
    while(1)
    {}
}
Timer0() interrupt 1//TF0为一时执行终端函数,执行完后TF0自动归0
{
    TL0 = 0x00;
    TH0 = 0xDC;//再把初值设为9126,保证下次还能再进入中断函数,并且也用时10ms
    count++,led_count++;
    NiXie(x[i]);//数码管的闪烁,其实每个数字闪烁了100下,每次10ms。
    if(led_count >= 100)
    {
        P0_0=P0_1=P0_2=P0_3=P0_4=P0_5=P0_6=P0_7=1;//return
        i++;
        led_count = 0;
        if(i==23)
        {i=0;}
    }
    
    if(count>0&&count<1000)//0~第10秒
    {
        Green_Light = 0;
    }
    if(count>=1000&&count<1300)//第10秒~第13秒
    {
        Green_Light = 1;//关绿灯开黄灯
        Yellow_Light = 0;
    }
    if(count>=1300&&count<2300)//第13秒~第23秒
    {
        Yellow_Light = 1;//关黄灯开红灯
        Red_Light = 0;
    }
    if(count>=2300)
    {
        Red_Light = 1;
        count = 0;//一遍后归零
    }
}

机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 = 12 / 时钟频率 秒 = 12 / 11059200 秒 = 12 000 000/ 11059200 微秒 = 1.085 微秒

配置十毫秒的计时:10ms需要数9216机器周期,你让它从65536-9126=56320(16进制表示为

0xDC00)开始数数

这样TL0=0x00;TH0=0xDC。

中断函数:与外部中断一样,定时器中断也有中断函数,同理,程序去执行中断函数就会把TF0的中断标志位自动清0,所以只要我们用了定时器中断函数,那么TF0就可以不用再出现在程序书写中了。

在代码中,我用了count和led_count分别计数,每次主函数跳转到中断函数后,用时10ms,每次count和led_count的值加一,进入一百次就是1秒钟。

如有不对的地方,非常期待您的指正。

实验现象:

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在本次设计中,程序并没有采用原来学习书本上的汇编语言,而是采用了C51编写, 程序仿真采用流行的PROTEUS软件,和keil联合仿真,方便调试程序和修改硬件,结果证明方案的硬件设计正确,程序也符合要求。1 概述 1.1单片机认识 MCS-51单片机是Intel公司在1980年继MCS-48系列8位单片机之后推出的高档8位单片机。MCS-51单片机在性能和片内功能方面大大优于MCS-48系列单片机。 MCS-51的典型产品有:8051、8031、8751、80C51、80C31、87C51等,8051内部有4kB ROM,8751内部有4kB EPROM,8031片内无ROM。除此之外,三者的内部结构及引脚完全相同。 89S51是一种低功耗、高性能CMOS8位微控制器,具有4K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,AT89S51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 1.2 单片机的应用 单片机是应工业测控需要而产生的,最能反映其功能及形态的名称是在一个应用系统中,Single-chip Micro-controller。按照测控系统的特点和要求,单片机的应用可分为单机应用和多机应用两大类。我们这次要完成的单片机课程设计就是它的单机应用,下面在介绍一下单片机在单机应用领域内的主要内容。 (1)智能产品 单片机与传统机械产品相结合,使传统机械产品结构简化,控制智能化,购成新一代机电一体化产品。目前,利用单片机构成的智能产品已广泛应用于家用电器、办公设备、数控机床、纺织机械、工业设备等行业。 (2)智能仪表 目前,各种传感器、变送器、控制仪表已普遍采用单片机应用系统。它集测量、处理、控制功能于一体,具有各种智能化功能,如存储、数据处理、查找、判断、联网和语音等功能。 单片机构成的智能仪表,能使仪表具有数字化、智能化、多功能化、综合化、柔性化等优点,赋予测量仪表以崭新的面貌,使传统的仪器、仪表发生根本性的变革,它代表了仪器仪表的发展趋势。 (3)测控技术 ===
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良辰353

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值