Microcontrolador en lenguaje C de semáforo. Problema de función de interrupción
Consulte el "Tutorial de innovación en lenguaje C del microcontrolador 51" de Wen Ziqi y otros.
El código fuente se transfiere de: "51 Microcontroller C Language Innovation Tutorial".
/*Nombre del experimento: Experimento del semáforo*Descripción: El experimento del semáforo requiere que la luz roja esté encendida durante 15 segundos, la luz verde durante 10 segundos y la luz amarilla esté encendida durante 5 segundos.
Cuando la luz roja cambia a luz verde o la luz verde cambia a luz roja,
para lograr que la luz parpadee. La duración de la iluminación de la luz roja, la luz verde y la luz amarilla se puede modificar a través del puerto serie y los valores se actualizarán en el siguiente ciclo.
*Autor: Wen Ziqi*Fecha de revisión: 4/5/2010 *Nota: Para comentarios y explicaciones sobre el código, consulte el "Tutorial de innovación en lenguaje C del microcontrolador 51" Wen Ziqi et al., Prensa de la Universidad de Aeronáutica y Astronáutica de Beijing*/ p>
#include?"stc.h"
typedef?unsigned?charUINT8;
typedef?unsigned?int UINT16;
typedef?unsigned ?longUINT32;?
typedef?charINT8;
typedef?int?INT16;
typedef?longINT32;
#define?TIMER0_INITIAL_VALUE ?5000
p>#define?HIGH1
#define?LOW0
#define?ON?1
#define?OFF0
#define?SEG_PORTP0
#define?LS164_DATA(x)?{if((x))P0_4=1; else?P0_4=0;}?
#define?LS164_CLK (x){if((x))P0_5=1; si no?P0_5=0;}?
#define?NORTH_R_LIGHT(x){if((x))P2_0 =0; más?P2_0 =1;}
#define?NORTH_Y_LIGHT(x){if((x))P2_1=0; más?P2_1=1;}
# define?NORTH_G_LIGHT(x) {if((x))P2_2=0; else?P2_2=1;}
#define?SOUTH_R_LIGHT(x){if((x))P2_3=0; ?P2_3=1;}
#define?SOUTH_Y_LIGHT(x){if((x))P2_4=0; más?P2_4=1;}
#define?SOUTH_G_LIGHT( x){if(( x))P2_5=0; más?P2_5=1;}
#define?TRAFFIC_STATUS_10
#define?TRAFFIC_STATUS_21
# define?TRAFFIC_STATUS_32
#define?UART_MARKER0xEE
UINT8?Timer0IRQEvent=0;
UINT8?Time1SecEvent=0;
UINT8?Time500MsEvent =0;
UINT8?TimeCount=0;
UINT8?SegCurPosition=0;
UINT8?LightOrgCount[4]={15, 5, 15, 5};
UINT8?LightCurCount[4]={15,5,15,5};
UINT8?TrafficLightStatus=0;
código?UINT8 ?SegCode[10]= {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};SegBuf[4]?={0};
código?UINT8 ?
SegPosition[4]={0x07, 0x0b, 0x0d, 0x0e};
typedef?struct?_LIGHT_VAL
{
UINT8?Head;
UINT8?val[4];?
}LIGHT_VAL;
typedef?union?_LIGHT_VAL_EX
{ LIGHT_VAL?lv; ?
}LIGHT_VAL_EX;
void?LS164Send(UINT8?byte)
{
UINT8?j;
for(j=0;jlt;=7;j)
{ if(byteamp;(1lt;lt;(7-j))) {
LS164_DATA(HIGH );
?}
?else
?{
LS164_DATA(LOW);
?} LS164_CLK(LOW);? LS164_CLK(HIGH);
}
}
void?RefreshDisplayBuf(UINT8?s1) ?//Actualizar la caché de visualización< / p>
{
SegBuf[0]?=?s110;
SegBuf[1]?=?s1/10; p >
SegBuf[2]?=?s110;
SegBuf[3]?=?s1/10;
}
void?SegDisplay ( void)
{
UINT8?t;
t?=?SegCode[SegBuf[SegCurPosition]];?
SEG_PORT ? |=?0x0f;
LS164Send(t);?
SEG_PORT?=?(SEG_PORT|0x0f)?amp;?SegPosition[SegCurPosition]
if( SegCurPositiont;=4)?
{
SegCurPosition=0;
}
}
void?TimerInit(void)
{
TH1?=?0;
TL1 ?=?0;?
TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;
TL0?=?(65536-TIMER0_INITIAL_VALUE)256;?//Tiempo 1MS< / p>
TMOD?=?0x51; /*01010001?Conteo T1, temporización T0*/
}
void?Timer0Start(void)
{ TR0?=?1; //¿Iniciar el temporizador 1?
?ET0?=?1
}
void?Timer0Stop(void)<; /p>
{ TR0?=?0; //¿Iniciar temporizador 1? ET0?=?0;?
}
void?PortInit(void) p >
{
?P0=P1=P2=P3=0xFF;
}
void?UartInit(void)
{
SCON=0x40 ;
T2CON=0x34;
RCAP2L=0xD9
RCAP2H=0xFF
REN=1; p>ES=1;
}
void?UartSendByte(UINT8?byte)
{
SBUF=byte; p> p>
mientras(TI==0);
TI=0;
}
void?UartPrintfString(INT8?*str) p>
{
while(str?amp;amp;?*str)
{
UartSendByte(*str ); p>
}
}
void?main(void)
{
UINT8?i=0; p>
PortInit();
TemporizadorInit();
Timer0Start()
UartInit()
RefreshDisplayBuf; (LightCurCount [0]);
EA=1;
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
mientras (1 )
{
if(Timer0IRQEvent)
{?
Timer0IRQEvent=0;
TimeCount
if(TimeCountgt;=200)
{
TimeCount=0;
if( LightCurCount[ 0])
{
TrafficLightStatus=0;
}
else?if(LightCurCount[1]) p>
{
TrafficLightStatus=1;
}
else?if(LightCurCount[2])
{
TrafficLightStatus=2;
}
else?if(LightCurCount[3])
{
TrafficLightStatus =3 ;
}
¿otra cosa?
{
para(i=0; ilt; 4; i )
{ LightCurCount[i]=LightOrgCount[i];
}
TrafficLightStatus=0
}
<; /p >
interruptor(TrafficLightStatus)
{
caso?0:
{
NORTH_R_LIGHT(ON);
LUZ_R_SUR(APAGADO);<
/p>
LUZ_G_NORTE(APAGADO);
LUZ_G_SUR(ENCENDIDO);
LUZ_Y_NORTE(APAGADO);
LUZ_Y_SUR(APAGADO);
}
romper;
caso?1:
{
if(LightCurCount[1]2) p>
{
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON
}
más
{
NORTH_R_LIGHT(APAGADO);
SOUTH_G_LIGHT(APAGADO
}
NORTE_Y_LIGHT(ENCENDIDO); p> p>
SOUTH_Y_LIGHT(ON);
}
rotura;
caso?2:
{ p>
LUZ_R_NORTE(APAGADO);
LUZ_R_SUR(ENCENDIDO);
LUZ_G_NORTE(ENCENDIDO);
LUZ_G_SUR(APAGADO);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
rotura;
caso?3: p>
{
if(LightCurCount[3]2)
{
NORTH_G_LIGHT(ON);
SOUTH_R_LIGHT( ENCENDIDO) ;
}
else
{
NORTH_G_LIGHT(APAGADO);
SOUTH_R_LIGHT(APAGADO); ;
}
NORTE_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON); ?
predeterminado: pausa;?
}
RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);
LightCurCount[TrafficLightStatus]--;
p>
}
SegDisplay();
}
}
} p>
void?UartIRQ(void)interrupt?4?
{ static?UINT8?cnt=0; static?LIGHT_VAL_EX?LightValEx; =0;
?LightValEx.p[cnt]=SBUF; if(LightValEx.lv.Head?==?UART_MARKER) {? /p>
{
for(cnt=1;cntlt;5;cnt)
{
LightOrgCount[cn
t-1]=LightValEx.lv.val[cnt];?
LightCurCount[cnt-1]=LightValEx.lv.val[cnt];
}
cnt=0;
UartPrintfString("Establecer semáforo completado\r\n");
} } else {
cnt=0; } }
}
¿void?Timer0IRQ(void)?interrupt?1?
{
ET0 =?0; p> p>
TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;
TL0?=?(65536-TIMER0_INITIAL_VALUE)256;?//Tiempo 1MS
Timer0IRQEvent =1 ;
ET0 =?1;
}
===================== == ================================================
¡Solo espera y gana puntos!