久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3515|回復: 3
收起左側

單片機交通燈 用lcd1602顯示 帶proteus仿真和源程序

[復制鏈接]
ID:140725 發表于 2016-10-23 19:39 | 顯示全部樓層 |閱讀模式
給大家分享一個用lcd1602顯示的交通燈,下面是仿真原理圖:
0.png 0.png
proteus仿真工程文件和程序源碼下載:
交通燈.rar (102.65 KB, 下載次數: 60)

單片機源程序(部分預覽):

  1. #include<reg51.h>        
  2. #include"lcd.h"


  3. #define NORMAL_MODE        0                           //正常運行模式
  4. #define NIGHT_MODE        3                           //夜間模式
  5. #define URGENCY_MODE        6        //緊急模式
  6. #define NORMAL_MODE_STEP1 0
  7. #define NORMAL_MODE_STEP2 1
  8. #define NORMAL_MODE_STEP3 2
  9. #define NORMAL_MODE_STEP4 3



  10. sbit BUT1=P1^0;
  11. sbit BUT2=P1^1;
  12. sbit BUT3=P1^3;



  13. sbit LED_EW_RED = P2^0;                   //東西紅燈
  14. sbit LED_EW_GREEN = P2^2;           //東西綠燈
  15. sbit LED_EW_YELLOW = P2^1;           //東西黃燈
  16. sbit LED_SN_RED = P2^3;                   //南北紅燈
  17. sbit LED_SN_GREEN = P2^5;           //南北綠燈
  18. sbit LED_SN_YELLOW = P2^4;           //南北黃燈

  19. unsigned char WorkMode = 0;
  20. unsigned char DisplayTime = 0;
  21. unsigned char DisplayTime1 = 4;                        //黃燈顯示時間
  22. unsigned char SD_DisplayTime = 0;                //紅綠燈顯示時間
  23. unsigned char NormalModeStep = 0;
  24. unsigned char fag=0,k=0;


  25. unsigned char djs1[]="Daojishi:";
  26. unsigned char djs2[]="SN-Daojishi:";
  27. int a=0;


  28. void Delay1ms(uint y);
  29. void InitTimer0(void);
  30. void LcdDisplay1(int a);
  31. void Work_Night_Mode();
  32. void Work_NORMAL_Mode();
  33. void Work_Urgency_Mode();
  34. void SetBtn_Check_Work(void);
  35. void delay10ms(unsigned char num);




  36. /*******************************************************************************
  37. * 函 數 名         : main
  38. * 函數功能                   : 主函數
  39. * 輸    入         : 無
  40. * 輸    出         : 無
  41. *******************************************************************************/
  42. void main(void)
  43. {  
  44.         unsigned char i;
  45.         LcdInit();
  46.         for(i=0;i<9;i++)
  47.         {
  48.                 LcdWriteData(djs1[i]);        
  49.         }

  50.         
  51.         InitTimer0();
  52.         SD_DisplayTime = 15;
  53.         DisplayTime = SD_DisplayTime;
  54.         WorkMode = NORMAL_MODE;
  55.         NormalModeStep=NORMAL_MODE_STEP1;
  56.                                                 

  57.         
  58.         
  59. while(1)
  60. {                                                                                
  61.         switch(WorkMode)                                                                 //工作模式判斷
  62.                 {
  63.                         case NORMAL_MODE:          //正常模式
  64.                                 Work_NORMAL_Mode();
  65.                                 break;
  66.                         
  67.                         case NIGHT_MODE:        //夜間模式
  68.                                 Work_Night_Mode();
  69.                                 break;
  70.                         
  71.                         case URGENCY_MODE:         //緊急模式
  72.                                 Work_Urgency_Mode();
  73.                                 break;
  74.                 }
  75.         SetBtn_Check_Work();
  76.         LcdDisplay1(DisplayTime);
  77.                                                                   


  78. }                                       
  79.                                        
  80. }

  81. void Work_NORMAL_Mode()                                //正常工作模式
  82. {
  83. switch(NormalModeStep)                          //工作步段判斷
  84.         {
  85.                 case NORMAL_MODE_STEP1:                //步段1, 南北綠燈,東西紅燈
  86.                         LED_SN_RED = 0;                   //南北紅燈滅
  87.                         LED_SN_GREEN = 1;           //南北綠燈亮
  88.                         LED_SN_YELLOW = 0;           //南北黃燈滅
  89.                         LED_EW_RED = 1;                   //東西紅燈亮
  90.                         LED_EW_GREEN = 0;           //東西綠燈滅
  91.                         LED_EW_YELLOW = 0;           //東西黃燈滅
  92.                         if(DisplayTime ==0 )           //如果通行時間走完,即等于0
  93.                         {
  94.                                 NormalModeStep = NORMAL_MODE_STEP2;                 //設置工作步段為步段2,南北黃燈,東西紅燈
  95.                                 DisplayTime = DisplayTime1;                                        //南北增減s黃燈時間
  96.                         }        
  97.                         break;
  98.                 case NORMAL_MODE_STEP2:                //步段2, 南北黃燈,東西紅燈
  99.                         LED_SN_RED = 0;                        //南北紅燈滅
  100.                         LED_SN_GREEN = 0;                //南北綠燈滅
  101.                         LED_SN_YELLOW = 1;                //南北黃燈亮
  102.                         LED_EW_RED = 1;                        //東西紅燈亮
  103.                         LED_EW_GREEN = 0;                //東西綠燈滅
  104.                         LED_EW_YELLOW = 0;                //東西黃燈滅
  105.                         if(DisplayTime == 0)                //如果通行時間走完,即等于0
  106.                         {
  107.                                 NormalModeStep = NORMAL_MODE_STEP3;           //設置工作步段為步段3,南北紅燈,東西綠燈
  108.                                 DisplayTime = SD_DisplayTime;                 //南北加5s黃燈時間
  109.                         }        
  110.                         break;
  111.                 case NORMAL_MODE_STEP3:                   //步段3, 南北紅燈,東西綠燈
  112.                         LED_SN_RED = 1;                          //南北紅燈亮
  113.                         LED_SN_GREEN = 0;                  //南北綠燈滅
  114.                         LED_SN_YELLOW = 0;                  //南北黃燈滅
  115.                         LED_EW_RED = 0;                          //東西紅燈滅
  116.                         LED_EW_GREEN = 1;                  //東西綠燈亮
  117.                         LED_EW_YELLOW = 0;                  //東西黃燈滅
  118.                         if(DisplayTime == 0)                        //如果通行時間走完,即等于0
  119.                         {
  120.                                 NormalModeStep = NORMAL_MODE_STEP4;          //設置工作步段為步段4,南北紅燈,東西黃燈
  121.                                 DisplayTime = DisplayTime1;                                          //東西增減若干s黃燈時間
  122.                         }        
  123.                         break;
  124.                 case NORMAL_MODE_STEP4:                        //步段4, 南北紅燈,東西黃燈
  125.                         LED_SN_RED = 1;                          //南北紅燈亮
  126.                         LED_SN_GREEN = 0;                  //南北綠燈滅
  127.                         LED_SN_YELLOW = 0;                  //南北黃燈滅
  128.                         LED_EW_RED = 0;                          //東西紅燈滅
  129.                         LED_EW_GREEN = 0;                  //東西綠燈滅
  130.                         LED_EW_YELLOW = 1;                  //東西黃燈亮
  131.                         if(DisplayTime == 0)                           //如果通行時間走完,即等于0
  132.                         {
  133.                                 NormalModeStep = NORMAL_MODE_STEP1;         //設置工作步段為步段1,南北綠燈,東西紅燈
  134.                                 DisplayTime = SD_DisplayTime;         //南北同行時間重賦值
  135.                         }        
  136.                         break;
  137.         }
  138. }

  139. void Work_Urgency_Mode()          //緊急模式
  140. {
  141.         LED_SN_RED = 1;                        //南北紅燈亮
  142.         LED_SN_GREEN = 0;                //南北綠燈滅
  143.         LED_SN_YELLOW = 0;                //南北黃燈滅
  144.         LED_EW_RED = 1;                        //東西紅燈亮
  145.         LED_EW_GREEN = 0;                //東西綠燈滅
  146.         LED_EW_YELLOW = 0;                //東西黃燈滅
  147.         DisplayTime =SD_DisplayTime;                   //南北顯示時間為0xff,在顯示函數里判斷時間為0xff時不做顯示,會顯示“-”
  148. }


  149. void Work_Night_Mode()                //夜間模式
  150. {
  151.         LED_SN_RED = 0;                 //南北紅燈滅
  152.         LED_SN_GREEN = 0;         //南北綠燈滅
  153.         LED_SN_YELLOW = 1;         //南北黃燈亮
  154.         LED_EW_RED = 0;                 //東西紅燈滅
  155.         LED_EW_GREEN = 0;         //東西綠燈滅
  156.         LED_EW_YELLOW = 1;         //東西黃燈亮
  157.     DisplayTime = DisplayTime1;                 //南北顯示時間為0xff,在顯示函數里判斷時間為0xff時不做顯示,會顯示“-”
  158. }


  159. void SetBtn_Check_Work(void)           //設置按鍵檢測函數
  160. {
  161.         
  162.     if(BUT1 == 0)                  //設置鍵按下 ,夜間模式 ,緊急模式 ,恢復正常模式
  163.         {
  164.                 delay10ms(5);                  //50ms去抖
  165.                 fag=0;
  166.                 while(fag==0)
  167.                 {  while(BUT1==0)
  168.                    { fag=1;
  169.                    }
  170.                    k++;
  171.                 }
  172.                 if(k%3 == 1)
  173.                 {
  174.                  TR0 = 0;                                   //計時器停止
  175.                  WorkMode = NIGHT_MODE;           //夜間模式
  176.                   DisplayTime=DisplayTime1;
  177.                 }
  178.                 else if(k%3==2)
  179.                 {
  180.                  TR0 = 0;                                   //計時器停止
  181.                  WorkMode = URGENCY_MODE;  //緊急模式
  182.                  DisplayTime = SD_DisplayTime;
  183.                 }
  184.                 else
  185.                 { TR0 = 1;
  186.                   DisplayTime = SD_DisplayTime;
  187.                   WorkMode = NORMAL_MODE;
  188.                
  189.                 }
  190.                                 
  191.         }
  192.         

  193.          else if(BUT2 == 0)                  //設置鍵按下 ,燈的時間加一  控制
  194.         {
  195.                 delay10ms(10);                  //50ms去抖
  196.                 if(BUT2 == 0)
  197.                 {
  198.                  TR0 = 0;
  199.                  if(k%3==2)                                   //紅燈時間加一
  200.                  { SD_DisplayTime = SD_DisplayTime+1;
  201.                    DisplayTime = SD_DisplayTime;
  202.                    delay10ms(10);
  203.                    //WorkMode = URGENCY_MODE;
  204.                  }
  205.                  else if(k%3==1)  //黃燈時間加一
  206.                  {
  207.                   DisplayTime1=DisplayTime1+1;
  208.                   DisplayTime=DisplayTime1;
  209.                   delay10ms(10);                                    
  210.                  // WorkMode = NIGHT_MODE;
  211.                   }        
  212.                 }               
  213.         }
  214.          else if(BUT3 == 0)                  //設置鍵按下, 燈的時間減控制
  215.         {
  216.                 delay10ms(5);                  //50ms去抖
  217.                 if(BUT3 == 0)
  218.                 {
  219.                  TR0 = 0;
  220.                  if(k%3==2)                                   
  221.                  {SD_DisplayTime = SD_DisplayTime-1; //按鍵使紅燈時間減一
  222.                   DisplayTime = SD_DisplayTime;
  223.                   
  224.                   WorkMode = URGENCY_MODE;
  225.                  }
  226.                  else if(k%3==1)
  227.                  {
  228.                   DisplayTime1=DisplayTime1-1; //按鍵使黃燈時間減一
  229.                   DisplayTime=DisplayTime1;        
  230.                                              
  231.                   WorkMode = NIGHT_MODE;
  232.                   }        
  233.                         
  234.                 }               
  235.         }
  236.         
  237.         
  238.         

  239. }


  240. void LcdDisplay1(int a)          //lcd顯示
  241. {

  242.          LcdWriteCom(0x8A);                 
  243.          LcdWriteData('0'+a/10);
  244.          LcdWriteCom(0x8B);                  
  245.          LcdWriteData('0'+a%10);        

  246. }


  247. void InitTimer0(void)                   //初始化定時器0
  248. {
  249.     TMOD = 0x01;                         //模式1
  250.     TH0 = 0x3C;                                 //定時器裝載值
  251.     TL0 = 0xB0;
  252.     EA = 1;                                         //使能總中斷
  253.     ET0 = 1;                                 //使能定時器0中斷
  254.     TR0 = 1;                                 //啟動定時器0
  255. }
  256. void Timer0Interrupt(void) interrupt 1                 //定時器0中斷處理函數
  257. {
  258.         static unsigned char TimeOutNum = 0;        

  259.     TH0 = 0x3C;                                                                //重新裝載值
  260.     TL0 = 0xB0;
  261.         TimeOutNum++;                                                //中斷次數++, 即50ms的次數
  262.         if(TimeOutNum>=20)                        //達到50ms * 20 = 1s條件
  263.         {
  264.                 TimeOutNum = 0;                                         //中斷次數清0
  265.                 DisplayTime--;                                 //南北顯示時間-1
  266.         }
  267. }

  268. void Delay1ms(uint y)
  269. {
  270.         uint x;
  271.         for( ; y>0; y--)
  272.         {
  273.                 for(x=110; x>0; x--);
  274.         }
  275. }

  276. void delay10ms(unsigned char num)   //誤差 0us
  277. {
  278.     unsigned char i,a,b,c;
  279.         for(i=0;i<num;i++)
  280.             for(c=5;c>0;c--)
  281.                 for(b=4;b>0;b--)
  282.                     for(a=248;a>0;a--);
  283. }
