找回密码
 立即注册

QQ登录

只需一步,快速开始

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

c51单片机交通等程序及仿真图

[复制链接]
跳转到指定楼层
楼主
本帖最后由 xiepp333 于 2019-10-14 08:47 编辑


#include <reg51.h>                                             
#define uchar unsigned char   
#define uint unsigned int     
sbit P1_0 =P1^0; sbit P1_1 =P1^1; sbit P1_2 =P1^2; sbit P1_3 =P1^3;
sbit ew_red=P0^4;              //P0.0 东西红灯
sbit ew_yellow=P0^5;           //P0.1 东西黄灯
sbit ew_green=P0^6;            //P0.2  东西绿灯
sbit sn_red=P0^0;              //P0.3 南北红灯
sbit sn_yellow=P0^1;           //P0.4 南北黄灯
sbit sn_green=P0^2;            //P0.5 南北绿灯
sbit dongxi=P3^2;               //东西 通行
sbit nanbei= P3^3;             //南北 通行
sbit all_not=P3^4;             //P3.4为全部禁行
sbit dxjia=P3^0;   sbit dxjian=P3^1; sbit nbjia=P3^5;sbit nbjian=P3^6;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//七段码显示表
uchar a,b,c,d;                                                                     
uchar nanbei_time;            //南北通行时间
uchar dongxi_time;          //东西通行时间
uchar time_flag;               //时间标志位
uchar t_flag;            //t_flag=0时南北通行,=1时东西通行
uchar time_m;           //定义计时变量
void  nanbeitong()     //南北通行
{
              ew_red=0; ew_green=1; ew_yellow=1;               //东西红灯
              sn_red=1; sn_green=0; sn_yellow=1;               //南北绿灯
}
void  dongxitong()   //东西通行
{
              ew_red=1; ew_green=0; ew_yellow=1;              //东西绿灯
              sn_red=0; sn_green=1; sn_yellow=1;              //南北绿灯
}
void delay(uchar z)          //延时程序
{
              uchar i,j;                   //一个毫秒的延时
              for(i=z;i>0;i--)            
                            for(j=110;j>0;j--);                           
}
void display_time( )      //显示倒计时
{
              P1_0 =0;P1_1 =1;P1_2 =1;P1_3 =1;
              P2=table[a/10]; //东西十位显示
              delay(2);
              P2=0;P1_0 =1;
              P1_1 =0;      
              P2=table[b%10];//东西个位显示
              delay(2);
              P2=0;P1_1 =1;
              P1_2 =0;        
              P2=table[(c)/10];//南北十位显示
              delay(2);
              P2=0;P1_2 =1;
              P1_3 =0;        
              P2=table[(d)%10];//南北个位显示
              delay(2);
              P2=0;P1_3 =1;
}
void init0_timer0()                            //定时器0初始化
{
              TMOD=0X01;                                              //定时器0设置为模式1
              TH0=(65536-50000)/256;
              TL0=(65536-50000)%256;
              ET0=1;EA=1;TR0=1;
}
void keyscan()                                                        //键盘扫描
{
              if(nanbei==0)                                          //判断南北通行按键
              {
                            delay(2);                                   
                            if(nanbei==0)                            //防抖动
                            {
                                          nanbeitong();              //调用南北通行子程序
                                          while(!nanbei) display_time();   
                                          TR0=0;                                
                            }
              }
              if(dongxi==0)                                          //判断东西通行按键
              {
                            delay(2);                              
                            if(dongxi==0)                            //防抖动
                            {
                            dongxitong();                            //调用东西通行子程序
                            while(!dongxi) display_time();              
                            TR0=0;                                       
                            }
              }
              if(all_not==0)                                                       //判断全部禁行按键
              {
                            delay(2);                                               //延时2毫秒
                            if(all_not==0)                                          //再次全部禁行按键
                            {
                            TR0=0;                                      //进入全部禁行子程序,关闭定时器T0
                            ew_red=0; ew_green=1; ew_yellow=1; //东西红灯亮            
                            sn_red=0; sn_green=1; sn_yellow=1; //南北红灯亮           
                            }
              }
                          if(dxjia==0)                                                       //判断东西加按键
              {
                            delay(200);                                               //延时
                            if(dxjia==1)                                          //再次全部禁行按键
                            {
                                                        dongxi_time=dongxi_time+1;
                                                         time_flag=time_flag+1;
                            }
              }
                          if(dxjian==0)                                                       //判断东西减按键
              {
                            delay(200);                                               //延时
                            if(dxjian==1)                                          //再次全部禁行按键
                            {
                                                        dongxi_time=dongxi_time-1;
                                                         time_flag=time_flag-1;
                            }
              }
                          if(nbjia==0)                                                       //判断南北加按键
              {
                            delay(200);                                               //延时
                            if(nbjia==1)                                          //再次全部禁行按键
                            {
                                                        nanbei_time=nanbei_time+1;
                                                         time_flag=time_flag+1;
                            }
              }
                          if(nbjian==0)                                                       //判断南北减按键
              {
                            delay(200);                                               //延时
                            if(nbjian==1)                                          //再次全部禁行按键
                            {
                                                        nanbei_time=nanbei_time-1;
                                                         time_flag=time_flag-1;
                            }
              }

}
void main()                                                                    //主程序
{                           
              nanbei_time=24;                                                 //初始化南北通行时间
              dongxi_time=12;                                               //初始化东西通行时间
              t_flag=0;
              time_flag=nanbei_time;
              time_m =0;                                            //计时变量初始化

              init0_timer0();                                            //调用定时器T0初始化子程序
              nanbeitong();                                       //调用南北通行子程序

              while(1)
              {
              keyscan();                         //调用键盘扫描
              display_time();                   //调用显示倒计时
              }
}
void int0_isr() interrupt 1                                            //定时器T0
{
              TH0=(65536-50000)/256;
              TL0=(65536-50000)%256;
              time_m++;                                         //计时变量加1
              if(time_m>=20)                                    //判断计时变量是否大于20
              {
                            time_m=0;                           //计时变量大于20,则把计时变量清零
                            time_flag--;
                            if(t_flag==0)                                //若t_flag为0,则进入南北通行模式
                            {
                                          if(time_flag>2)
                                          {
                                          nanbeitong();                     //南北通行红绿灯
                                          a=time_flag;
                                          b=time_flag;
                                          c=time_flag-3;
                                          d=time_flag-3;
                                          }
                                          else if(time_flag>0)                 //若倒计时时间小于2秒
                                          {                                                         
                                          sn_red=1; sn_green=1; sn_yellow=0; //南北黄灯
                                          ew_red=0; ew_green=1; ew_yellow=1; //东西红灯
                                          a=time_flag;
                                          b=time_flag;
                                          c=0;
                                          d=0;
                                          }
                                          else
                                          {
                                          t_flag=1;                       //改为东西通行模式
                                          time_flag= dongxi_time;              //东西通行时间变量
                                          }                           
                            }
                            if(t_flag==1)                                             //此时为东西通行模式
                            {
                                          if(time_flag>2)                          
                                          {
                                          dongxitong();                              
                                          c=time_flag; d=time_flag;
                                          a=time_flag-3; b=time_flag-3;
                                          }
                                          else if(time_flag>0)
                                          {                                                         
                                          ew_red=1; ew_green=1; ew_yellow=0;  //东西黄灯
                                          sn_red=0; sn_green=1; sn_yellow=1;  //南北红灯
                                          c=time_flag;d=time_flag;
                                          a=0;b=0;
                                          }
                                          else
                                          {
                                          t_flag=0;                         //改为东西通行模式
                                          time_flag= nanbei_time;           //南北通行时间变量
                                          }                             
                            }                                         
              }
              else if(time_m>=10)                                                //判断计时变量是否大于10
              {            
                            if(t_flag==0)                                          //若t_flag为0,则进入南北通行模式
                            {
                                          if(time_flag>2)
                                          {
                                          nanbeitong();
                                          }
                                          else if(time_flag>0)
                                          {                                                         
                                          sn_red=1; sn_green=1; sn_yellow=1;
                                          ew_red=0; ew_green=1; ew_yellow=1; //东西红灯
                                          }
                                          else
                                          {
                                          t_flag=1;                              //此时南北通行计时结束,改为东西通行模式
                                          time_flag= dongxi_time;              //东西通行时间变量
                                          }                           
                            }
                            if(t_flag==1)                                                   //此时为东西通行模式
                            {
                                          if(time_flag>2)
                                          {
                                          dongxitong();
                                          }
                                          else if(time_flag>0)
                                          {                                                         

                                          ew_red=1; ew_green=1; ew_yellow=1;
                                          sn_red=0; sn_green=1; sn_yellow=1; //南北红灯
                                          }
                                          else
                                          {
                                          t_flag=0;                        //东西通行计时结束,改为东西通行模式
                                          time_flag= nanbei_time;              //南北通行时间变量
                                          }                             
                            }                                         
              }                                 
              }



R@JZ~1XIX[3NX(D3M1INS$U.png (142.21 KB, 下载次数: 42)

R@JZ~1XIX[3NX(D3M1INS$U.png

交通灯.zip

171.6 KB, 下载次数: 7, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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