找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

簡(jiǎn)單的交通燈焊接與程序課程設(shè)計(jì)報(bào)告

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
簡(jiǎn)單的交通燈焊接與程序設(shè)計(jì)用時(shí):5天

本課程設(shè)計(jì)報(bào)告的word版本及完整的程序代碼下載地址:
http://www.torrancerestoration.com/bbs/dpj-77888-1.html

1 設(shè)計(jì)目的:

設(shè)計(jì)一個(gè)東西方向和南北方向十字路口的簡(jiǎn)單交通燈控制系統(tǒng)。

2 設(shè)計(jì)要求2.1 可以按鍵設(shè)置交通燈東西、南北的倒計(jì)時(shí)時(shí)間
第一次按設(shè)置鍵是設(shè)置東西方向的時(shí)間,第二次按設(shè)置鍵是設(shè)置南北方向的時(shí)間,再按加減鍵就可以設(shè)置對(duì)應(yīng)的時(shí)間。
22 東西和南北方向各有兩個(gè)數(shù)碼管分別顯示時(shí)間
東西和南北的時(shí)間相差5秒,這5秒為黃燈亮的時(shí)間。
2.3 當(dāng)有特殊情況時(shí),可以按緊急模式進(jìn)行調(diào)整.2.4 緊急模式:
當(dāng)消防車、救護(hù)車等特殊車輛通行時(shí)按下”緊急模式鍵”全部亮紅燈,待緊急車輛通過(guò)后,再恢復(fù)后再退出。
2.5 夜間模式:
4個(gè)方向黃燈亮起。
2.6 禁止通行
第1次按緊急鍵4個(gè)方向全部亮紅燈.
2.7 夜間模式
第2次東西南北4個(gè)方向黃燈閃爍
2.8 南北優(yōu)先通行
第3次南北綠燈亮東西紅燈亮
2.9 東西優(yōu)先通行
第4次南北紅燈亮東西綠燈亮
2.10 再按一次回到正常顯示
不同的模式適合不同的交通情況(如夜間模式,有交通事故的時(shí)候)


3 材料準(zhǔn)備
10*15洞洞板1塊,
51芯片(STC89C51RC),
母座(或者40pin芯片座或zip座),
紅色LED燈1個(gè),
103上拉排阻1個(gè)(九個(gè)引腳),
10K電阻1個(gè),
1K電阻1個(gè),
30pf瓷片電容2個(gè),
10uf電解電容1個(gè),
單排針,
輕觸按鍵4個(gè),
12.288 MHz晶振1個(gè),
自鎖開關(guān)(六腳),
杜邦線,
USB轉(zhuǎn)TTL線(下載與供電),
紅黃綠LED燈各2個(gè),
3641AH數(shù)碼管(共陰四位數(shù)碼管)
4 電路圖:*注:關(guān)于EA
我使用的STC89C52RC單片機(jī)芯片(EA管腳已內(nèi)部上拉到Vcc)
  •                     如外部不加上拉,或外部上拉到Vcc,上電復(fù)位后單片機(jī)從內(nèi)部開始執(zhí)行程序;
  •                     如外部下拉到地,上電復(fù)位后單片機(jī)從外部開始執(zhí)行程序。
根據(jù)網(wǎng)上找到的資料畫的電路圖:
1)去掉了復(fù)位電路和電源插孔:
2)再修改后
5 時(shí)鐘電路


