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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3444|回復: 0
收起左側

紅綠燈系統 無線傳輸道路信息及交通擁堵情況 12864顯示

[復制鏈接]
ID:136393 發表于 2017-5-16 10:12 | 顯示全部樓層 |閱讀模式
這個是本人做的一個紅綠燈系統,由12864顯示,有無線傳輸兩個道路的信息以及交通擁堵情況。
0.png

單片機發送源程序如下:
  1. //簡介:第一行顯示,距離時間
  2. //
  3. //第二行顯示,還剩
  4. //
  5. //第三行顯示,00時,00分,00秒
  6. //
  7. //第四行顯示,             周林
  8. //
  9. //
  10. //
  11. //按下旋鈕開關,開始設定秒,秒編輯位閃動。左右旋轉設定數值,
  12. //
  13. //在按下開關,秒確定,設定分,分編輯位閃動左右調數值,
  14. //
  15. //再按下,分確定,小時位閃動。左右轉調小時,再按一下。時間確定,開始倒計時。到達定
  16. //
  17. //時時間后停止,并閃動。



  18. #include <reg52.h>
  19. #include <intrins.h>



  20. /********************* 定義 ********************************/

  21. #define LCD_data  P0       //數據口

  22. sbit LCD_RS = P2 ^ 6; //寄存器選擇輸入

  23. sbit LCD_RW = P2 ^ 5; //液晶讀/寫控制

  24. sbit LCD_EN = P2 ^ 7; //液晶使能控制

  25. sbit LCD_PSB = P3 ^ 2; //串/并方式控制

  26. sbit LCD_RST = P3 ^ 4; //液晶復位端口

  27. sbit bz = P1 ^ 0;

  28. sbit hw1=P2^3;

  29. sbit hw2=P2^4;

  30. sbit sset=P3^0;//設置按鈕

  31. sbit spk=P3^1;

  32. sbit sadd=P3^3;

  33. sbit sdel=P1^0;   //按下開始計時

  34. //sbit FW= RST;

  35. sbit d1 = P2^0;
  36. sbit d2 = P2^1;               
  37. sbit d3 = P2^2;
  38. void TimerConfiguration();
  39. unsigned int Time, g, y;
  40. signed int second=0,minute=0,hour=0,count=0,keycount=0;

  41. signed char key=0;

  42. unsigned char code DIS1[] =

  43. {

  44.   "距離綠燈時間"

  45. };

  46. unsigned char code DIS2[] =

  47. {

  48.   "還剩:"

  49. };

  50. unsigned char code DIS31[] =

  51. {

  52.   "堵車距離:  50m"

  53. };

  54. unsigned char code DIS32[] =

  55. {

  56. "不堵車"

  57. }; unsigned char code DIS33[] =

  58. {

  59.   "秒"

  60. };

  61. unsigned char code DIS4[] =

  62. {

  63.   "堵車距離:  100m"

  64. };
  65. unsigned char code DIS5[] =

  66. {

  67.   "楊振林余偉樊曉莉"

  68. };
  69. unsigned char code table2[]="0123456789";



  70. char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個字節



  71. /*********************延時子函數**************************/



  72. void delayNOP()//us延時子函數   (4.34us)

  73. {

  74.   _nop_();

  75.   _nop_();

  76.   _nop_();

  77.   _nop_();

  78. }



  79. void delayms(unsigned int ms)//ms延時子函數

  80. {

  81.   unsigned char y;

  82.   while (ms--)

  83.   {

  84.     for (y = 0; y < 114; y++)

  85.       ;

  86.   }

  87. }

  88. //******************檢查LCD忙狀態**************************





  89. bit lcd_busy()//檢查LCD忙狀態 1忙,0閑

  90. {

  91.   bit result;

  92.   LCD_RS = 0;

  93.   LCD_RW = 1;

  94.   LCD_EN = 1;

  95.   delayNOP();

  96.   result = (bit)(P0 &0x80);

  97.   LCD_EN = 0;

  98.   return (result); }



  99. //***********************寫指令數據***********************



  100. void lcd_wcmd(unsigned char cmd)//寫指令數據到LCD

  101. {

  102.   while (lcd_busy())

  103.   {

  104.   ;

  105.   }

  106.   LCD_RS = 0;

  107.   LCD_RW = 0;

  108.   LCD_EN = 1;

  109.   P0 = cmd;

  110.   delayNOP();

  111.   LCD_EN = 0;

  112. }



  113. void lcd_wdat(unsigned char dat)//寫顯示數據到LCD

  114. {

  115.   while (lcd_busy())

  116.     ;

  117.   LCD_RS = 1;

  118.   LCD_RW = 0;

  119.   LCD_EN = 1;

  120.   P0 = dat;

  121.   delayNOP();

  122.   LCD_EN = 0;

  123. }



  124. void writesmh(unsigned char add,unsigned char date)//顯示個位和十位數據

  125. {

  126. unsigned char shi,ge;

  127. shi=date/10;

  128. ge=date%10;

  129. lcd_wcmd(0x96);

  130. delayms(5);

  131. lcd_wdat(table2[shi]);

  132. delayms(5);

  133. lcd_wdat(table2[ge]);

  134. delayms(5);

  135. }



  136. //*********************初始化設定****************************  

  137. void lcd_init()

  138. {

  139.   LCD_PSB = 1; //并口方式



  140.   LCD_RST = 0; //液晶復位

  141.   delayms(5);  //液晶復位

  142.   LCD_RST = 1; //液晶復位

  143.   delayms(5);  //液晶復位



  144.   lcd_wcmd(0x34); //擴充功能設定,擴充指令,選8位數據

  145.   delayms(5);

  146.   lcd_wcmd(0x30); //功能設定,基本指令操作,選8位數據

  147.   delayms(5);

  148.   lcd_wcmd(0x0C); //顯示開,關光標,關光標反白允許。

  149.   delayms(5);

  150.   lcd_wcmd(0x04); //光標的移動方向

  151.   delayms(5);

  152.   lcd_wcmd(0x01); //清除LCD的顯示內容

  153.   delayms(5);



  154. TMOD=0x01;

  155. TH0=0x3C;

  156. TL0=0xB0;

  157. EA=1;

  158. ET0=1;

  159. TR0=0;

  160. EX0=0; //外部中斷0允許

  161. IT0=1; //外部中斷0為邊沿觸發方式

  162. }



  163. //*********************設定顯示位置子函數**********************



  164. void lcd_pos(unsigned char X, unsigned char Y)//設定顯示位置

  165. {

  166.   unsigned char pos;



  167.   if (X == 1)

  168.   {

  169.     X = 0x80;

  170.   }

  171.   else if (X == 2)

  172.   {

  173.     X = 0x90;   }

  174.   else if (X == 3)

  175.   {

  176.     X = 0x88;

  177.   }

  178.   else if (X == 4)

  179.   {

  180.     X = 0x98;

  181.   }

  182.   pos = X + Y; //確定顯示地址



  183.   lcd_wcmd(pos); //寫顯示地址

  184. }



  185. //*****************清屏子函數***************************



  186. void clr_screen()//清屏子函數

  187. {

  188.   lcd_wcmd(0x34); //擴充指令操作

  189.   delayms(5);

  190.   lcd_wcmd(0x30); //基本指令操作

  191.   delayms(5);

  192.   lcd_wcmd(0x01); //清屏

  193.   delayms(5);

  194. }



  195. //******************閃爍子函數**************************

  196. void lcdflag()

  197. {

  198.   lcd_wcmd(0x08); //關閉顯示

  199.   delayms(500);

  200.   lcd_wcmd(0x0c); //開啟顯示

  201.   delayms(500);

  202.   lcd_wcmd(0x08);

  203.   delayms(500);

  204.   lcd_wcmd(0x0c);

  205.   delayms(500);

  206.   lcd_wcmd(0x08);

  207.   delayms(500);

  208.   lcd_wcmd(0x0c);

  209.   delayms(500);

  210.    

  211. }

  212. //******************寫字符串子函數*************************  

  213. void wr_string(unsigned char str[])//寫字符串子函數

  214. {

  215.   unsigned char num = 0;



  216.   while (str[num])

  217.   {

  218.     lcd_wdat(str[num++]); //寫數據

  219.      

  220.   }

  221. }



  222. //********************按鍵設置時間*************************

  223. void keyscan()//按鍵設置時間

  224. {

  225.    if(d1==0)

  226.    {
  227.     TR0=1;          //開始計時

  228.     EX0=1;
  229.         bz=0;
  230.    }


  231.    if(d1==1)

  232.    {

  233.     TR0=0;          //停止計時

  234.     EX0=0;
  235.    }
  236.   
  237.   

  238. if(keycount!=0)

  239. {

  240.   if(keycount==2)//編輯秒

  241.   {

  242.    if(sadd==0)//數值加1

  243.    {

  244.     delayms(100);

  245.     if(sadd==0)
  246.     {
  247.      second++;      
  248.         if(second==60)

  249.      {

  250.       second=0;

  251.      }

  252.      sadd=1;

  253.     }

  254.     writesmh(0x0e,second);

  255.     lcd_wcmd(0x8e);

  256.     lcd_wcmd(0x0d);//秒位閃爍

  257.      

  258.    }

  259.    if(sdel==0)//數值減1

  260.    {

  261.     delayms(10);

  262.     if(sdel==0)

  263.     {

  264.       

  265.      if(second==0)

  266.      {

  267.       second=60;

  268.      }

  269.      second--;

  270.      sdel=1;

  271.     }

  272.     writesmh(0x0e,second);

  273.     lcd_wcmd(0x8e);

  274.     lcd_wcmd(0x0d);//秒位閃爍

  275.      

  276.    }

  277.    

  278.    

  279.    

  280.   }

  281. }

  282. }
  283. //void gzhi()
  284. //{
  285. //if(hw1==0)
  286. //{
  287. //  g = 1;
  288. //}
  289. ////if(d1==1&&hw2==0&&hw1==0)
  290. ////{
  291. ////  g = 1;
  292. ////}
  293. //if(d1==1&&hw2==0&&hw1==1)
  294. //{
  295. //  g = 2;
  296. //}
  297. //if(d1==1&&hw2==1&&hw1==0)
  298. //{
  299. //  g = 3;
  300. //}
  301. //if(d1==1&&hw2==1&&hw1==1)
  302. //{
  303. //  g = 4;
  304. //}
  305. //if(d1==0&&hw2==0&&hw1==0)
  306. //{
  307. //  g = 5;
  308. //}
  309. //if(d1==0&&hw2==0&&hw1==1)
  310. //{
  311. //  g = 6;
  312. //}
  313. //if(d1==0&&hw2==1&&hw1==0)
  314. //{
  315. //  g = 7;
  316. //}
  317. //if(d1==0&&hw2==1&&hw1==1)
  318. //{
  319. //  g = 8;
  320. //}
  321. //}


  322. void init()//初始化子程序
  323. {       
  324.         TMOD=0x20;                          //設置定時器T1為工作方式2
  325.         TH1=0xfd;
  326.         TL1=0xfd;                           //T1定時器裝初值
  327.         TR1=1;                              //啟動定時器T1
  328.         REN=1;                              //允許串口接收
  329.         SM0=0;
  330.         SM1=1;                              //設置串口工作方式1
  331.         EA=1;                               //開總中斷
  332.         ES=1;                               //開串口中斷
  333. }

  334. //主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函

  335. //數主函數



  336. void main()

  337. {
  338.         init();
  339.     delayms(100); //上電,等待穩定

  340.     lcd_init(); //初始化LCD

  341.   

  342.         lcd_pos(1, 0); //設置“距離綠燈時間”顯示位置為第一行

  343.     wr_string(DIS1);


  344.     lcd_pos(2, 0); //設置“還剩”顯示位置為第二行

  345.     wr_string(DIS2);


  346.         lcd_pos(2, 7); //設置“秒”顯示位置為第四行

  347.     wr_string(DIS33);
  348. if((Time==0&&hw2==0&&hw1==0)||(Time==0&&hw2==0&&hw1==1))
  349. {                                                                                                  //********************************************************
  350.         lcd_pos(3, 0); //設置“距離綠燈時間”顯示位置為第一行

  351.     wr_string(DIS4);  //堵車100m
  352. }
  353. if(Time==0&&hw1==0&&hw2==1)
  354. {                                                                                                  //********************************************************
  355.         lcd_pos(3, 0); //設置“距離綠燈時間”顯示位置為第一行

  356.     wr_string(DIS31);  //堵車50m的
  357. }
  358. if(Time==0&&hw1==1&&hw2==1)
  359. {                                                                                                  //********************************************************
  360.         lcd_pos(3, 0); //設置“距離綠燈時間”顯示位置為第一行

  361.     wr_string(DIS32);  //不堵車
  362. }
  363.         lcd_pos(4, 0); //設置“距離綠燈時間”顯示位置為第一行

  364.     wr_string(DIS5);

  365. writesmh(0x0e,second); //顯示動態時間 秒

  366. delayms(5);
  367. TimerConfiguration();

  368.         init();//調用初始化子程序

  369.   while (1)

  370.   {

  371.   

  372. keyscan();

  373. //  if(Time==0)
  374. //                {
  375. //            d1 = 0;
  376. //
  377. //            }
  378. //               
  379. //                if(Time==1200)                                //********************************60   40
  380. //                {
  381. //                   d1 = 1;
  382. //                   d2 = 0;
  383. //                 }                 
  384. //                   if (Time ==1600)
  385. //                  {
  386. //                    d2 = 1;
  387. //                    d3 = 0;
  388. //                        }
  389. //                    if (Time ==1660)
  390. //                  {
  391. //                    d3 = 1;
  392. //                    Time = 0;
  393. //                   }



  394.   if(Time==0&&hw1==1&&hw2==1) //11        //     60  30
  395.                 {
  396.          
  397.             d1 = 0;

  398.             }
  399.                
  400.                 if(Time==1200)
  401.                 {
  402.                    d1 = 1;
  403.                    d2 = 0;
  404.                  }                 
  405.                    if (Time ==1800)
  406.                   {
  407.                     d2 = 1;
  408.                     d3 = 0;
  409.                         }
  410.                     if (Time ==1860)
  411.                   {
  412.                     d3 = 1;
  413.                     Time = 0;
  414.                    }



  415.   if(Time==0&&hw1==0&&hw2==1)  //01
  416.                 {
  417.             d1 = 0;

  418.             }
  419.                
  420.                 if(Time==1000&&hw1==0&&hw2==1)                  //**************************50  50
  421.                 {
  422.                    d1 = 1;
  423.                    d2 = 0;
  424.                  }                 
  425.                    if (Time ==2000&&hw1==0&&hw2==1 )
  426.                   {
  427.                     d2 = 1;
  428.                     d3 = 0;
  429.                         }
  430.                     if (Time ==2060&&hw1==0&&hw2==1)
  431.                   {
  432.                     d3 = 1;
  433.                     Time = 0;
  434.                    }               
  435.   
  436.   if((Time==0&&hw2==0&&hw1==0)||(Time==0&&hw2==0&&hw1==1))                   //***********************************40   50
  437.                 {
  438.             d1 = 0;

  439.             }
  440.                
  441.                 if(Time==800&&hw2==0&&hw1==0)
  442.                 {
  443.                    d1 = 1;
  444.                    d2 = 0;
  445.                  }                 
  446.                    if (Time ==1800&&hw2==0&&hw1==0)
  447.                   {
  448.                     d2 = 1;
  449.                     d3 = 0;
  450.                         }
  451.                     if (Time ==1860&&hw2==0&&hw1==0)
  452.                   {
  453.                     d3 = 1;
  454.                     Time = 0;
  455.                    }               
  456.   




  457.   }

  458. }

  459. //**********************中斷***************************



  460. void time0() interrupt 1 using 0//倒計時中斷

  461. {

  462. TH0=0x3C;

  463. TL0=0xB0;

  464. count++;




  465. if(count==156&&hw1==1&&hw2==1)//11

  466. {

  467.   count=0;

  468.   second--;

  469.   if(second<0)

  470.   {

  471.    second=60;

  472.    minute--;

  473.    if(minute<0)

  474.    {

  475.     minute=59;

  476.     hour--;

  477.     if(hour<0)

  478.     {

  479.      hour=24;

  480.     }

  481.     lcd_pos(3, 2); //設置顯示位置為第三行,第七列

  482.     writesmh(0x0a,hour);

  483.    }    lcd_pos(3, 4); //設置顯示位置為第三行,第七列

  484.    writesmh(0x0c,minute);

  485.   }

  486.   lcd_pos(3, 6); //設置顯示位置為第三行,第七列

  487.   writesmh(0x0e,second);



  488. }

  489.                                                                                                                                        
  490. if(count==155&&hw1==0&&hw2==1)   //  01

  491. {

  492.   count=0;
  493.   second--;

  494.   if(second<0)

  495.   {

  496.    second=50;

  497.    if(d1==1)

  498.    {

  499.         second=0;
  500.                 bz=1;
  501.    }  

  502.   }

  503.   lcd_pos(3, 6); //設置顯示位置為第三行,第七列

  504.   writesmh(0x0e,second);



  505. }   





  506. if((count==155&&hw1==0&&hw2==0)||(count==155&&hw2==0&&hw1==1))   //00

  507. {

  508.   count=0;
  509.   second--;

  510.   if(second<0)

  511.   {

  512.    second=40;

  513.    if(d1==1)

  514.    {

  515.         second=0;
  516.                 bz=1;
  517.    }  

  518.   }

  519.   lcd_pos(3, 6); //設置顯示位置為第三行,第七列

  520.   writesmh(0x0e,second);



  521. }   
  522. }



  523. void encoder(void) interrupt 0//外部中斷0 旋轉碼開關中斷程序

  524. {
  525. ……………………

  526. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
調皮的紅綠燈2.rar (100.17 KB, 下載次數: 19)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠操电影 | 午夜影院普通用户体验区 | 天天干视频| 精品在线播放 | 日本激情一区二区 | 亚洲情综合五月天 | 国产成人精品视频 | 国产乱码精品1区2区3区 | 久久久久久国产精品久久 | 国产精品福利视频 | 日韩国产欧美 | 欧美日韩淫片 | 伊人久久成人 | 99精品网 | 国产日韩中文字幕 | 亚洲视频二 | 国产 欧美 日韩 一区 | 在线观看黄色电影 | 国产一区二区影院 | 亚洲欧美一区二区三区在线 | 五月激情综合网 | 欧美日韩中文在线 | 亚洲视频在线观看 | 国产美女自拍视频 | 欧美aaa一级片 | 婷婷久久久久 | 国产精品特级毛片一区二区三区 | 亚洲视频中文 | 国产伊人精品 | 爱爱免费视频 | 久热精品视频 | 国产精品一区二区av | 一级片av | 成人欧美一区二区三区在线播放 | 国产精品一区二区免费 | 免费观看www | 国产精品99久久久久久宅男 | 日本一区二区影视 | 久久精品亚洲精品国产欧美 | 免费黄色成人 | 一区二区精品 |