復制代碼



回復

使用道具 舉報

ID:143367 發表于 2016-10-24 09:03 | 顯示全部樓層
感謝樓主分享,謝謝
回復

使用道具 舉報

ID:147898 發表于 2016-11-14 21:33 | 顯示全部樓層
很不錯,很有用。
回復

使用道具 舉報

ID:273764 發表于 2018-1-9 14:20 | 顯示全部樓層
為什么我這個顯示不出來
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲福利av| 在线婷婷| 久久免费精品视频 | 一区二区三区四区在线视频 | 蜜桃久久 | 精品欧美一区二区三区久久久 | 亚洲色视频 | 99视频免费看 | 国产精品一区在线观看你懂的 | 99re国产精品| 喷潮网站 | 国产a区| 婷婷五月色综合 | 久久一级 | 亚洲精品99久久久久久 | 久久中文免费视频 | 天天看天天操 | 亚洲一视频 | 色综合久久久 | 亚洲国产一区二区三区在线观看 | pacopacomama在线 | 成人小视频在线观看 | 国产在线视频一区二区 | 福利一区二区 | 欧美日韩一区二区在线播放 | 国产精品久久久久久久久久妇女 | 不卡一区 | 国产日韩欧美一区 | 色播久久久 | 日本一区二区三区四区 | 国产精品久久一区二区三区 | 成年人在线观看视频 | 亚洲精品一二区 | 中文字幕精品一区久久久久 | 精品国产色 | 国内精品久久久久久 | 国产高清在线精品一区二区三区 | 涩涩视频在线观看 | 韩日一区二区 | 在线免费黄色小视频 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 |