5.1 關(guān)于單片機(jī)的XTAL1和XTAL2
單片機(jī)的XTAL1和XTAL2內(nèi)部有一片內(nèi)振蕩器結(jié)構(gòu)但仍需要在XTAL1和XTAL2兩端連接一個(gè)晶振和兩個(gè)電容才能組成時(shí)鐘電路,這種使用晶振配合產(chǎn)生信號(hào)的方法是內(nèi)部時(shí)鐘方式;
5.2 晶振說(shuō)明
無(wú)源晶振是有2個(gè)引腳的無(wú)極性元件,需要借助于時(shí)鐘電路才能產(chǎn)生振蕩信號(hào),自身無(wú)法振蕩起來(lái);
5.3 時(shí)鐘電路的重要性
時(shí)鐘電路在單片機(jī)系統(tǒng)中很重要,它能控制著單片機(jī)工作的節(jié)奏,是必不可少的部分。單片機(jī)運(yùn)行需要時(shí)鐘支持——就像計(jì)算機(jī)的CPU一樣,如果沒(méi)有時(shí)鐘電路來(lái)產(chǎn)生時(shí)鐘驅(qū)動(dòng)單片機(jī),那單片機(jī)就不能執(zhí)行程序。
6 自鎖開關(guān):
六引腳自鎖開關(guān)是一個(gè)雙刀雙擲開關(guān),除了圖上用黑線相連的部分,其他部分均不相連。
7 A103J排阻:
排阻是具有極性,在焊接的時(shí)候一定需要注意,如果方向弄錯(cuò)可能導(dǎo)致顯示不了。
從圖上可以看到排阻左邊有一個(gè)點(diǎn)標(biāo)記和103數(shù)值。那個(gè)點(diǎn)表示那一端的第一個(gè)引腳為公共引腳。,而103表示該排阻,前兩位數(shù)表示數(shù)值,最后一位表示倍數(shù)即10X10 3=10K。
排阻在原理圖中的符號(hào)表示:根據(jù)圖可以發(fā)現(xiàn)排阻內(nèi)部的所有電阻都連接到第一個(gè)引腳上,所以第一個(gè)引腳肯定就是公共端,見下圖。
8 四腳開關(guān):
9 3641AH數(shù)碼管引腳圖:

              對(duì)應(yīng)的字母段碼排列            
10 仿真圖
11 電路連接測(cè)試1正面圖:
2背面圖:

