標(biāo)題: 單片機(jī)智能交通燈控制系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)流程圖與程序 [打印本頁(yè)]
作者: q1292471382 時(shí)間: 2018-10-15 14:10
標(biāo)題: 單片機(jī)智能交通燈控制系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)流程圖與程序
1.設(shè)計(jì)目的- 學(xué)習(xí)AT89C51的原理及應(yīng)用
- 了解使用單片機(jī)處理復(fù)雜邏輯的方法
2.設(shè)計(jì)任務(wù)
本系統(tǒng)的軟件設(shè)計(jì)主要分為四大模塊:定時(shí)模塊、倒計(jì)時(shí)顯示、紅綠燈顯示、按鍵輸入。定時(shí)模塊通過定時(shí)器T0在模式1下,完成1秒的定時(shí)功能,每1秒時(shí)間到,將會(huì)對(duì)通行時(shí)間進(jìn)行倒計(jì)時(shí)。顯示模塊采用動(dòng)態(tài)顯示的方式,段選碼從P2端口輸出,位選碼從P1端口輸出。紅綠燈顯示采用單片機(jī)IO端口直接驅(qū)動(dòng),當(dāng)IO端口輸出低電平時(shí),相應(yīng)的發(fā)光二極管發(fā)光;當(dāng)IO端口輸出高電平時(shí),相應(yīng)的發(fā)光二極管熄滅。按鍵輸入,主要完成“東西通行”、“南北通行”、“禁止通行”三個(gè)功能,每次按鍵輸入的時(shí)候,會(huì)對(duì)按鍵進(jìn)行軟件消抖,從而保證按鍵的準(zhǔn)確輸入。
基本要求
a顯示電路采用七段共陰極數(shù)碼管顯示,南北方向的數(shù)碼管的段選端分別與P2端口的P2.0~P2.7相連,位選端分別與P1.2和P1.3相連;東西方向的數(shù)碼管的段選端也與P2端口的P2.0~P2.7相連,位選端分別與P1.0和P1.1相連
b. 實(shí)現(xiàn)這三個(gè)功能:東西通行、南北通行、禁止通行。
在以上設(shè)計(jì)基礎(chǔ)上,在單片機(jī)的P1.0-P1.3口分別接入4個(gè)按鍵:
- 東西方向和南北方向的通行時(shí)間輸入和輸入時(shí)間的顯示
- 在綠燈亮起時(shí),添加聲音提示行人通行。
3.設(shè)計(jì)原理圖
4.數(shù)字鐘程序流程圖

圖9.3 智能交通燈控制主程序流程圖

