求各位大佬我這個程序是交通信號燈,需要在報警的時候加一個直流電機轉動,應該怎樣添加程序  #include<reg52.h> //頭文件 #include"lcd.h" typedef unsigned int u16; //對數據類型進行聲明定義 typedef unsigned char u8; uchar show_l[] = {0x3c,0x42,0x42,0x3c,0x42,0xc3,0x7e,0x24}; //無符號字符型 unsigned char Second[]="Second: "; //8 unsigned char Help_msg[]="your call 110 "; unsigned char Clean_msg[]=" "; sbit YELLOW =P1^0; // 黃燈 sbit GREEN =P1^1; // 綠燈 sbit RED =P1^2; // 紅燈 sbit BEEP=P1^4; // 報警 sbit KEY_1=P3^4; // 按鍵1按下紅燈時間增加 sbit KEY_2=P3^5; // 按鍵2按下紅燈時間減少 sbit KEY_3=P1^3; // 按鍵3按下報警 sbit E1_138=P3^3; // 74LS138的E1 譯碼器 sbit A_138=P3^0; // 74LS138的A sbit B_138=P3^1; // 74LS138的B sbit C_138=P3^2; // 74LS138的C #define DZ P0 //定義點陣驅動IO口 u8 count; u8 green_count =10; 計時 void leddz_show(uchar *show); void Timer0Init() 定時器0 { TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。 TH0=0XFC; //給定時器賦初值,定時1ms 高電平 TL0=0X18; 低電平 ET0=1;//打開定時器0中斷允許 EA=1;//打開總中斷 TR0=1;//打開定時器 } void Delay10us(u8 z)//延時函數 { u8 x,y; for(x=z;x>0;x--) for(y=210;y>0;y--); } void Delay10Ms(u8 z)//延時函數 { unsigned char i, j; while(z--) { i = 150; j = 200; do { while (--j); } while (--i); } } void main() { count=0;// 循環的周期 E1_138 = 0; //關閉點陣顯示 DZ = 0; Timer0Init();//初始化計數器 LcdInit(); //LCD1602初始化 YELLOW = 1; //黃燈關閉 GREEN = 1; //綠燈關閉 RED =1; //紅燈關閉 LcdWriteStr(1,16,Second); //LCD1602顯示 第一行 while(1) 無限循環 { if(KEY_1 & KEY_2 & KEY_3) //如果沒有按鍵按下 { if( count >= (13+green_count)) //如果計數超過1個周期重新計數 { count=0; } if(count<10)//如果在15秒以內亮綠燈 { LcdWriteCom(0x88); LcdWriteData((10-count)/10+0x30); LcdWriteData((10-count)%10+0x30); GREEN = 1; YELLOW = 1; RED = 0; } else if(count<13)//如果超過15秒低于18秒亮黃燈 { LcdWriteCom(0x88); LcdWriteData((13-count)/10+0x30); LcdWriteData((13-count)%10+0x30); GREEN = 1; YELLOW = 0; RED = 1; } else if( count< (green_count+13) )//如果超過紅燈18秒亮紅燈 { LcdWriteCom(0x88); LcdWriteData(((13+green_count)-count)/10+0x30); LcdWriteData(((13+green_count)-count)%10+0x30); GREEN = 0; YELLOW =1; RED = 1; } } else//如果有按鍵按下 { if(KEY_1 == 0) //如果按下按鍵1 { if(green_count<=30) //如果紅燈時間沒有超過30秒 { green_count ++; //紅燈時間增加 } while(!KEY_1);//等待按鍵1釋放 } if(KEY_2 == 0)//如果按下按鍵2 { if(green_count>=5)//如果紅燈時間大于5秒 { green_count --;//紅燈時間減少 } while(!KEY_2 == 0); //等待按鍵2釋放 } if(KEY_3 == 0)//如果按下按鍵3 { BEEP = 0; //蜂鳴器報警 LcdWriteStr(2,16,Help_msg);//顯示報警信息 E1_138 = 1;//使能點陣 while(!KEY_3)//等待釋放按鍵3 { leddz_show(show_l); } E1_138 = 0;//釋放按鍵后關閉點陣 關閉蜂鳴器 清除LCD1602警報信息 BEEP = 1; 蜂鳴器 LcdWriteStr(2,16,Clean_msg); 清除 } } } } void Timer0() interrupt 1 中斷函數0定時器0 { static u16 i; 兩字節的無符號整型 靜態分配 TH0=0XFC; //給定時器賦初值,定時1ms TL0=0X18; i++; if(i==1000) { i=0; count ++; } } void leddz_show(uchar *show) { uchar i; for(i =0;i<8;i++) { P0 = *show++; P3 = i | 0XF8; Delay10us(10); P0 = 0;//消影 } }
|