Eecode真题
源代码转自:51单片机C语言创新教程。
/*实验名称:红绿灯实验
*说明:红绿灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒。
当红灯切换到绿灯或者绿灯切换到红灯时,
?以实现闪烁的灯光。可以通过串口修改红灯、绿灯、黄灯的点亮时长。
?并在下一个周期更新该值。
*作者:温梓岐
*修订日期:2010/5/4
*注:代码注释和解释请参考温梓岐等主编的《51单片机C语言创新教程》,北航出版社。
*/
#包含?" stc.h "
typedef?未签名?夏尔?UINT8
typedef?未签名?int uit 16;
typedef?未签名?龙?UINT32
typedef?charINT8
typedef?int?int 16;
typedef?longINT32
#定义?定时器0 _初始值?5000
#定义?高?1
#定义?低0
#定义?开?1
#定义?OFF0
#定义?SEG_PORT?p0蛋白
#定义?ls 164 _ DATA(x){ if((x))P0 _ 4 = 1;不然呢?P0 _ 4 = 0;}?
#定义?LS164_CLK(x)?{ if((x))P0 _ 5 = 1;不然呢?P0 _ 5 = 0;}?
#定义?NORTH_R_LIGHT(x)?{ if((x))P2 _ 0 = 0;不然呢?P2 _ 0 = 1;}
#定义?北Y光(x)?{ if((x))P2 _ 1 = 0;不然呢?P2 _ 1 = 1;}
#定义?北_ G _光(x)?{ if((x))P2 _ 2 = 0;不然呢?P2 _ 2 = 1;}
#定义?南R光(x)?{ if((x))P2 _ 3 = 0;不然呢?P2 _ 3 = 1;}
#定义?南光(x)?{ if((x))P2 _ 4 = 0;不然呢?P2 _ 4 = 1;}
#定义?SOUTH_G_LIGHT(x)?{ if((x))P2 _ 5 = 0;不然呢?P2 _ 5 = 1;}
#定义?TRAFFIC_STATUS_1?0
#定义?流量_状态_2?1
#定义?流量_状态_3?2
#定义?UART_MARKER0xEE
uint 8 timer 0 IRQ event = 0;
uint 8 time 1 sec event = 0;
uint 8 time 500 msevent = 0;
uint 8 time count = 0;
uint 8 segcurposition = 0;
uint 8 lightorgcount[4]= { 15,5,15,5 };
uint 8 lightcurcount[4]= { 15,5,15,5 };
uint 8 trafficilightstatus = 0;
代码?UINT8SegCode[10]?={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x 90 };
UINT8SegBuf[4]?={0};
代码?UINT8SegPosition[4]={0x07,0x0b,0x0d,0x0e };
typedef?struct?_灯光_瓦尔
{
UINT8?头;?
UINT8?val[4];?
} LIGHT _ VAL
typedef?工会?_LIGHT_VAL_EX
{
LIGHT_VAL?吕;
uint 8 p[5];?
} LIGHT _ VAL _ EX
作废?LS164Send(UINT8?字节)
{
UINT8?j;
for(j = 0;j & lt=7;j++)
{
如果(字节& amp(1 & lt;& lt(7-j)))
{
LS164_DATA(高);
?}
?其他
?{
LS164_DATA(低);
?}
LS164_CLK(低);?
LS164_CLK(高);
}
}
作废?RefreshDisplayBuf(UINT8?s1)?//刷新显示缓存
{
SegBuf[0]?=?s 1% 10;
SegBuf[1]?=?s 1/10;
SegBuf[2]?=?s 1% 10;
SegBuf[3]?=?s 1/10;
}
作废?分段显示(空)
{
UINT8t
t?=?seg code[seg buf[SegCurPosition]];?
SEG_PORT?|=?0x0f
ls 164 send(t);?
SEG_PORT?=?(SEG_PORT|0x0f)?& amp?seg position[SegCurPosition];
if(++SegCurPosition & gt;=4)?
{
SegCurPosition = 0;
}
}
作废?TimerInit(无效)
{
TH1?=?0;
TL1?=?0;?
TH0?=?(65536-定时器0 _初始值)/256;
TL0?=?(65536-定时器0 _初始值)% 256;?//计时1毫秒
TMOD?=?0x 51;/*01010001?T1计数,T0计时*/
}
作废?定时器0启动(无效)
{
TR0?=?1;//启动定时器1?
?ET0?=?1;
}
作废?定时器0停止(无效)
{
TR0?=?0;//启动定时器1?
ET0?=?0;
}
作废?PortInit(void)
{
?P0 = p 1 = P2 = P3 = 0x ff;
}
作废?UartInit(无效)
{
SCON = 0x 40;
T2CON = 0x34
RCAP2L = 0xD9
RCAP2H = 0xFF
任= 1;
ES = 1;
}
作废?UartSendByte(UINT8?字节)
{
SBUF =字节;
while(TI = = 0);
TI = 0;
}
作废?UartPrintfString(INT8?*str)
{
while(str?& amp& amp?*str)
{
UartSendByte(* str++);
}
}
作废?主要(无效)
{
UINT8?I = 0;
PortInit();
timer init();
定时器0 start();
UART init();
RefreshDisplayBuf(LightCurCount[0]);
EA = 1;
NORTH_R_LIGHT(开);
SOUTH_G_LIGHT(开);
while(1)
{
if(定时器0IRQEvent)
{?
定时器0 IRQ event = 0;
time count++;
if(时间计数& gt=200)
{
time count = 0;
if(LightCurCount[0])
{
traffilightstatus = 0;
}
不然呢?if(LightCurCount[1])
{
traffilightstatus = 1;
}
不然呢?if(LightCurCount[2])
{?
traffilightstatus = 2;
}
不然呢?if(LightCurCount[3])
{
traffilightstatus = 3;
}
不然呢?
{
for(I = 0;我& lt4;i++)
{
LightCurCount[I]= LightOrgCount[I];
}
traffilightstatus = 0;
}
开关(交通指示灯状态)
{
案子?0:
{
NORTH_R_LIGHT(开);
SOUTH_R_LIGHT(关);
NORTH_G_LIGHT(关);
SOUTH_G_LIGHT(开);
NORTH_Y_LIGHT(关);
SOUTH_Y_LIGHT(关);
}
打破;
案子?1:
{
if(LightCurCount[1]%2)
{
?NORTH_R_LIGHT(开);
SOUTH_G_LIGHT(开);
}
其他
{
?NORTH_R_LIGHT(关);
SOUTH_G_LIGHT(关);
}
NORTH_Y_LIGHT(开);
SOUTH_Y_LIGHT(开);
}
打破;
案子?2:
{
NORTH_R_LIGHT(关);
南_R_LIGHT(开);
NORTH_G_LIGHT(开);
SOUTH_G_LIGHT(关);
NORTH_Y_LIGHT(关);
SOUTH_Y_LIGHT(关);
}
打破;
案子?3:
{
if(LightCurCount[3]%2)
{
?NORTH_G_LIGHT(开);
南_R_LIGHT(开);
}
其他
{
?NORTH_G_LIGHT(关);
SOUTH_R_LIGHT(关);
}
NORTH_Y_LIGHT(开);
SOUTH_Y_LIGHT(开);
}
打破;
默认:break
}
RefreshDisplayBuf(LightCurCount[trafficklightstatus]);
LightCurCount[traffic light status]-;
}
seg display();
}
}
}
作废?UartIRQ(void)中断?4?
{
静电?UINT8?CNT = 0;
静电?LIGHT_VAL_EX?LightValEx
中频(RI)
{?
RI = 0;
?light valex . p[cnt++]= SBUF;
if(LightValEx.lv.Head?==?UART_MARKER)
{
if(CNT & gt;=5)
{
for(CNT = 1;cnt & lt5;cnt++)
{
LightOrgCount[CNT-1]= light valex . LV . val[CNT];?
LightCurCount[CNT-1]= light valex . LV . val[CNT];
}
CNT = 0;
UartPrintfString("设置红绿灯完成\ r \ n ");
}
}
其他
{
CNT = 0;
}
}
}
作废?定时器0IRQ(void)?打断?1?
{
ET0 = 0;
TH0?=?(65536-定时器0 _初始值)/256;
TL0?=?(65536-定时器0 _初始值)% 256;?//计时1毫秒
timer 0 IRQ event = 1;
ET0 = 1;
}
=====================================================================
等着拿分吧!