Colección de citas famosas - Colección de máximas - Microcontrolador en lenguaje C de semáforo. Problema de función de interrupción

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*/

#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;

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)

{

?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>

mientras(TI==0);

TI=0;

}

void?UartPrintfString(INT8?*str)

{

while(str?amp;amp;?*str)

{

UartSendByte(*str );

}

}

void?main(void)

{

UINT8?i=0;

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])

{

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)

{

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:

{

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:

{

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();

}

}

}

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>

TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;

TL0?=?(65536-TIMER0_INITIAL_VALUE)256;?//Tiempo 1MS

Timer0IRQEvent =1 ;

ET0 =?1;

}

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

¡Solo espera y gana puntos!