找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机十字路口交通灯

[复制链接]
跳转到指定楼层
楼主


/***********************************************************
       十字路口交通灯控制 C 程序
***********************************************************/
#include
#define   uchar  unsigned char
#define   uint   unsigned int
/*****定义控制位*******************************************/
sbit  Time_Show_LED2=P2^5; //Time_Show_LED2(直行时间显示)控制位
sbit  Time_Show_LED1=P2^4; //Time_Show_LED1(直行时间显示)控制位
sbit   EW_LED2=P2^3;     //EW_LED2控制位
sbit   EW_LED1=P2^2;     //EW_LED1控制位
sbit   SN_LED2=P2^1;     //SN_LED2控制位
sbit   SN_LED1=P2^0;     //SN_LED1控制位
sbit  SN_Yellow=P1^6;       //SN黄灯
sbit  EW_Yellow=P1^2;       //EW黄灯
sbit  EW_ManGreen=P3^0;     //EW人行道绿灯
sbit   SN_ManGreen=P3^1;     //SN人行道绿灯
sbit  Special_LED=P2^6;     //交通特殊指示灯
sbit  Busy_LED=P2^7;        //交通繁忙指示灯
sbit  Nomor_Button=P3^5;    //交通正常按键
sbit  Busy_Btton=P3^6;      //交通繁忙按键
sbit  Special_Btton=P3^7;   //交通特殊按键  
sbit  EW_ManRed=P3^3;       //EW人行道红灯
sbit  SN_ManRed=P3^4;       //SN人行道红灯
bit   Flag_SN_Yellow;      //SN黄灯标志位
bit   Flag_EW_Yellow;       //EW黄灯标志位
char   Time_EW;        //东西方向倒计时单元
char   Time_SN;        //南北方向倒计时单元
uchar EW=60,SN=40,EWL=19,SNL=19;      //程序初始化赋值,正常模式
uchar  EW1=60,SN1=40,EWL1=19,SNL1=19;  //用于存放修改值的变量
uchar codetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //0-9段选码
uchar code S[8]={0x28,0x48,0x18,0x48,0x82,0x84,0x81,0x84};  
//交通信号灯控制代码
/**********************延时子程序**************************/
void Delay(uchar a)
{
   uchar  i;
   i=a;
   while(i--){;}
}

/*****************显示子函数******************************/
void Display(void)
{
   uchar h,l;
   h=Time_EW/10;
   l=Time_EW%10;
   P0=table[l];        
   EW_LED2=1;       //点亮EW_LED2
   Delay(2);
   EW_LED2=0;        //熄灭EW_LED2
   P0=table[h];
   EW_LED1=1;        //点亮EW_LED1
   Delay(2);
   EW_LED1=0;

   h=Time_SN/10;
   l=Time_SN%10;
   P0=table[l];
   SN_LED2=1;        //点亮SN_LED2
   Delay(2);
   SN_LED2=0;
   P0=table[h];
   SN_LED1=1;      //点亮SN_LED1
   Delay(2);
   SN_LED1=0;

   h= EW1/10;
   l= EW1%10;
   P0=table[l];
   Time_Show_LED1=1;  //点亮Time_Show_LED1
   Delay(2);
   Time_Show_LED1=0;
   P0=table[h];
   Time_Show_LED2=1; //点亮Time_Show_LED2
   Delay(2);
   Time_Show_LED2=0;
}
/**********************外部0中断服务程序******************/

