|
本系統采用STC89C52單片機以及單片機最小系統和三極管驅動電路以及外圍的按鍵和數碼管顯示等部件,設計一個基于單片機的交通燈設計。設計通過兩位一體共陰極數碼管顯示,并能通過按鍵對定時進行設置。
本系統實用性強、操作簡單,外圍的按鍵和數碼管顯示等部件,數碼管倒計時顯示時間。
捕獲.PNG (30.66 KB, 下載次數: 26)
下載附件
原理圖
2019-5-30 00:02 上傳
主要代碼:
- /*顯示子函數*/
- void display(char dat)
- {
- led_A=led_B=0; //先位滅顯
- P2=0XFF; //再段滅顯
- P2=tab_disp[dat/10]; //賦顯示的數
- if(dat/10)led_A=1;
- delay(1000); //延時
-
- P2=0XFF;led_A=led_B=0; //段滅顯 位滅顯
- P2=tab_disp[dat%10]; //賦顯示的數
- led_B=1;
- delay(1000); //延時
- }
- //這個是循環顯示60遍顯示的函數
- void deal(char m)
- {
- int t=60;
- while(t--)display(m); //循環顯示60遍顯示的函數
- }
- void KEY() //按鍵函數
- {
- unsigned char save; //定義保存燈狀態的變量
- if(key_stop==0) //按鍵是否按下
- {
- delay(20); //延時去抖
- if(key_stop==0) //再次判斷按鍵是否按下
- {
- flag=1; //緊急狀態標志位置1,進入緊急通行狀態
- save=P0; //保存燈的狀態
- P0=0x84; //全部亮紅燈
- while(key_stop==0); //按鍵釋放,當按鍵一直按下的時候,程序就會一直執行這里,直到按鍵按下
- while(flag==1) //如果是緊急狀態就一直執行下面的程序
- {
- if(key_stop==0) //在緊急狀態時判斷按鍵是否按下
- {
- delay(50); //延時去抖
- if(key_stop==0) //再次判斷按鍵是否按下
- {
- flag=0; //緊急狀態標志位清零,退出緊急狀態
- P0=save; //LED燈恢復到之前狀態
- while(key_stop==0); //按鍵釋放
- }
- }
- }
- }
- }
- }
- /*主函數*/
- void main(void)
- {
- char i;
- EA=1; //全局中斷開關
- IT1=1; //外部中斷下降沿有效
- EX1=1;
- while(1)
- {
- N=25; //初始時間是25
- dx_R=1;dx_Y=0;dx_G=0; //指示燈0是亮,1是滅
- nb_R=0;nb_Y=0;nb_G=1; //指示燈0是亮,1是滅
- for(i=N;i>0;i--) //一秒一秒的減
- {
- deal(i);
- KEY();
- }
-
- dx_R=1;dx_Y=0;dx_G=0; //指示燈0是亮,1是滅
- nb_R=0;nb_Y=1;nb_G=0; //指示燈0是亮,1是滅
- N=5; //時間變成5
- for(i=N;i>0;i--) //一秒一秒的減
- {
- deal(i);
- KEY();
- }
-
- dx_R=0;dx_Y=0;dx_G=1; //指示燈0是亮,1是滅
- nb_R=1;nb_Y=0;nb_G=0; //指示燈0是亮,1是滅
- N=25; //時間變成25
- for(i=N;i>0;i--) //一秒一秒的減
- {
- deal(i);
- KEY();
- }
- dx_R=0;dx_Y=1;dx_G=0; //指示燈0是亮,1是滅
- nb_R=1;nb_Y=0;nb_G=0; //指示燈0是亮,1是滅
- N=5; //時間變成5
- for(i=N;i>0;i--) //一秒一秒的減
- {
- deal(i);
- KEY();
- }
- }
- }
復制代碼
|
-
-
1-程序.zip
2019-5-30 00:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
32.62 KB, 下載次數: 14, 下載積分: 黑幣 -5
源代碼
|