12 程序分析

  1. #include
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4.               /* I/O口的定義 */
  5. sbit w1_NS=P1^0;              //數(shù)碼管南北時(shí)間的位選               
  6. sbit w2_NS=P1^1;
  7. sbit w1_WE=P1^4;              //數(shù)碼管東西時(shí)間的位選
  8. sbit w2_WE=P2^7;
  9. sbit k1=P3^2;                            //按鍵的定義
  10. sbit k2=P3^5;
  11. sbit k3=P3^6;
  12. sbit k4=P3^7;
  13. sbit red_NS=P2^1;                            //南北紅綠黃燈的定義
  14. sbit yellow_NS=P1^6;
  15. sbit green_NS=P1^5;
  16. sbit red_WE=P2^6;                            //東西紅綠黃燈的定義
  17. sbit yellow_WE=P2^4;
  18. sbit green_WE=P2^3;

  19. uchar seconds_NS,seconds_WE,seconds_WE_set,seconds_NS_set,flag_NS,flag_WE,t0,k1num,k4num;            
  20. uchar code table[]={                                          
  21. 0xeb,0x28,0xb3,0xba,0x78,                                                        //數(shù)碼管譯碼:分別對(duì)應(yīng)數(shù)字0~9
  22. 0xda,0xdb,0xa8,0xfb,0xfa
  23. };                             
  24.                            
  25. void delay(uint z);                              //延時(shí)函數(shù)
  26. void init();                                            //初始化函數(shù)
  27. void display_NS();                              //南北時(shí)間顯示函數(shù)
  28. void display_WE();                              //東西時(shí)間顯示函數(shù)
  29. void LED_display();                              //紅路燈的正常模式函數(shù)
  30. void keyscan();                                            //按鍵掃描函數(shù)

  31. void main()
  32. {
  33.               init();            
  34.               while(1)
  35.               {               
  36.                             keyscan();
  37.                             display_NS();
  38.                             display_WE();
  39.                             LED_display();                           
  40.               }                                 
  41. }

  42. void delay(uint z)                                                        //延時(shí)函數(shù)
  43. {
  44.               uint x,y;
  45.               for(x=z;x>0;x--)
  46.                             for(y=110;y>0;y--);
  47. }

  48. void init()                                                                        //初始化函數(shù)
  49. {
  50.               t0=0;
  51.               flag_NS=0;
  52.               flag_WE=0;
  53.               seconds_NS_set=10;
  54.               seconds_WE_set=15;
  55.               seconds_NS=seconds_NS_set;
  56.               seconds_WE=seconds_WE_set;
  57.               TMOD=0x01;                                                                      //設(shè)置定時(shí)器的工作方式為1,定時(shí)器工作方式
  58.               TH0=(65536-50000)/256;                              
  59.               TL0=(65536-50000)%256;
  60.               EA=1;                                                        //開總中斷
  61.               ET0=1;                                                        //開定時(shí)器0的中斷
  62.               TR0=1;                                                        //開啟定時(shí)器0的運(yùn)行開關(guān)
  63.                            
  64. }

  65. void display_NS()                                            //南北時(shí)間顯示函數(shù)
  66. {
  67.               P0=0x00;            
  68.               w1_NS=0;
  69.               P0=table[seconds_NS/10];                            //顯示南北時(shí)間的十位
  70.               delay(1);                                                                     
  71.               w1_NS=1;                                                                     
  72.                                                                         
  73.               P0=0x00;
  74.               w2_NS=0;
  75.               P0=table[seconds_NS%10];                            ////顯示南北時(shí)間的個(gè)位
  76.               delay(1);                                                                     
  77.               w2_NS=1;
  78.                            
  79. }

  80. void display_WE()                                            //東西時(shí)間顯示函數(shù)
  81. {
  82.               P0=0x00;            
  83.               w1_WE=0;
  84.               P0=table[seconds_WE/10];                //顯示東西時(shí)間的十位
  85.               delay(1);                                                                     
  86.               w1_WE=1;                                                                     
  87.                                                                         
  88.               P0=0x00;
  89.               w2_WE=0;
  90.               P0=table[seconds_WE%10];                            //顯示東西時(shí)間的個(gè)位
  91.               delay(1);                                                                     
  92.               w2_WE=1;
  93.                            
  94. }                             

  95. void timer0() interrupt 1                 //中斷函數(shù),16位加1計(jì)數(shù)器
  96. {
  97.               TH0=(65536-50000)/256;
  98.               TL0=(65536-50000)%256;
  99.               t0++;
  100.               if(t0==20)
  101.               {
  102.                             t0=0;
  103.                             seconds_NS--;
  104.                             seconds_WE--;                                                      
  105.               }
  106. }

  107. void LED_display()                            //紅路燈的正常模式
  108. {
  109.               if(flag_NS==0)                            //flag_NS為0時(shí)
  110.               {
  111.                             if(seconds_NS>5)                //南北時(shí)間大于5s
  112.                             {
  113.                                           red_NS=1;                              //紅燈滅
  114.                                           yellow_NS=1;                //黃燈滅
  115.                                           green_NS=0;                            //綠燈亮                           
  116.                             }
  117.                             else
  118.                             {                                                           //5s內(nèi)亮黃燈5s
  119.                                           red_NS=1;                           
  120.                                           yellow_NS=0;
  121.                                           green_NS=1;               
  122.                                           if(seconds_NS==0)
  123.                                           {
  124.                                             seconds_NS=seconds_WE_set;
  125.                                             flag_NS=1;
  126.                                           }                                                                                                               
  127.                             }
  128.               }
  129.               if(flag_NS==1)                            // flag_NS為1時(shí)
  130.               {
  131.                             if(seconds_NS>5)
  132.                             {
  133.                                           red_NS=0;                            //紅燈亮
  134.                                           yellow_NS=1;                //黃燈滅
  135.                                           green_NS=1;                            //綠燈滅            
  136.                             }
  137.                             else
  138.                             {                                                                      //5s內(nèi)亮黃燈5s
  139.                                           red_NS=1;                             
  140.                                           yellow_NS=0;
  141.                                           green_NS=1;
  142.                                           if(seconds_NS==0)
  143.                                           {
  144.                                             seconds_NS=seconds_NS_set;
  145.                                             flag_NS=0;
  146.                                           }                                                                                                               
  147.                             }            
  148.               }

  149.               if(flag_WE==0)                            //flag_WE為0時(shí)
  150.               {
  151.                             if(seconds_WE>5)
  152.                             {
  153.                                           red_WE=0;                              //紅燈亮
  154.                                           yellow_WE=1;                //黃燈滅
  155.                                           green_WE=1;                              //綠燈滅
  156.                             }
  157.                             else
  158.                             {                                                           //5s內(nèi)黃燈亮5s
  159.                                           red_WE=1;
  160.                                           yellow_WE=0;
  161.                                           green_WE=1;
  162.                                           if(seconds_WE==0)
  163.                                           {
  164.                                                         seconds_WE=seconds_NS_set;
  165.                                                         flag_WE=1;
  166.                                           }                           
  167.                             }
  168.               }
  169.               if(flag_WE==1)
  170.               {
  171.                             if(seconds_WE>5)
  172.                             {
  173.                                           red_WE=1;                               //紅燈滅
  174.                                           yellow_WE=1;                 //黃燈滅
  175.                                           green_WE=0;                               //綠燈亮
  176.                             }
  177.                             else
  178.                             {                                                          //黃燈亮5s
  179.                                           red_WE=1;
  180.                                           yellow_WE=0;
  181.                                           green_WE=1;
  182.                                           if(seconds_WE==0)
  183.                                           {
  184.                                                         seconds_WE=seconds_WE_set-3;
  185.                                                         flag_WE=0;
  186.                                           }                           
  187.                             }            
  188.               }
  189. }

  190. void keyscan()                            //按鍵掃描
  191. {
  192.               if(k1==0)
  193.               {            
  194.                             while(!k1);                            //等待按鍵釋放(消抖)
  195.                             k1num++;
  196.                             TR0=0;                           
  197.               }
  198.               if(k1num==1)
  199.               {
  200.                             if(k2==0)
  201.                             {
  202.                                           while(!k2);
  203.                                           seconds_NS_set++;
  204.                                           seconds_NS=seconds_NS_set;
  205.                             //              display_NS();                                                      
  206.                                           if(seconds_NS==100)
  207.                                                         seconds_NS=0;                           
  208.                             }
  209.                             if(k3==0)
  210.                             {
  211.                                           while(!k3);
  212.                                           seconds_NS_set--;
  213.                                           seconds_NS=seconds_NS_set;
  214.                             //              display_NS();
  215.                                           if(seconds_NS==0)
  216.                                                         seconds_NS=99;            
  217.                             }
  218.               }
  219.               if(k1num==2)
  220.               {
  221.                             if(k2==0)
  222.                             {
  223.                                           while(!k2);
  224.                                           seconds_WE_set++;
  225.                                           seconds_WE=seconds_WE_set;            
  226.                             //              display_WE();                                         
  227.                                           if(seconds_WE==100)
  228.                                                         seconds_WE=0;                           
  229.                             }
  230.                             if(k3==0)
  231.                             {
  232.                                           while(!k3);
  233.                                           seconds_WE_set--;
  234.                                           seconds_WE=seconds_WE_set;
  235.                             //              display_WE();
  236.                                           if(seconds_WE==0)
  237.                                                         seconds_WE=99;            
  238.                             }
  239.               }
  240.               if(k1num==3)
  241.               {
  242.                             k1num=0;
  243.                             TR0=1;
  244.               }

  245.               if(k4==0)
  246.               {
  247.                             while(!k4);
  248.                             k4num++;
  249.               }

  250.               /*特殊情況選擇模式*/
  251.               switch(k4num)                                                                       
  252.               {
  253.                             case 1:                                                                      //按第1次為緊急模式,禁止通行
  254.                                                         red_WE=0;
  255.                                                         yellow_WE=1;
  256.                                                         green_WE=1;
  257.                                                         red_NS=0;
  258.                                                         yellow_NS=1;
  259.                                                         green_NS=1;
  260.                                                         TR0=0;
  261.                                                         flag_NS=-1;
  262.                                                         flag_WE=-1;
  263.                                                         seconds_NS=99;
  264.                                                         seconds_WE=99;
  265.                                                         break;
復(fù)制代碼
13 心得體會(huì)
本次是第一次焊接,剛開始出現(xiàn)許多錯(cuò)誤,修改修改再修改;上網(wǎng)查資料,請(qǐng)教師兄,最后做出來(lái)了。這次從中收獲許多,學(xué)會(huì)從網(wǎng)上檢索有用的資料,這對(duì)我們學(xué)習(xí)有很大的幫助。對(duì)單片機(jī)也有了進(jìn)一步的了解,動(dòng)手能力、分析能力也增強(qiáng)了,實(shí)踐很重要,再好的理論如果不能用于實(shí)踐,那么它就是沒(méi)有用的。
紙上得來(lái)終覺(jué)淺,絕知此事要躬行。
感謝。
  





參考資料:
1、單片機(jī)最小系統(tǒ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ù) 返回頂部 返回列表