簡單的交通燈焊接與程序設計用時:5天
014941b22xfox5v77vjhjk.png (71.7 KB, 下載次數: 51)
下載附件
2017-2-27 03:12 上傳
本課程設計報告的word版本及完整的程序代碼下載地址:
http://www.zg4o1577.cn/bbs/dpj-77888-1.html
1 設計目的:設計一個東西方向和南北方向十字路口的簡單交通燈控制系統。 2 設計要求:2.1 可以按鍵設置交通燈東西、南北的倒計時時間第一次按設置鍵是設置東西方向的時間,第二次按設置鍵是設置南北方向的時間,再按加減鍵就可以設置對應的時間。 22 東西和南北方向各有兩個數碼管分別顯示時間東西和南北的時間相差5秒,這5秒為黃燈亮的時間。 2.3 當有特殊情況時,可以按緊急模式進行調整.2.4 緊急模式:當消防車、救護車等特殊車輛通行時按下”緊急模式鍵”全部亮紅燈,待緊急車輛通過后,再恢復后再退出。 2.5 夜間模式:4個方向黃燈亮起。 2.6 禁止通行第1次按緊急鍵4個方向全部亮紅燈. 2.7 夜間模式第2次東西南北4個方向黃燈閃爍 2.8 南北優先通行第3次南北綠燈亮東西紅燈亮 2.9 東西優先通行第4次南北紅燈亮東西綠燈亮 2.10 再按一次回到正常顯示不同的模式適合不同的交通情況(如夜間模式,有交通事故的時候)
3 材料準備:10*15洞洞板1塊, 51芯片(STC89C51RC), 母座(或者40pin芯片座或zip座), 紅色LED燈1個, 103上拉排阻1個(九個引腳), 10K電阻1個, 1K電阻1個, 30pf瓷片電容2個, 10uf電解電容1個, 單排針, 輕觸按鍵4個, 12.288 MHz晶振1個, 自鎖開關(六腳), 杜邦線, USB轉TTL線(下載與供電), 紅黃綠LED燈各2個, 3641AH數碼管(共陰四位數碼管) 4 電路圖:*注:關于EA:我使用的STC89C52RC單片機芯片(EA管腳已內部上拉到Vcc) - 如外部不加上拉,或外部上拉到Vcc,上電復位后單片機從內部開始執行程序;
- 如外部下拉到地,上電復位后單片機從外部開始執行程序。
根據網上找到的資料畫的電路圖: 1)去掉了復位電路和電源插孔:
1.001.jpg (23.16 KB, 下載次數: 50)
下載附件
2017-2-27 03:12 上傳
2)再修改后:
1.002.jpg (40.69 KB, 下載次數: 50)
下載附件
2017-2-27 03:12 上傳
5 時鐘電路:
1.003.jpg (19.84 KB, 下載次數: 62)
下載附件
2017-2-27 03:12 上傳
1.004.jpg (7.12 KB, 下載次數: 48)
下載附件
2017-2-27 03:12 上傳
5.1 關于單片機的XTAL1和XTAL2單片機的XTAL1和XTAL2內部有一片內振蕩器結構但仍需要在XTAL1和XTAL2兩端連接一個晶振和兩個電容才能組成時鐘電路,這種使用晶振配合產生信號的方法是內部時鐘方式; 5.2 晶振說明無源晶振是有2個引腳的無極性元件,需要借助于時鐘電路才能產生振蕩信號,自身無法振蕩起來; 5.3 時鐘電路的重要性時鐘電路在單片機系統中很重要,它能控制著單片機工作的節奏,是必不可少的部分。單片機運行需要時鐘支持——就像計算機的CPU一樣,如果沒有時鐘電路來產生時鐘驅動單片機,那單片機就不能執行程序。 6 自鎖開關:六引腳自鎖開關是一個雙刀雙擲開關,除了圖上用黑線相連的部分,其他部分均不相連。
1.005.jpg (10.49 KB, 下載次數: 51)
下載附件
2017-2-27 03:12 上傳
7 A103J排阻:排阻是具有極性,在焊接的時候一定需要注意,如果方向弄錯可能導致顯示不了。
1.006.jpg (19.79 KB, 下載次數: 45)
下載附件
2017-2-27 03:12 上傳
從圖上可以看到排阻左邊有一個點標記和103數值。那個點表示那一端的第一個引腳為公共引腳。,而103表示該排阻,前兩位數表示數值,最后一位表示倍數即10X10 3=10K。 排阻在原理圖中的符號表示:根據圖可以發現排阻內部的所有電阻都連接到第一個引腳上,所以第一個引腳肯定就是公共端,見下圖。
1.007.jpg (7.62 KB, 下載次數: 60)
下載附件
2017-2-27 03:12 上傳
8 四腳開關:
1.008.jpg (24.82 KB, 下載次數: 53)
下載附件
2017-2-27 03:12 上傳
9 3641AH數碼管引腳圖:
1.009.jpg (29.61 KB, 下載次數: 40)
下載附件
2017-2-27 03:12 上傳
對應的字母段碼排列:
1.010.jpg (8.63 KB, 下載次數: 57)
下載附件
2017-2-27 03:12 上傳
10 仿真圖:
1.011.jpg (57.62 KB, 下載次數: 45)
下載附件
2017-2-27 03:12 上傳
11 電路連接測試1)正面圖:
1.012.jpg (44.14 KB, 下載次數: 44)
下載附件
2017-2-27 03:12 上傳
2)背面圖:
1.013.jpg (39.08 KB, 下載次數: 47)
下載附件
2017-2-27 03:12 上傳
12 程序分析:
- #include
- #define uint unsigned int
- #define uchar unsigned char
- /* I/O口的定義 */
- sbit w1_NS=P1^0; //數碼管南北時間的位選
- sbit w2_NS=P1^1;
- sbit w1_WE=P1^4; //數碼管東西時間的位選
- sbit w2_WE=P2^7;
- sbit k1=P3^2; //按鍵的定義
- sbit k2=P3^5;
- sbit k3=P3^6;
- sbit k4=P3^7;
- sbit red_NS=P2^1; //南北紅綠黃燈的定義
- sbit yellow_NS=P1^6;
- sbit green_NS=P1^5;
- sbit red_WE=P2^6; //東西紅綠黃燈的定義
- sbit yellow_WE=P2^4;
- sbit green_WE=P2^3;
-
- uchar seconds_NS,seconds_WE,seconds_WE_set,seconds_NS_set,flag_NS,flag_WE,t0,k1num,k4num;
- uchar code table[]={
- 0xeb,0x28,0xb3,0xba,0x78, //數碼管譯碼:分別對應數字0~9
- 0xda,0xdb,0xa8,0xfb,0xfa
- };
-
- void delay(uint z); //延時函數
- void init(); //初始化函數
- void display_NS(); //南北時間顯示函數
- void display_WE(); //東西時間顯示函數
- void LED_display(); //紅路燈的正常模式函數
- void keyscan(); //按鍵掃描函數
-
- void main()
- {
- init();
- while(1)
- {
- keyscan();
- display_NS();
- display_WE();
- LED_display();
- }
- }
-
- void delay(uint z) //延時函數
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
- void init() //初始化函數
- {
- t0=0;
- flag_NS=0;
- flag_WE=0;
- seconds_NS_set=10;
- seconds_WE_set=15;
- seconds_NS=seconds_NS_set;
- seconds_WE=seconds_WE_set;
- TMOD=0x01; //設置定時器的工作方式為1,定時器工作方式
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器0的中斷
- TR0=1; //開啟定時器0的運行開關
-
- }
-
- void display_NS() //南北時間顯示函數
- {
- P0=0x00;
- w1_NS=0;
- P0=table[seconds_NS/10]; //顯示南北時間的十位
- delay(1);
- w1_NS=1;
-
- P0=0x00;
- w2_NS=0;
- P0=table[seconds_NS%10]; ////顯示南北時間的個位
- delay(1);
- w2_NS=1;
-
- }
-
- void display_WE() //東西時間顯示函數
- {
- P0=0x00;
- w1_WE=0;
- P0=table[seconds_WE/10]; //顯示東西時間的十位
- delay(1);
- w1_WE=1;
-
- P0=0x00;
- w2_WE=0;
- P0=table[seconds_WE%10]; //顯示東西時間的個位
- delay(1);
- w2_WE=1;
-
- }
-
- void timer0() interrupt 1 //中斷函數,16位加1計數器
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- t0++;
- if(t0==20)
- {
- t0=0;
- seconds_NS--;
- seconds_WE--;
- }
- }
-
- void LED_display() //紅路燈的正常模式
- {
- if(flag_NS==0) //flag_NS為0時
- {
- if(seconds_NS>5) //南北時間大于5s
- {
- red_NS=1; //紅燈滅
- yellow_NS=1; //黃燈滅
- green_NS=0; //綠燈亮
- }
- else
- { //5s內亮黃燈5s
- red_NS=1;
- yellow_NS=0;
- green_NS=1;
- if(seconds_NS==0)
- {
- seconds_NS=seconds_WE_set;
- flag_NS=1;
- }
- }
- }
- if(flag_NS==1) // flag_NS為1時
- {
- if(seconds_NS>5)
- {
- red_NS=0; //紅燈亮
- yellow_NS=1; //黃燈滅
- green_NS=1; //綠燈滅
- }
- else
- { //5s內亮黃燈5s
- red_NS=1;
- yellow_NS=0;
- green_NS=1;
- if(seconds_NS==0)
- {
- seconds_NS=seconds_NS_set;
- flag_NS=0;
- }
- }
- }
-
- if(flag_WE==0) //flag_WE為0時
- {
- if(seconds_WE>5)
- {
- red_WE=0; //紅燈亮
- yellow_WE=1; //黃燈滅
- green_WE=1; //綠燈滅
- }
- else
- { //5s內黃燈亮5s
- red_WE=1;
- yellow_WE=0;
- green_WE=1;
- if(seconds_WE==0)
- {
- seconds_WE=seconds_NS_set;
- flag_WE=1;
- }
- }
- }
- if(flag_WE==1)
- {
- if(seconds_WE>5)
- {
- red_WE=1; //紅燈滅
- yellow_WE=1; //黃燈滅
- green_WE=0; //綠燈亮
- }
- else
- { //黃燈亮5s
- red_WE=1;
- yellow_WE=0;
- green_WE=1;
- if(seconds_WE==0)
- {
- seconds_WE=seconds_WE_set-3;
- flag_WE=0;
- }
- }
- }
- }
-
- void keyscan() //按鍵掃描
- {
- if(k1==0)
- {
- while(!k1); //等待按鍵釋放(消抖)
- k1num++;
- TR0=0;
- }
- if(k1num==1)
- {
- if(k2==0)
- {
- while(!k2);
- seconds_NS_set++;
- seconds_NS=seconds_NS_set;
- // display_NS();
- if(seconds_NS==100)
- seconds_NS=0;
- }
- if(k3==0)
- {
- while(!k3);
- seconds_NS_set--;
- seconds_NS=seconds_NS_set;
- // display_NS();
- if(seconds_NS==0)
- seconds_NS=99;
- }
- }
- if(k1num==2)
- {
- if(k2==0)
- {
- while(!k2);
- seconds_WE_set++;
- seconds_WE=seconds_WE_set;
- // display_WE();
- if(seconds_WE==100)
- seconds_WE=0;
- }
- if(k3==0)
- {
- while(!k3);
- seconds_WE_set--;
- seconds_WE=seconds_WE_set;
- // display_WE();
- if(seconds_WE==0)
- seconds_WE=99;
- }
- }
- if(k1num==3)
- {
- k1num=0;
- TR0=1;
- }
-
- if(k4==0)
- {
- while(!k4);
- k4num++;
- }
-
- /*特殊情況選擇模式*/
- switch(k4num)
- {
- case 1: //按第1次為緊急模式,禁止通行
- red_WE=0;
- yellow_WE=1;
- green_WE=1;
- red_NS=0;
- yellow_NS=1;
- green_NS=1;
- TR0=0;
- flag_NS=-1;
- flag_WE=-1;
- seconds_NS=99;
- seconds_WE=99;
- break;
復制代碼 13 心得體會本次是第一次焊接,剛開始出現許多錯誤,修改修改再修改;上網查資料,請教師兄,最后做出來了。這次從中收獲許多,學會從網上檢索有用的資料,這對我們學習有很大的幫助。對單片機也有了進一步的了解,動手能力、分析能力也增強了,實踐很重要,再好的理論如果不能用于實踐,那么它就是沒有用的。 紙上得來終覺淺,絕知此事要躬行。 感謝。
1.014.jpg (10.66 KB, 下載次數: 44)
下載附件
2017-2-27 03:12 上傳
參考資料: 1、單片機最小系統電路圖:
1.015.jpg (41.34 KB, 下載次數: 54)
下載附件
2017-2-27 03:12 上傳
|