找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1459|回复: 0
打印 上一主题 下一主题
收起左侧

数显交通灯

[复制链接]
跳转到指定楼层
楼主
ID:308662 发表于 2018-4-15 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <INTRINS.H>
unsigned char count;                //中断次数计数
unsigned char s;                        //状态变量
unsigned char sn,ew;                //倒计时变量
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
                                                        //0~9十个数字和共阳型段码
sbit r1=P1^0;                                //两个方向的红黄绿灯
sbit y1=P1^1;
sbit g1=P1^2;
sbit r2=P1^5;
sbit y2=P1^4;
sbit g2=P1^3;
void delay(unsigned int j)
{
        while(j--);
}
display()
{
        unsigned char i,wk=0x01;//wk变量作位控,初始选通右边第1位
        unsigned char buf[4];        //声明数码管显示字形缓冲数组
        buf[0]=seg[sn%10];                //南北方向计时变量
        buf[1]=seg[sn/10%10];
        buf[2]=seg[ew%10];
        buf[3]=seg[ew/10%10];
        for (i=0;i<4;i++)
        {
                P3=wk;                                //输出位控               
                P0=buf[i];                        //依次输出段码
                delay(50);                        //延时
                wk=_crol_(wk,1);        //位控左移一位
                P0=0xff;                        //熄灭所有数码管(消隐)
        }
}
int main()
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        EA=1;
        ET0=1;
        TR0=1;
        sn=40;
        ew=45;
        while(1)
        {
                display();
                switch(s)
                {
                         case 0:                                //状态一
                                r1=1;y1=1;g1=0;
                                r2=0;y2=1;g2=1;
                                if(sn==255)                //字符型数据0减1等255
                                {
                                         sn=4;
                                        s=1;
                                }
                                break;
                         case 1:                                //状态二
                                r1=1;y1=0;g1=1;
                                r2=0;y2=1;g2=1;
                                if(sn==255)
                                {
                                         sn=35;
                                        ew=30;
                                        s=2;
                                }
                                break;
                         case 2:                                //状态三
                                r1=0;y1=1;g1=1;
                                r2=1;y2=1;g2=0;
                                if(ew==255)
                                {
                                         ew=4;
                                        s=3;
                                }
                                break;
                         case 3:                                //状态四
                                r1=0;y1=1;g1=1;
                                r2=1;y2=0;g2=1;
                                if(ew==255)
                                {
                                         sn=40;
                                        ew=45;
                                        s=0;
                                }
                                break;
                }
        }
}
void timer0() interrupt 1
{
        TH0=0x3c;
        TL0=0xb0;
        count++;
        if(count==20)                                //1秒定时
        {
                 count=0;
                sn--;
                ew--;
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表