標題: 交通信號燈程序添加直流電機程序跪求 [打印本頁]
作者: lvzhicheng 時間: 2020-6-3 14:47
標題: 交通信號燈程序添加直流電機程序跪求
求各位大佬我這個程序是交通信號燈,需要在報警的時候加一個直流電機轉動,應該怎樣添加程序

#include<reg52.h> //頭文件
#include"lcd.h"
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
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)//延時函數(shù)
{
u8 x,y;
for(x=z;x>0;x--)
for(y=210;y>0;y--);
}
void Delay10Ms(u8 z)//延時函數(shù)
{
unsigned char i, j;
while(z--)
{
i = 150;
j = 200;
do
{
while (--j);
} while (--i);
}
}
void main()
{
count=0;// 循環(huán)的周期
E1_138 = 0; //關閉點陣顯示
DZ = 0;
Timer0Init();//初始化計數(shù)器
LcdInit(); //LCD1602初始化
YELLOW = 1; //黃燈關閉
GREEN = 1; //綠燈關閉
RED =1; //紅燈關閉
LcdWriteStr(1,16,Second); //LCD1602顯示 第一行
while(1) 無限循環(huán)
{
if(KEY_1 & KEY_2 & KEY_3) //如果沒有按鍵按下
{
if( count >= (13+green_count)) //如果計數(shù)超過1個周期重新計數(shù)
{
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 中斷函數(shù)0定時器0
{
static u16 i; 兩字節(jié)的無符號整型 靜態(tà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;//消影
}
}
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |