資料包內容:
0.png (10.07 KB, 下載次數: 83)
下載附件
2017-12-13 01:43 上傳
課程設計論文模板:
0.jpg (43.43 KB, 下載次數: 89)
下載附件
2017-12-13 01:45 上傳
0.jpg (96.13 KB, 下載次數: 91)
下載附件
2017-12-13 01:46 上傳
0.jpg (72.14 KB, 下載次數: 76)
下載附件
2017-12-13 01:46 上傳
0.jpg (59.79 KB, 下載次數: 84)
下載附件
2017-12-13 01:47 上傳
目錄
摘要 I
1 課程論文內容與要求: I
2 硬件系統的設計 I
2.1 各元器件選擇及其功能介紹 I
2.2 STC89C5X II
2.3 單片機最小系統 VI
2.4 緊急通行模塊 IX
2.5 忙等通行模塊 X
2.6 總電路圖 X
3 軟件系統的設計 XII
3.1 概要設計 XII
3.1.1 程序流程圖 XII
4 系統調試 XIII
4.1 功能測試 XIII
4.1.1 正常運行模塊 XIII
4.1.2 緊急通行模塊 XIV
4.1.3 忙等通行模塊 XIV
5 收獲與體會 XVI
附錄 I
源程序清單 I
參考文獻 I
單片機源程序如下:
- /**************************************************************************************
- * 交通燈實驗 *
- 實現現象:模仿交通燈運作
- 注意事項:無
- ***************************************************************************************/
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- void delay();
- void display();
- void TrafficStart();
- void TrafficStop();
- void ledInit();
- void changeNSpass();
- void changeEWpass();
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef char u8;
- u8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};
- u8 code stop[]={0xbf}; //1011 1111
- u8 time1=3; //東西方向 第一位數字
- u8 time2=0; //東西方向 第二位數字
- u8 time3=2; //南北方向 第一位數字
- u8 time4=5; //南北方向 第一位數字
- u8 change=0; //東西方向狀態改變,初始為0 0為紅燈 1為綠燈 2為黃燈
- u8 change1=2; //南北方向狀態改變,初始為2 0為紅燈 1為綠燈 2為黃燈
- u8 ledset=0; //緊急狀態標志位,0為允許緊急狀態啟動
- u8 templed=2; //LED燈臨時記錄,初始為2 0為綠燈 1為黃燈 2為紅燈
- u8 templed1=5; //LED燈臨時記錄,初始為5 3為綠燈 4為黃燈 5為紅燈
- u8 count=0; //緊急狀態按鍵計數
- u8 count1=0; //方向轉變計數
- sbit led0=P1^0; //將P1^0口定義為led0 綠色1
- sbit led1=P1^1; //將P1^1口定義為led1 黃色1
- sbit led2=P1^2; //將P1^2口定義為led2 紅色1
- sbit led3=P1^3; //將P1^0口定義為led3 綠色2
- sbit led4=P1^4; //將P1^1口定義為led4 黃色2
- sbit led5=P1^5; //將P1^2口定義為led5 紅色2
- sbit CK1 = P2^3; //東西方向第一位數碼管
- sbit CK2 = P2^2; //東西方向第二位數碼管
- sbit CK3 = P2^1; //南北方向第一位數碼管
- sbit CK4 = P2^0; //南北方向第二位數碼管
- sbit key2 = P3^0;
- sbit key3 = P3^1;
- sbit key4 = P3^2;
- void delay(u16 i)
- {
- while(i--);
- }
- void display(u8 time1,u8 time2,u8 time3,u8 time4);
- /*******************************************************************************
- * 函 數 名 : Timer1Init
- * 函數功能 : 定時器1初始化
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer1Init()
- {
- TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
- TH1=0X3c; //給定時器賦初值,定時50ms
- TL1=0Xb0;
- ET1=1;//打開定時器1中斷允許
- EA=1;//打開總中斷
- TR1=1;//打開定時器
- }
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- CK1=0;
- CK2=0;
- led2=0;
- led3=0;
- Timer1Init(); //定時器1初始化
- while(1)
- {
- //*******************************************************************************
- if(key3==0&&count%2==0){ //當按下key3并且狀態為運行狀態時有效
- delay(1000);
- if(key3==0&&count%2==0)
- {
- TR1=0; //關閉定時器,防止切換時仍然計時
- count1++;
- if(count1%2==1){ //(非紅燈狀態下允許執行)
- TR1=1; //打開定時器
- changeEWpass();
- }
- if(count1%2==0){
- TR1=1;
- changeNSpass();
- }
- }
- while(!key3);
- }
- //*******************************************************************************
- if(key2==0){
- delay(1000);
- if(key2==0)
- {
- count++;
- }
- while(!key2);
- }
- if(count%2==0){ //為0則將狀態恢復為運行狀態
- if(ledset==0){ //判斷上次是否為緊急狀態
- ledset=1;
- ledInit();
- templed=2; //東西方向初始化為紅燈,由于執行了ledInit()會改變它的值,所以需要初始化,防止上個數值再次被利用(實際上只需要非0或1就行)
- templed1=5; //南北方向初始化為紅燈,由于執行了ledInit()會改變它的值,所以需要初始化,防止上個數值再次被利用(實際上只需要非3或4就行)
- }
- TrafficStart(); //正常狀態下while會死循環該語句,該語句為動態顯示數字函數
- }
- if(count%2==1){ //為1將狀態修改為緊急狀態
- ledset=0;
- TrafficStop();
- }
-
- }
- }
- /*******************************************************************************
- * 函 數 名 : void Timer1() interrupt 3
- * 函數功能 : 定時器1中斷函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer1() interrupt 3
- {
- static u16 i;
- TH1=0X3c; //給定時器賦初值,定時50ms
- TL1=0Xb0;
- i++;
- if(i==20) //i等20時為1秒
- {
- i=0;
- //-------------------------------------東西 方向-------------------------------------
- time2--;
- if(time2==-1&&time1!=0){
- time1--;
- time2=9;
- }
- if((time2==0&&time1==0)){
- if(change==0){ //東西方向 如果為紅燈
- change=1; //下次為綠燈
- time1=5;
- time2=0;
- led2=1;
- led1=1;
- led0=0; //綠燈亮
- count1++; //紅燈轉綠燈時計數加1,否則執行方向轉變時按鍵會無效(閃一下而不變向)
- }
- else if(change==1){ //東西方向 如果為綠燈
- change=2; //下次為黃燈
- time1=1;
- time2=0;
- led2=1;
- led1=0;
- led0=1;
- }
- else if(change==2){ //東西方向 如果為黃燈
- change=0; //下次為紅燈
- time1=3;
- time2=0;
- led2=0;
- led1=1;
- led0=1;
-
- }
- }
- //-------------------------------------南北 方向-------------------------------------
- time4--;
- if(time4==-1&&time3!=0){
- time3--;
- time4=9;
- }
- if(time4==0&&time3==0){
- if(change1==2){ //南北方向 如果為綠燈
- change1=1; //下次為黃燈
- time3=0;
- time4=5;
- led3=1;
- led4=0;
- led5=1;
- }
- else if(change1==1){ //南北方向 如果為黃燈
- change1=0; //下次為紅燈
- time3=6;
- time4=0;
- led3=1;
- led4=1;
- led5=0;
- }
- else if(change1==0){ //南北方向 如果為紅燈
- change1=2; //下次為綠燈
- time3=2;
- time4=5;
- led3=0;
- led4=1;
- led5=1;
- count1++; //紅燈轉綠燈時計數加1,否則執行方向轉變時按鍵會無效(閃一下而不變向)
-
- }
- }
- //------------------------------------------------------------------------------------
- }
- }
- void display(u8 time1,u8 time2,u8 time3,u8 time4) //顯示程序
- {
- P0=table[time1];
- CK1=0;
- delay(100);
- CK1=1;
- P0=table[time2];
- CK2=0;
- delay(100);
- CK2=1;
- P0=table[time3];
- CK3=0;
- delay(100);
- CK3=1;
- P0=table[time4];
- CK4=0;
- delay(100);
- CK4=1;
- }
- void TrafficStart()
- {
- TR1=1;//打開定時器
- display(time1,time2,time3,time4);
- }
- void TrafficStop()
- {
- TR1=0;//關閉定時器
- CK1=CK2=CK3=CK4=0;
- P0=stop[0];
- if(led0==0){
- templed=0; //記錄當前燈狀態 東西方向
- led0=1; //將原來燈熄滅
- led2=0; //亮紅燈
- }
- if(led1==0){
- templed=1;
- led1=1;
- led2=0;
- }
- if(led3==0){
- templed1=3; //記錄當前燈狀態 南北方向
- led3=1;
- led5=0;
- }
- if(led4==0){
- templed1=4;
- led4=1;
- led5=0;
- }
- }
- void ledInit()
- {
- if(templed==0){ //恢復緊急狀態前時的燈狀態 東西方向
- led2=1; //熄滅其他燈
- led1=1; //熄滅其他燈
- led0=0; //恢復燈的狀態
- }
- if(templed==1){
- led2=1;
- led1=0;
- led0=1;
- }
- if(templed1==3){ //恢復緊急狀態前時的燈狀態 南北方向
- led5=1; //熄滅其他燈
- led4=1; //熄滅其他燈
- led3=0; //恢復燈的狀態
- }
- if(templed1==4){
- led5=1;
- led4=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
單片機大作業.rar
(3.65 MB, 下載次數: 46)
2017-12-12 20:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|