Eecode真题

参考《51单片机C语言创新教程》温梓岐就等。

源代码转自: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;

}

=====================================================================

等着拿分吧!