void INT0_srv(void)interrupt 0 using 1
{
    EX0=0;               //关中断

    if(Nomor_Button==0)//测试按键是否按下,按下为正常状态
    {
EW1=60;
SN1=40;
EWL1=19;
SNL1=19;
Busy_LED=0;     //关繁忙信号灯
Special_LED =0; //关特殊信号灯
    }
   if(Busy_Btton==0)   //测试按键是否按下,按下为繁忙状态
    {
EW1=45;
SN1=30;
EWL1=14;
SNL1=14;
Special_LED=0;  //关特殊信号灯
Busy_LED=1;     //开繁忙信号灯

    }
   if(Special_Btton==0)//测试按键是否按下,按下为特殊状态
    {
EW1=75;
SN1=55;
EWL1=19;
SNL1=19;
Busy_LED=0;    //关繁忙信号灯
Special_LED =1;//开特殊信号灯
    }               
       EX0=1;         //开中断
}
/**********************T0中断服务程序*******************/
void timer0(void)interrupt 1 using 1
{
   static uchar count;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   count++;

   if(count==10)
   {
       if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
           {SN_Yellow=~SN_Yellow;}
       if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
           {EW_Yellow=~EW_Yellow;}
   }
   if(count==20)
   {
       Time_EW--;
       Time_SN--;
       if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
           {SN_Yellow=~SN_Yellow;}
       if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
           {EW_Yellow=~EW_Yellow;}
       count=0;
   }
}
/*********************主程序开始***********************/
void   main(void)
{
Busy_LED=0;
Special_LED=0;
IT0=1;       //INT0负跳变触发
TMOD=0x01; //定时器工作于方式1
TH0=(65536-50000)/256; //定时器赋初值
TL0=(65536-50000)%256;
EA=1; //CPU开中断总允许
ET0=1; //开定时中断
EX0=1; //开外部INTO中断
TR0=1; //启动定时

    while(1)
    {            
        /*******S0状态**********/
SN_ManRed=0;
SN_ManGreen=1;  //SN人行道通行
EW_ManRed=1;  //EW人行道禁止
EW_ManGreen=0;
Flag_EW_Yellow=0;      //EW关黄灯显示信号
Time_EW=EW;
Time_SN=SN;
while(Time_SN>=5)
       {   
           P1=S[0];  //SN绿灯,EW红灯
           Display();
       }

       /*******S1状态**********/
       P1=0x00;
       while(Time_SN>=0)
       {
Flag_SN_Yellow=1; //SN开黄灯信号位
P1=P1|0x08;    //保持EW红灯
Display();
       }

       /*******S2状态**********/
SN_ManRed=1;      //SN人行道禁止
SN_ManGreen=0;
EW_ManRed=1;    //EW人行道禁止
EW_ManGreen=0;
Flag_SN_Yellow=0; //SN关黄灯显示信号
Time_SN=SNL;
while(Time_SN>=5)
       {
P1=S[2];      //SN左拐绿灯亮,EW红灯
Display();
       }

       /*******S3状态**********/
       P1=0x00;
       while(Time_SN>=0)
       {
Flag_SN_Yellow=1;    //SN开黄灯信号位
P1=P1|0x08;    //保持EW红灯
Display();
       }

       /***********赋值*********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
       /*******S4状态**********/
SN_ManRed=1;      //SN人行道禁止
SN_ManGreen=0;
EW_ManRed=0;
EW_ManGreen=1;     //EW人行道通行
Flag_SN_Yellow=0; //SN关黄灯显示信号
Time_EW=SN;
Time_SN=EW;
while(Time_EW>=5)
       {
           P1=S[4];    //EW通行,SN红灯
          Display();
       }

       /*******S5状态**********/
       P1=0X00;
       while(Time_EW>=0)
       {
Flag_EW_Yellow=1;//EW开黄灯信号位
P1=P1|0x80;    //保持SN红灯
Display();
       }

       /*******S6状态**********/
SN_ManRed=1;     //SN人行道禁止
SN_ManGreen=0;
EW_ManRed=1;   //EW人行道禁止
EW_ManGreen=0;
Flag_EW_Yellow=0;//EW关黄灯显示信号
Time_EW=EWL;
while(Time_EW>=5)
       {
P1=S[6];     //EW左拐绿灯亮,SN红灯
Display();
       }

       /*******S7状态**********/
       P1=0X00;
       while(Time_EW>=0)
       {
Flag_EW_Yellow=1; //EN开黄灯信号位
P1=P1|0x80;    //保持SN红灯
Display();
       }

       /***********赋值********/
       EW=EW1;
       SN=SN1;
       EWL=EWL1;
       SNL=SNL1;
   }
}


评分

参与人数 2黑币 +25 收起 理由
夜辰南 + 5 回帖助人的奖励!
admin + 20 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:165640 发表于 2017-3-16 19:41 | 只看该作者
这图画的6
回复

使用道具 举报

板凳
ID:169827 发表于 2017-3-17 11:20 | 只看该作者
老哥,有没有代码加proteus仿真的打包呀,十分感谢
回复

使用道具 举报

地板
ID:199133 发表于 2017-5-10 16:05 | 只看该作者
很有用,谢谢坐着了
回复

使用道具 举报

5#
ID:200060 发表于 2017-5-13 19:06 | 只看该作者
是用8255做的吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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