找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1519|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

c51單片機(jī)交通等程序及仿真圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:620389 發(fā)表于 2019-10-14 08:44 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 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;            //南北通行時(shí)間
uchar dongxi_time;          //東西通行時(shí)間
uchar time_flag;               //時(shí)間標(biāo)志位
uchar t_flag;            //t_flag=0時(shí)南北通行,=1時(shí)東西通行
uchar time_m;           //定義計(jì)時(shí)變量
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)          //延時(shí)程序
{
              uchar i,j;                   //一個(gè)毫秒的延時(shí)
              for(i=z;i>0;i--)            
                            for(j=110;j>0;j--);                           
}
void display_time( )      //顯示倒計(jì)時(shí)
{
              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];//東西個(gè)位顯示
              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];//南北個(gè)位顯示
              delay(2);
              P2=0;P1_3 =1;
}
void init0_timer0()                            //定時(shí)器0初始化
{
              TMOD=0X01;                                              //定時(shí)器0設(shè)置為模式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();              //調(diào)用南北通行子程序
                                          while(!nanbei) display_time();   
                                          TR0=0;                                
                            }
              }
              if(dongxi==0)                                          //判斷東西通行按鍵
              {
                            delay(2);                              
                            if(dongxi==0)                            //防抖動
                            {
                            dongxitong();                            //調(diào)用東西通行子程序
                            while(!dongxi) display_time();              
                            TR0=0;                                       
                            }
              }
              if(all_not==0)                                                       //判斷全部禁行按鍵
              {
                            delay(2);                                               //延時(shí)2毫秒
                            if(all_not==0)                                          //再次全部禁行按鍵
                            {
                            TR0=0;                                      //進(jìn)入全部禁行子程序,關(guān)閉定時(shí)器T0
                            ew_red=0; ew_green=1; ew_yellow=1; //東西紅燈亮            
                            sn_red=0; sn_green=1; sn_yellow=1; //南北紅燈亮           
                            }
              }
                          if(dxjia==0)                                                       //判斷東西加按鍵
              {
                            delay(200);                                               //延時(shí)
                            if(dxjia==1)                                          //再次全部禁行按鍵
                            {
                                                        dongxi_time=dongxi_time+1;
                                                         time_flag=time_flag+1;
                            }
              }
                          if(dxjian==0)                                                       //判斷東西減按鍵
              {
                            delay(200);                                               //延時(shí)
                            if(dxjian==1)                                          //再次全部禁行按鍵
                            {
                                                        dongxi_time=dongxi_time-1;
                                                         time_flag=time_flag-1;
                            }
              }
                          if(nbjia==0)                                                       //判斷南北加按鍵
              {
                            delay(200);                                               //延時(shí)
                            if(nbjia==1)                                          //再次全部禁行按鍵
                            {
                                                        nanbei_time=nanbei_time+1;
                                                         time_flag=time_flag+1;
                            }
              }
                          if(nbjian==0)                                                       //判斷南北減按鍵
              {
                            delay(200);                                               //延時(shí)
                            if(nbjian==1)                                          //再次全部禁行按鍵
                            {
                                                        nanbei_time=nanbei_time-1;
                                                         time_flag=time_flag-1;
                            }
              }

}
void main()                                                                    //主程序
{                           
              nanbei_time=24;                                                 //初始化南北通行時(shí)間
              dongxi_time=12;                                               //初始化東西通行時(shí)間
              t_flag=0;
              time_flag=nanbei_time;
              time_m =0;                                            //計(jì)時(shí)變量初始化

              init0_timer0();                                            //調(diào)用定時(shí)器T0初始化子程序
              nanbeitong();                                       //調(diào)用南北通行子程序

              while(1)
              {
              keyscan();                         //調(diào)用鍵盤掃描
              display_time();                   //調(diào)用顯示倒計(jì)時(shí)
              }
}
void int0_isr() interrupt 1                                            //定時(shí)器T0
{
              TH0=(65536-50000)/256;
              TL0=(65536-50000)%256;
              time_m++;                                         //計(jì)時(shí)變量加1
              if(time_m>=20)                                    //判斷計(jì)時(shí)變量是否大于20
              {
                            time_m=0;                           //計(jì)時(shí)變量大于20,則把計(jì)時(shí)變量清零
                            time_flag--;
                            if(t_flag==0)                                //若t_flag為0,則進(jìn)入南北通行模式
                            {
                                          if(time_flag>2)
                                          {
                                          nanbeitong();                     //南北通行紅綠燈
                                          a=time_flag;
                                          b=time_flag;
                                          c=time_flag-3;
                                          d=time_flag-3;
                                          }
                                          else if(time_flag>0)                 //若倒計(jì)時(shí)時(shí)間小于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;              //東西通行時(shí)間變量
                                          }                           
                            }
                            if(t_flag==1)                                             //此時(shí)為東西通行模式
                            {
                                          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;           //南北通行時(shí)間變量
                                          }                             
                            }                                         
              }
              else if(time_m>=10)                                                //判斷計(jì)時(shí)變量是否大于10
              {            
                            if(t_flag==0)                                          //若t_flag為0,則進(jìn)入南北通行模式
                            {
                                          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;                              //此時(shí)南北通行計(jì)時(shí)結(jié)束,改為東西通行模式
                                          time_flag= dongxi_time;              //東西通行時(shí)間變量
                                          }                           
                            }
                            if(t_flag==1)                                                   //此時(shí)為東西通行模式
                            {
                                          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;                        //東西通行計(jì)時(shí)結(jié)束,改為東西通行模式
                                          time_flag= nanbei_time;              //南北通行時(shí)間變量
                                          }                             
                            }                                         
              }                                 
              }



R@JZ~1XIX[3NX(D3M1INS$U.png (142.21 KB, 下載次數(shù): 42)

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

交通燈.zip

171.6 KB, 下載次數(shù): 7, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表