代碼:
- #include <reg51.h> //包含MCS-51單片機(jī)頭文件
- #define uchar unsigned char //定義宏uchar
- #define uint unsigned int //定義宏uint
- sbit P1_0 =P1^0; //定義單片機(jī)IO口P1.0
- sbit P1_1 =P1^1; //定義單片機(jī)IO口P1.1
- sbit P1_2 =P1^2; //定義單片機(jī)IO口P1.2
- sbit P1_3 =P1^3; //定義單片機(jī)IO口P1.3
- sbit ew_red=P0^0; //定義單片機(jī)IO口P0.0為東西方向紅燈控制位
- sbit ew_yellow=P0^1; //定義單片機(jī)IO口P0.1為東西方向黃燈控制位
- sbit ew_green=P0^2; //定義單片機(jī)IO口P0.2為東西方向綠燈控制位
- sbit sn_red=P0^3; //定義單片機(jī)IO口P0.3為南北方向紅燈控制位
- sbit sn_yellow=P0^4; //定義單片機(jī)IO口P0.4為南北方黃燈控制位
- sbit sn_green=P0^5; //定義單片機(jī)IO口P0.5為南北方向綠燈控制位
- sbit key_earth_west=P3^2; //定義單片機(jī)IO口P3.2東西方向通行控制按鍵
- sbit key_sourth_north= P3^3; //定義單片機(jī)IO口P3.3南北方向通行控制按鍵
- sbit all_not=P3^4; //定義單片機(jī)IO口P3.4為全部禁行控制位
- sbit key_earth_west_add=P3^0; //定義單片機(jī)IO口P3.0為東西加
- sbit key_earth_west_jian= P3^1; // 定義單片機(jī)IO口P3.1為東西減
- sbit key_sourth_north_add=P3^5; // 定義單片機(jī)IO口P3.5為南北加
- sbit key_sourth_north_jian= P3^6; // 定義單片機(jī)IO口P3.6為南北減
- uchar code s7_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //七段碼顯示表
- uchar a,b,c,d; //定義東西南北時(shí)間
- uchar sou_nor_time; //南北通行時(shí)間變量定義
- uchar east_weat_time; //東西通行時(shí)間變量定義
- uchar time_flag; //時(shí)間標(biāo)志位定義
- uchar traffic_flag; //traffic_flag=0時(shí)南北通行,traffic_flag=1時(shí)東西通行
- uchar time_multiply; //定義計(jì)時(shí)變量
- void delayms(uchar z) //延時(shí)子程序
- {
- uchar i,j; //定義變量i,j
- for(i=z;i>0;i--) //for循環(huán),共循環(huán)z次
- for(j=110;j>0;j--); //for循環(huán),共循環(huán)j次
- }
- void display_time( ) //顯示倒計(jì)時(shí)子程序
- {
- P1_0 =0; //P1.0輸出低電平,位選使能
- P1_1 =1; //P1.1輸出高電平
- P1_2 =1; //P1.2輸出高電平
- P1_3 =1; //P1.3輸出高電平
- P2=s7_table[a/10]; //P2端口輸出顯示的段碼
- delayms(2); //延時(shí)2毫秒
- P2=0; //P2端口輸出低電平
- P1_0 =1; //P1.0輸出高電平
-
- P1_1 =0; //P1.1輸出低電平,位選使能
- P2=s7_table[b%10]; //P2端口輸出顯示的段碼
- delayms(2); //延時(shí)2毫秒
- P2=0; //P2端口輸出低電平
- P1_1 =1; //P1.1輸出高電平
-
- P1_2 =0; //P1.2輸出低電平,位選使能
- P2=s7_table[(c)/10]; //P2端口輸出顯示的段碼
- delayms(2); //延時(shí)2毫秒
- P2=0; //P2端口輸出低電平
- P1_2 =1; //P1.2輸出高電平
-
- P1_3 =0; //P1.3輸出低電平,位選使能
- P2=s7_table[(d)%10]; //P2端口輸出顯示的段碼
- delayms(2); //延時(shí)2毫秒
- P2=0; //P2端口輸出低電平
- P1_3 =1; //P1.3輸出高電平
- }
- void south_north_allow() //南北通行允許子程序
- {
- ew_red=0; //東西方向紅燈亮
- ew_green=1; //東西方向綠燈熄滅
- ew_yellow=1; //東西方向黃燈熄滅
-
- sn_red=1; //南北方向紅燈熄滅
- sn_green=0; //南北方向綠燈亮
- sn_yellow=1; //南北方向黃燈熄滅
- }
- void east_west_allow() //東西通行允許子程序
- {
- ew_red=1; //東西方向紅燈熄滅
- ew_green=0; //東西方向綠燈亮
- ew_yellow=1; //東西方向黃燈熄滅
- sn_red=0; //南北方向紅燈亮
- sn_green=1; //南北方向綠燈熄滅
- sn_yellow=1; //南北方向綠燈熄滅
- }
- void init0_timer0() //定時(shí)器0初始化子程序
- {
- TMOD=0X01; //定時(shí)器0設(shè)置為模式1
- TH0=(65536-50000)/256; //TH0裝載初值
- TL0=(65536-50000)%256; //TL0裝載初值
- ET0=1; //開啟定時(shí)器中斷
- EA=1; //開啟CPU中斷
- TR0=1; //啟動(dòng)定時(shí)器T0
- }
- void keyscan() //鍵盤掃描子程序
- {
- if(key_sourth_north==0) //判斷南北通行控制按鍵是否按下
- {
- delayms(2); //延時(shí)2毫秒
- if(key_sourth_north==0) //再次判斷南北通行控制按鍵是否按下
- {
- south_north_allow(); //調(diào)用南北通行子程序
- while(!key_sourth_north) display_time(); //南北通行時(shí),
- //顯示通行倒計(jì)時(shí)
- TR0=0; //南北通行結(jié)束,關(guān)閉定時(shí)器T0
-
- }
- }
- if(key_earth_west==0) //判斷東西通行控制按鍵是否按下
- {
- delayms(2); //延時(shí)2毫秒
- if(key_earth_west==0) //再次判斷東西通行控制按鍵是否按下
- {
- east_west_allow(); //調(diào)用東西通行子程序
- while(!key_earth_west) display_time(); //東西通行時(shí),
- //顯示通行倒計(jì)時(shí)
- TR0=0; //東西通行結(jié)束,關(guān)閉定時(shí)器T0
- }
- }
- if(all_not==0) //判斷全部禁行按鍵是否按下
- {
- delayms(2); //延時(shí)2毫秒
- if(all_not==0) //再次全部禁行按鍵是否按下
- {
- TR0=0; //進(jìn)入全部禁行子程序,關(guān)閉定時(shí)器T0
- ew_red=0; //東西方向紅燈亮
- ew_green=1; //東西方向綠燈熄滅
- ew_yellow=1; //東西方向黃燈熄滅
- sn_red=0; //南北方向紅燈亮
- sn_green=1; //南北方向綠燈熄滅
- sn_yellow=1; //南北方向黃燈熄滅
- }
- }
- if(key_earth_west_add==0) // 東西時(shí)間+1
- {
- delayms(200);
- if(key_earth_west_add==1)
- {
- east_weat_time=east_weat_time+1;
- time_flag=time_flag+1;
- }
- }
- if(key_earth_west_jian==0) //東西時(shí)間-1
- {
- delayms(200);
- if(key_earth_west_jian==1)
- {
- east_weat_time=east_weat_time-1;
- time_flag=time_flag-1;
- }
- }
- if(key_sourth_north_add==0) //南北時(shí)間+1
- {
- delayms(200);
- if(key_sourth_north_add==1)
- {
- sou_nor_time=sou_nor_time+1;
- time_flag=time_flag+1;
- }
- }
- if(key_sourth_north_jian==0) //南北時(shí)間-1
- {
- delayms(200);
- if(key_sourth_north_jian==1)
- {
- sou_nor_time=sou_nor_time-1;
- time_flag=time_flag-1;
- }
- }
- }
-
- void main() //主程序
- {
- sou_nor_time=15; //初始化南北通行時(shí)間為15秒
- east_weat_time=6; //初始化東西通行時(shí)間為6秒
- traffic_flag=0; //初始化,南北通行
- time_flag=sou_nor_time; //設(shè)置南北通行的時(shí)間
- time_multiply =0; //計(jì)時(shí)變量初始化
-
- init0_timer0(); //調(diào)用定時(shí)器T0初始化子程序
- south_north_allow(); //調(diào)用南北通行允許子程序
-
- while(1) // while(1)無(wú)限循環(huán)
- {
- keyscan(); //調(diào)用鍵盤掃描子程序
- display_time(); //調(diào)用顯示倒計(jì)時(shí)子程序
- }
- }
- void int0_isr() interrupt 1 //定時(shí)器T0中斷服務(wù)程序
- {
- TH0=(65536-50000)/256; //TH0裝載初值
- TL0=(65536-50000)%256; //TL0裝載初值
- time_multiply++; //計(jì)時(shí)變量加1
- if(time_multiply>=20) //判斷計(jì)時(shí)變量是否大于20
- {
- time_multiply=0; //計(jì)時(shí)變量大于20,則把計(jì)時(shí)變量清零
- time_flag--; //倒計(jì)時(shí)的秒數(shù)減1
-
- if(traffic_flag==0) //若traffic_flag為0,則進(jìn)入南北通行模式
- {
- if(time_flag>2) //南北通行倒計(jì)時(shí)進(jìn)行中
- {
- south_north_allow();//南北通行紅綠燈輸出
- a=time_flag;
- b=time_flag;
- c=time_flag-3;
- d=time_flag-3;
- }
- else if(time_flag>0) //若倒計(jì)時(shí)時(shí)間小于2秒
- {
- sn_red=1;
- sn_green=1;
- sn_yellow=0; //此時(shí)南北黃燈亮2秒
- ew_red=0; //此時(shí)東西仍然是紅燈亮
- ew_green=1;
- ew_yellow=1;
- a=time_flag;
- b=time_flag;
- c=0;
- d=0;
-
- }
- else
- {
- traffic_flag=1; //此時(shí)南北通行計(jì)時(shí)結(jié)束,改為東西通行模式
- time_flag= east_weat_time; //東西通行時(shí)間變量賦值
- }
- }
- if(traffic_flag==1) //此時(shí)為東西通行模式
- {
- if(time_flag>2) //東西通行計(jì)時(shí)未結(jié)束
- {
- east_west_allow(); //東西通行紅綠燈輸出
- c=time_flag; //北時(shí)間
- d=time_flag; //南時(shí)間
- a=time_flag-3; //西時(shí)間
- b=time_flag-3; //東時(shí)間
-
- }
- else if(time_flag>0)
- {
-
- ew_red=1; //此時(shí)東西黃燈亮2秒
- ew_green=1;
- ew_yellow=0;
- sn_red=0; //此時(shí)南北仍然是紅燈亮
- sn_green=1;
- sn_yellow=1;
- c=time_flag;
- d=time_flag;
- a=0;
- b=0;
- }
- else
- {
- traffic_flag=0; //此時(shí)東西通行計(jì)時(shí)結(jié)束,改為東西通行模式
- time_flag= sou_nor_time; //南北通行時(shí)間變量賦值
- }
- }
- }
- else if(time_multiply>=10) //判斷計(jì)時(shí)變量是否大于20
- {
- if(traffic_flag==0) //若traffic_flag為0,則進(jìn)入南北通行模式
- {
- if(time_flag>2) //南北通行倒計(jì)時(shí)進(jìn)行中
- {
- south_north_allow();//南北通行紅綠燈輸出
- }
- else if(time_flag>0) //若倒計(jì)時(shí)時(shí)間小于2秒
- {
- sn_red=1;
- sn_green=1;
- sn_yellow=1; //此時(shí)南北黃燈亮2秒
- ew_red=0; //此時(shí)東西仍然是紅燈亮
- ew_green=1;
- ew_yellow=1;
- }
- else
- {
- traffic_flag=1; //此時(shí)南北通行計(jì)時(shí)結(jié)束,改為東西通行模式
- time_flag= east_weat_time; //東西通行時(shí)間變量賦值
- }
- }
- if(traffic_flag==1) //此時(shí)為東西通行模式
- {
- if(time_flag>2) //東西通行計(jì)時(shí)未結(jié)束
- {
- east_west_allow(); //東西通行紅綠燈輸出
- }
- else if(time_flag>0)
- {
-
- ew_red=1; //此時(shí)東西黃燈亮2秒
- ew_green=1;
- ew_yellow=1;
- sn_red=0; //此時(shí)南北仍然是紅燈亮
- sn_green=1;
- sn_yellow=1;
- }
- else
- {
- traffic_flag=0; //此時(shí)東西通行計(jì)時(shí)結(jié)束,改為東西通行模式
- time_flag= sou_nor_time; //南北通行時(shí)間變量賦值
- }
- }
- }
- }
復(fù)制代碼
-
-
實(shí)驗(yàn)一.doc
2018-10-15 14:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
176 KB, 下載次數(shù): 151, 下載積分: 黑幣 -5
作者: dogjijrk 時(shí)間: 2018-12-24 16:35
真的是非常的有用
作者: 小黑子. 時(shí)間: 2019-9-4 15:50
樓主厲害
作者: 小黑子. 時(shí)間: 2019-9-4 15:51
很有用謝謝分享
作者: 564571362 時(shí)間: 2019-9-8 16:31
樓主厲害,感謝分享
作者: definemexueba 時(shí)間: 2019-10-2 21:03
下載了附件但是仿真圖還是看不清楚呢
作者: hy980903 時(shí)間: 2019-10-9 17:44
你這個(gè)原理圖看不清楚啊,有沒有清楚點(diǎn)的圖啊
作者: wm120054 時(shí)間: 2020-3-30 22:18
定時(shí)器中斷服務(wù)程序這么長(zhǎng)行嗎
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
欧美久
|
在线免费观看亚洲
|
日韩美女一区二区三区在线观看
|
亚洲精品乱码久久久久久蜜桃
|
中文在线观看视频
|
精品亚洲永久免费精品
|
成人小视频在线观看
|
99久久婷婷国产综合精品电影
|
国产美女视频
|
99成人|
二区三区av
|
久久精品91|
国产成人99av超碰超爽
|
日韩精品在线观看一区二区
|
欧美激情精品久久久久
|
男人天堂网址
|
久久精品亚洲精品国产欧美kt∨
|
久久久精品一区
|
欧美激情五月
|
国产乱码精品一区二区三区忘忧草
|
国产日韩电影
|
国产精品久久久免费
|
一区二区在线看
|
国产精品久久久久久久久久不蜜臀
|
www.久久久久久久久
|
国产乡下妇女做爰
|
国产性生活一级片
|
www亚洲免费国内精品
|
亚洲精品日韩在线
|
久久久久久久99
|
99这里只有精品视频
|
亚洲三级在线观看
|
免费亚洲网站
|
久久精品成人一区
|
精品国产91
|
国产日韩电影
|
国产精品永久
|
成人影院av|
色999视频
|
亚洲一区在线免费观看
|
日本中文字幕日韩精品免费
|