#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define THVL -50000/256
#define TLVL -50000%256
#define LRA 0XEE
#define ERNG 0XEB
#define ERNY 0XED
#define EGNR 0XBE
#define EYNR 0XDE
uchar i,j;
/**************************************************************/
//定义全局变量
uint
time_Count=0; //延时倍数
uchar Flash_Count=0; //闪烁次数
uchar Operation_Type=0; //操作类型
//0:全红;1:东西红灯南北绿灯;2:东西红灯南北黄灯
//3: 东西绿灯南北红灯; 4: 东西黄灯南北红灯
/**************************************************************/
//T0中断函数
void T0_INT()interrupt 1
{ TH0=THVL;
TL0=TLVL;
switch(Operation_Type)
{
/**************************************************************/
//东西南北全红灯 5秒
case 0:
P1=LRA;
if(++Time_Count!=50) return;
Time_Count=0;
Operation_Type=1;
P1=ERNG;
break;
这是个交通灯的C 我想知道
++Time_Count!=50 这一句的工作原理 就是让等怎么变换的 为什么?
#define uchar unsigned char
#define uint unsigned int
#define THVL -50000/256
#define TLVL -50000%256
#define LRA 0XEE
#define ERNG 0XEB
#define ERNY 0XED
#define EGNR 0XBE
#define EYNR 0XDE
uchar i,j;
/**************************************************************/
//定义全局变量
uint Time_Count=0; //延时倍数
uchar Flash_Count=0; //闪烁次数
uchar Operation_Type=0; //操作类型
//0:全红;1:东西红灯南北绿灯;2:东西红灯南北黄灯
//3: 东西绿灯南北红灯; 4: 东西黄灯南北红灯
/**************************************************************/
//T0中断函数
void T0_INT()interrupt 1
{ TH0=THVL;
TL0=TLVL;
switch(Operation_Type)
{
/**************************************************************/
//东西南北全红灯 5秒
case 0:
P1=LRA;
if(++Time_Count!=50) return;
Time_Count=0;
Operation_Type=1;
P1=ERNG;
break;
/**************************************************************/
//东西红灯南北绿灯 10秒
case 1:
if(++Time_Count!=200) return;
Time_Count=0;
Operation_Type=2;
P1=ERNY;
break;
/**************************************************************/
//东西红灯南北黄灯 3秒
case 2:
if(++Time_Count!=10) return;
Time_Count=0;
P1^=0X02; //对黄灯位取反
//闪烁3次
if(++Flash_Count!=6)return;
Flash_Count=0;
Operation_Type=3;
P1=EGNR;
break;
/**************************************************************/
//东西绿灯南北红灯 10秒
case 3:
if(++Time_Count!=200) return;
Time_Count=0;
Operation_Type=4;
P1=EYNR;
break;
/**************************************************************/
//东西黄灯南北红灯 3秒
case 4:
if(++Time_Count!=10) return;
Time_Count=0;
P1^=0X20; //对黄灯位取反
//闪烁3次
if(++Flash_Count!=6)return;
Flash_Count=0;
Operation_Type=1;
P1=ERNG;
break;
}
}
/**************************************************************/
//延时函数
void delay10s()
{ uchar k;
for(k=0;k<200;k++)
{
TH1=THVL;
TL1=TLVL;
TR1=1;
while(!TF1);
TF1=0;
}
}
/**************************************************************/
//外中断0函数
void INT_0() interrupt 0 using 1
{
P1=LRA;
delay10s();
}
/**************************************************************/
/*主函数*/
/**************************************************************/
void main()
{
TMOD=0X11;
TH0=THVL;
TL0=TLVL;
TR0=1;
TH1=THVL;
TL1=TLVL;
ET0=1;
IT0=1;
EX0=1;
PX0=1;
EA=1;
while(1);
}
一周热门 更多>