找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机交通灯

[复制链接]
跳转到指定楼层
楼主
ID:349027 发表于 2018-6-10 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源程序如下
#include<reg51.h>  
//      数据类型定义  
#define u8 unsigned char  
#define u16 unsigned int  
//     数码管段选数组  
u8 code NUM[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  
u8 time_cnt=0;      
u8 turn_yellow=0;  
u8 ex   =1;  
u8 turnflag=0;  

u8 left_time;  
u8 for_time;  
//   管脚定义  
sbit left_red    = P3^0;  
sbit left_yellow = P3^1;  
sbit left_green  = P3^2;  
sbit for_red     = P3^3;  
sbit for_yellow  = P3^4;  
sbit for_green   = P3^5;  
sbit leftc=P2^7;  
sbit forc = P2^6;  
//   延时函数  
void delay_us(u16 t)  
{  
    while(t--);  
}  
//   定时器 50ms  
void Timer_Init()  
{  
    EA=1;  
    ET0=1;  
    TMOD=0x01;  
    TH0=15536/256;  
    TL0=15536%256;  
    TR0=1;  
}  
//前方向 黄灯亮  
void foryellow()  
{  
    forc=0;  
    leftc=1;  
    for_red=0;  
    for_yellow=1;  
    for_green=1;  
    left_red    = 1;  
    left_yellow = 0;  
    left_green  = 1;  
    leftc=0;  
    forc=1;  
    for_red=1;  
    for_yellow=1;  
    for_green=0;  
    left_red    = 0;  
    left_yellow = 1;  
    left_green  = 1;  
    forc=0;  
}  
// 左右方向 黄灯亮  
void leftyellow()  
{  
    forc=0;  
    leftc=1;  
    for_red=1;  
    for_yellow=1;  
    for_green=0;  
    left_red    = 0;  
    left_yellow = 1;  
    left_green  = 1;  
    leftc=0;  

    forc=1;  
    for_red=0;  
    for_yellow=1;  
    for_green=1;  
    left_red    = 1;  
    left_yellow = 0;  
    left_green  = 1;  
    forc=0;  
}  
//前方向转向  
void forturn()  
{  
    forc=0;  
    leftc=1;  
    for_red=1;  
    for_yellow=1;  
    for_green=0;  
    left_red    = 0;  
    left_yellow = 1;  
    left_green  = 1;  
    leftc=0;  

    forc=1;  
    for_red=0;  
    for_yellow=1;  
    for_green=1;  
    left_red    = 0;  
    left_yellow = 1;  
    left_green  = 1;  
    forc=0;   
}  
//左右方向转向  
void leftturn()  
{  
    forc=0;  
    leftc=1;  
    for_red=0;  
    for_yellow=1;  
    for_green=1;  
    left_red    = 0;  
    left_yellow = 1;  
    left_green  = 1;  
    leftc=0;  

    forc=1;  
    for_red=1;  
    for_yellow=1;  
    for_green=0;  
    left_red    = 0;  
    left_yellow = 1;  
    left_green  = 1;  
    forc=0;   
}  
//前进绿灯  
void forgo()  
{  
    forc=0;  
    leftc=1;  
    for_red=0;  
    for_yellow=1;  
    for_green=1;  
    left_red    = 1;  
    left_yellow = 1;  
    left_green  = 0;  
    leftc=0;  

    forc=1;  
    for_red=0;  
    for_yellow=1;  
    for_green=1;  
    left_red    = 0;  
    left_yellow = 1;  
    left_green  = 1;  
    forc=0;  
}  
//前进红灯  
void forstop()  
{  
    forc=0;  
    leftc=1;  
    for_red=0;  
    for_yellow=1;  
    for_green=1;  
    left_red    = 0;  
    left_yellow = 1;  
    left_green  = 1;  
    leftc=0;  

    forc=1;  
    for_red=0;  
    for_yellow=1;  
    for_green=1;  
    left_red    = 1;  
    left_yellow = 1;  
    left_green  = 0;  
    forc=0;  
}  
//前进方向数码管显示  
void dispfor(u8 num)  
{  
    P2|=0x0f;  
    P0=0xff;  
    P2=(P2&0xc0)|0x01;  
    P0=NUM[num/10];  
    delay_us(100);  
    P0=0xff;  
    P2|=0x0f;  
    P0=0xff;  
    P2=(P2&0xc0)|0x02;  
    P0=NUM[num%10];  
    delay_us(100);  
    P0=0xff;  
}  
//左右方向数码管显示  
void displeft(u8 num)  
{  
    P2|=0x0f;  
    P0=0xff;  
    P2=(P2&0xc0)|0x04;  
    P0=NUM[num/10];  
    delay_us(100);  
    P0=0xff;  
    P2|=0x0f;  
    P0=0xff;  
    P2=(P2&0xc0)|0x08;  
    P0=NUM[num%10];  
    delay_us(100);  
    P0=0xff;  
}  
//主函数  
void main()  
{  
    for_time=17;  
    left_time=30;  
    Timer_Init();  //初始时间  
    forgo();  
    while(1)  
    {  
        dispfor(for_time);  
        displeft(left_time);//显示  
    }  
}  

//定时器中断  
void Timer0() interrupt 1  
{  
    TR0=0;  
    time_cnt++;  
    if(time_cnt>19)  
    {  
        time_cnt=0;  
        for_time--;  
        left_time--;  
        if(for_time==0&&ex)  //时间为0  
        {     
            if(turn_yellow)    //是否变过黄灯  
            {  
                if(turnflag==0)     //是否转向  
                {  
                    for_time=10;  
                    forturn();  
                    turnflag=1;  
                }  
                else  
                {  
                    for_time=30;  
                    left_time=17;  
                    forstop();  
                    ex=0;  
                    turnflag=0;  
                    turn_yellow=0;  
                }  
            }  
            else  
            {  
                for_time=3;  
                foryellow();  
                turn_yellow=1;  
            }  
        }  

        if(left_time==0&&ex==0)  
        {     
            if(turn_yellow)    //是否变过黄灯  
            {  
                if(turnflag==0)     //是否转向  
                {  
                    left_time=10;  
                    leftturn();  
                    turnflag=1;  
                }  
                else  
                {  
                    for_time=17;  
                    left_time=30;  
                    forgo();  
                    ex=0;  
                    turnflag=0;  
                }  
            }  
            else  
            {  
                left_time=3;  
                leftyellow();  
                turn_yellow=1;  
            }  
        }  
    }  

    TH0=15536/256;  
    TL0=15536%256;  
    TR0=1;  
}  

交通灯仿真文件.zip

98.73 KB, 下载次数: 9, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:350032 发表于 2018-6-12 22:33 | 只看该作者
图怎么没有啊?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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