找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)的十字路口信號(hào)燈設(shè)置 Proteus仿真代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
紅綠燈共有五個(gè)階段,直行和右轉(zhuǎn)、左轉(zhuǎn)、人行道、紅燈、黃燈。數(shù)字鍵盤按1~5可以調(diào)節(jié)相對(duì)應(yīng)階段的時(shí)間,按#和*可以暫停所所有信號(hào)燈

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. typedef unsigned char uchar;

  4. sbit X_forward = P1^0;
  5. sbit X_left = P1^1;
  6. sbit X_rignt = P1^2;
  7. sbit Y_forward = P1^3;
  8. sbit Y_left = P1^4;
  9. sbit Y_rignt = P1^5;
  10. sbit X_red = P1^6;
  11. sbit X_yellow = P1^7;
  12. sbit Y_yellow = P3^0;
  13. sbit Y_red = P3^1;
  14. sbit Y_red_people = P3^2;
  15. sbit Y_green_people = P3^3;
  16. sbit X_red_people = P3^4;
  17. sbit X_green_people = P3^5;
  18. uchar dir = 0; // x--0; y--1;
  19. uchar dat[] = {0,0};//ge,shi,y(f,l,r,s),x(f,l,r,s)   //0-s 1-f 2-l 3-r
  20. char dx[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  21. int red_sj = 5;
  22. int yellow_sj = 3;
  23. int green_sj = 5;
  24. int left_sj = 5;
  25. int right_sj = 5;
  26. int people_sj = 5;
  27. int num = 0;
  28. uchar jd = 2;
  29. int state;
  30. int cmd;
  31. char key_value[] = {
  32.         0x3d,0x73,0x75,0x76,
  33.         0x6b,0x6d,0x6e,0x5b,
  34.         0x5d,0x5e,0x3b,0x3e
  35. };


  36. void ledDisplay(){
  37.         uchar j,i;
  38.         for(j=0;j<4;j++)
  39.         {
  40.                 i = P3;
  41.                 i &= 0x3f;
  42.                 i |= ((j<<6)&0xc0);
  43.                 P3 = i;
  44.                 P0 = dx[dat[j>1?j-2:j]];
  45.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  46.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  47.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  48.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  49.                 P0 = 0x00;
  50.         }
  51. }

  52. void init(){                                         //初始化
  53.         IE = 0x02;           //允許定時(shí)器0中斷;
  54.         TMOD = 0x01;                                 //定時(shí)器0工作方式1
  55.         TH0 = 0xDF;
  56.         TL0 = 0x72;
  57.         EA = 1;                                                    //開中斷
  58. }

  59. void set_state(uchar shi,uchar ge,uchar dirY,uchar dirX,uchar x_red,uchar x_yellow,uchar y_red,uchar y_yellow,uchar x_people,uchar y_people)
  60. {
  61.         dat[1] = ge;
  62.         dat[0] = shi;
  63.         switch(dirY)
  64.         {
  65.                 case 0: Y_forward=1;Y_left=1;Y_rignt=1;break;
  66.                 case 1: Y_forward=0;Y_left=1;Y_rignt=0;break;
  67.                 case 2: Y_forward=1;Y_left=0;Y_rignt=1;break;
  68.                 case 3: Y_forward=1;Y_left=1;Y_rignt=0;break;
  69.         }
  70.         switch(dirX)
  71.         {
  72.                 case 0: X_forward=1;X_left=1;X_rignt=1;break;
  73.                 case 1: X_forward=0;X_left=1;X_rignt=0;break;
  74.                 case 2: X_forward=1;X_left=0;X_rignt=1;break;
  75.                 case 3: X_forward=1;X_left=1;X_rignt=0;break;
  76.         }
  77.         X_red = x_red;
  78.         X_yellow = x_yellow;
  79.         Y_red = y_red;
  80.         Y_yellow = y_yellow;
  81.        
  82.         switch(x_people)
  83.         {
  84.                 case 0: X_green_people = 1;X_red_people = 0;break;
  85.                 case 1: X_green_people = 0,X_red_people = 1;break;
  86.         }
  87.         switch(y_people)
  88.         {
  89.                 case 0: Y_green_people = 1;Y_red_people = 0;break;
  90.                 case 1: Y_green_people = 0,Y_red_people = 1;break;
  91.         }
  92.                
  93. }

  94. void key_chuli(int i)
  95. {
  96.         if(state==0)
  97.         {       
  98.                 cmd = i;
  99.                 state = 1;
  100.         }else if(state==1)
  101.         {
  102.                 switch(cmd)
  103.                 {
  104.                         case 1:red_sj = i;break;
  105.                         case 2:yellow_sj = i;break;
  106.                         case 3:green_sj = i;break;
  107.                         case 4:left_sj= i;break;
  108.                         case 5:right_sj= i;break;
  109.                         case 6:people_sj= i;break;
  110.                 }
  111.                 state = 2;
  112.         }else if(state==2)
  113.         {
  114.                 switch(cmd)
  115.                 {
  116.                         case 1:red_sj *= 10; red_sj += i;break;
  117.                         case 2:yellow_sj *= 10; yellow_sj += i;;break;
  118.                         case 3:green_sj *= 10; green_sj += i;;break;
  119.                         case 4:left_sj *= 10; left_sj += i;;break;
  120.                         case 5:right_sj *= 10; right_sj += i;;break;
  121.                         case 6:people_sj *= 10; people_sj += i;;break;
  122.                 }
  123.                 state = 0;
  124.         }
  125. }

  126. void key_san(void)
  127. {
  128.         int i;
  129.         char wz;
  130.         P2 = 0x07;
  131.         if(P2!=0x07){
  132.                 _nop_();
  133.                 if(P2!=0x07){
  134.                         wz = P2;
  135.                         P2 = 0x78;
  136.                         wz |= (P2&0x78);
  137.                         for(i=0;i<12;i++){
  138.                                 if(key_value[i]==wz){
  139.                                         if(i>9)
  140.                                         {
  141.                                                 set_state(0,0,0,0,0,1,0,1,0,0);
  142.                                                 TR0 = 0;
  143.                                                 while(1)
  144.                                                 {
  145.                                                         ledDisplay();
  146.                                                 }
  147.                                         }else
  148.                                         {
  149.                                                 key_chuli(i);
  150.                                                 P2 = 0x07;
  151.                                                 while(P2!=0x07);
  152.                                         }
  153.                                 }
  154.                         }
  155.                 }
  156.         }
  157. }

  158. void main(void)
  159. {
  160.         init();
  161.         TR0 = 1;
  162.         while(1)
  163.         {
  164.                 key_san();
  165.                 ledDisplay();
  166.         }
  167. }

  168. void chuli(void)
  169. {
  170.         if(dir)
  171.         {
  172.                 switch(jd)
  173.                 {
  174.                         case 1:set_state((red_sj/10)%10,red_sj%10,0,0,0,1,0,1,0,0);break;
  175.                         case 2:set_state((yellow_sj/10)%10,yellow_sj%10,0,0,0,1,1,0,0,0);break;
  176.                         case 3:set_state((green_sj/10)%10,green_sj%10,1,0,0,1,1,1,0,0);break;
  177.                         case 4:set_state((left_sj/10)%10,left_sj%10,2,0,0,1,1,1,0,0);break;
  178.                         case 5:set_state((people_sj/10)%10,people_sj%10,0,0,1,1,1,1,0,1);break;
  179.                 }
  180.         }else
  181.         {//   shi,   ge,   dirY,   dirX,   x_red,   x_yellow,   y_red,   y_yellow,   x_people,   y_people
  182.                 switch(jd)
  183.                 {
  184.                         case 1:set_state((red_sj/10)%10,red_sj%10,0,0,0,1,0,1,0,0);break;
  185.                         case 2:set_state((yellow_sj/10)%10,yellow_sj%10,0,0,1,0,0,1,0,0);break;
  186.                         case 3:set_state((green_sj/10)%10,green_sj%10,0,1,1,1,0,1,0,0);break;
  187.                         case 4:set_state((left_sj/10)%10,left_sj%10,0,2,1,1,0,1,0,0);break;
  188.                         case 5:set_state((people_sj/10)%10,people_sj%10,0,0,1,1,0,1,1,0);break;
  189.                 }
  190.         }
  191.        
  192. }

  193. void time_chuli(void)
  194. {
  195.         if(dat[0]==0&dat[1]==0)
  196.         {
  197. ……………………

  198. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
紅綠燈 - 副本 - 副本 (2).rar (234.65 KB, 下載次數(shù): 13)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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