c語言紅綠燈
1. 用C語言編程模擬交通路口(十字路口)紅綠燈的控制功能
本系統的設計首先必須了解交通路燈的亮滅規律。設有一個十字路口,1、3 為南,北
方向, 2、4 為東,西方向,初始態為4 個路口的紅燈全亮。之後, 1、3 路口的綠燈亮,
2、4 路口的紅燈亮, 1、3 路口方向通車。延遲一段時間後, 1、3 路口的綠燈熄滅,而1、
3 路口的黃燈開始閃爍。閃爍若干次後, 1、3 路口的紅燈亮, 同時 2、4 路口的綠燈亮, 2、
4 路口方向開始通車。延遲一段時間後, 2、4 路口的綠燈熄滅,而黃燈開始閃爍。閃爍若
干次後,再切換到1、3 路口方向。之後,重復上述過程。對於各組燈的亮滅,我們運用的
是8255A 的輸入輸出功能。
2. C語言程序設計編寫一個交通紅綠燈的控制,各位高手幫幫忙急!
unsigned char counter;
sbit red_nb=P2^0;
......
void main()
{
TMOD=
TH0
TL0
ET0
TR0
while(1) //根據樓主所給,有4種狀態
{
state1;
state2;
state3;
state4;
}
}
void timer0() interrupt 1 //定時器0
{
TH0=0x3c;
TL0=0xb0;
counter++;
}
void state1() //控制南北紅燈亮,東西綠燈亮,30s
{
unsigned char temp = 30;
red_nb=1;
.....
green_dx=1;
while(1)
{
if( counter>19){counter=0;temp--} //每次counter=20,即1s,temp自減
if(temp) break; //當temp為0時,即30秒,退出狀態1,進入狀態2
}
}
沒經過測試,完全是5分誘惑不大。。
3. 單片機 用C語言 keil uVision2 編程 編一個紅綠燈
#include<AT89X52.H>
#define LED_D P2
#define LED_S P1
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
sfr P1M0=0xB2;
unsigned int m,i,post1,post2;
unsigned int k=0,nums=1,n=1;
void timer1() interrupt 1 using 1
{
i++;
TH0=0XB1; //初始化
TL0=0XE0; //初始化
post1=9-(i/50%10);
post2=2-i/500;
m=i/25;
if(m==60)
i=0;
}
void initialize()
{
P0=0XFF ;
TMOD=0X01;
TR0=1;
TH0=0XB1;
TL0=0XE0;
}
void show()
{ switch(n)
{ case 1:
LED_D=table[post1];
LED_S=0x01;
break;
case 3:
LED_D=table[post2];
LED_S=0x02;
break;
}
if(n++==4)
n=1;
switch(nums)
{
case 1:
if(m<52)
P0=0XDE;
if(m>=52&&m<59)
{P0_0=1;
if(k++>=50000)
{
P0_1=!P0_1;
k=0;
}
}
if(m==59)
nums=2;
break;
case 2:
if(m<52)
P0=0XF3;
if(m>=52&&m<59)
{
P0_3=1;
if(k++>=50000)
{
P0_4=!P0_4;
k=0;
}
}
if(m==59)
nums=1;
break;
default: break;
}
}
void main()
{
initialize();
EA=1;
P1M0=0XF0;
ET0=1;
TR0=1;
while(1)
{
show();
}
}
這是帶數碼管顯示的紅綠燈,主要用了四位8段的數碼管顯示時間。如果需要詳細的繼續追問。
4. 求一個C語言的紅綠燈程序 80C51
#include<reg51.h>/*下面中n代表north. n s w e分別代表四個不同的方向*/
sbit rednts=P1^0;
sbit yellownts=P1^1;
sbit greennts=P1^2;
sbit redwte=P1^3;
sbit yellowwte=P1^4;
sbit greenwte=P1^5;//由於實驗實的板只用了P1口作輸入
int tmp1=0;
int tmp2=0;
int i;
void begins()
{
rednts=0;
yellownts=0;
greennts=0;
redwte=0;
yellowwte=0;
greenwte=0;
}
void TimeInt() interrupt 1 //這是中斷函數,1對應是定時、計數器0
{
i++;
if(i==2000)
{
i=0;
tmp1++;
if(10==tmp1) tmp1=0;
}//若到了,得清0 //判斷是否到了0.5MS*2000=1S}
void ExteriorInt() interrupt 0
{
tmp2=!tmp2;
}
void main()
{ //int time1s,time2s,time3;;
TMOD=0x02; //啟用定時器工作模式2
TH0=6;//裝定時器初值高8位,0.5ms中斷一次 。2US*250=0.5MS
TL0=6;//裝定時器初值低8位
EA=1; //打開總中斷允許
ET0=1; //打開定時器0的中斷允許
TR0=1; //T0工作1******以上是對定時器0的初始化********
TCON=0x11;//TCON的設置必須保持定時器0在工作
EX0=1;//********以上是對外部中斷0的初始化***********
while(1)
{
if(tmp2)
{
begins();
rednts=1;
redwte=1;
}
else if(tmp1<3)
{
begins();
rednts=1;
greenwte=1;
}
else if(tmp1<4)
{
begins();
}
else if(tmp1<5)
{
yellownts=1;
yellowwte=1;
}
else if(tmp1<6)
{
begins();
}
else if(tmp1<7)
{
yellownts=1;
yellowwte=1;
}
else if(tmp1<10)
{
begins();
greennts=1;
redwte=1;
}
}}
5. 鍗曠墖鏈篊璇璦綰㈢豢鐏紼嬪簭錛岃佹眰錛氭暟鐮佺℃樉紺烘椂闂村掕℃椂銆16*16LED鐐歸樀鏄劇ず妯″潡鏄劇ず綰㈢豢榛勭伅銆
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define BLKN 2 //鍒楅攣瀛樺櫒鏁
sbit G = P1^7; //P1.7涓烘樉紺轟笡闄鍏佽告帶鍒朵俊鍙風鍙
sbit RCLK = P2^0; //P2.0涓鴻緭鍑洪攣瀛樺拹鑼勫櫒鏃墮挓淇″彿絝
sbit SCLR = P2^1; //P2.1涓虹Щ浣嶅瘎瀛樺櫒娓呪棆絝
void delay(uint); //寤舵椂鍑芥暟
uchar data display[32]; //鏄劇ず緙撳瓨
uchar code BMP[][32]={{16,0,16,0,37,248,36,64,120,64,8,64,16,64,32,64,124,64,0,64,0,64,12,64,112,64,3,252,0,0,0,0},
{16,0,19,240,32,16,41,240,120,16,19,252,32,64,122,72,1,80,0,224,25,80,102,76,0,64,1,192,0,0,0,0},
{4,64,4,64,63,248,4,64,127,252,1,0,31,240,17,16,31,240,17,16,31,240,8,32,16,16,32,8,0,0,0,0}}; //瀛楁ā琛'綰⑩樷欑豢鈥樷橀粍鈥
void main()
{
register uchar i,j;
SCON=0x00; //涓插彛宸ヤ綔妯″紡0錛氱Щ浣嶅瘎瀛樺櫒鏂瑰紡
TMOD=0x01; //瀹氭椂鍣═0宸ヤ綔鏂瑰紡1錛16浣嶆柟寮
P1=0x3f; //P1絝鍙e垵鍊礆細鍏佽告帴鏀躲侀攣瀛樸佹樉紺
TR0=1; //鍚鍔ㄥ畾鏃跺櫒T0
ET0=1; //鍏佽稿畾鏃跺櫒T0涓鏂
EA=1; //寮鍚鎬諱腑鏂錛
while(1)
{
delay(2000);
for(j=0;j<3;j++)
{
for(i=0;i<32;i++)
{
display[i]=~BMP[j][i];
if (i%2) delay(100);
}
delay(10000);
}
}
}
void delay(uint x)
{
register uchar i,j;
for (i=x;i>0;i--)
for (j=120;j>0;j--);
}
void leddisplay(void) interrupt 1 using 1
{
register uchar i, j=BLKN;
TH0 =(65536-100)/256; //琛¢儜瀵熻懼畾鏄劇ず灞忓埛鏂扮巼姣忕60甯
TL0 =(65536-100)%256;
i = P1; //璇誨彇褰撳墠鏄劇ず鐨勮屽彿
i = ++i & 0x0f; //琛屽彿鍔1錛屽睆钄介珮4浣
while(j)
{
j--;
SBUF = display[i*BLKN + j]; //閫佹樉紺烘暟鎹
while (!TI);
TI = 0;
} //瀹屾垚涓琛屾暟鎹鐨勫彂閫
G = 1; //娑堥殣錛堝叧闂鏄劇ず錛
P1 &= 0xf0; //琛屽彿絝鍙f竻鈼
RCLK = 1; //鏄劇ず鏁版嵁鎵撳叆杈撳嚭閿佸瓨鍣
P1 |= i; //鍐欏叆琛屽彿
RCLK = 0; //閿佸瓨鏄劇ず鏁版嵁
G = 0; //鎵撳紑鏄劇ず
}
6. 交通燈 C語言 單片機。中斷函數問題
參考《51單片機C語言創新教程》溫子祺等著。
源碼轉自:《51單片機C語言創新教程》。
/*實驗名稱:交通燈實驗
*描述:交通燈實驗要求紅燈亮15秒,綠燈亮10秒,黃燈亮5秒,
當紅燈切換為綠燈或者綠燈切換為紅燈,
要實現燈閃爍。紅燈、綠燈、黃燈的點亮持續時間可以通過串口來修改,
並在下一個循環中更新數值。
*作者:溫子祺
*修改日期:2010/5/4
*說明:代碼注釋與講解詳見《51單片機C語言創新教程》溫子祺等著,北京航空航天大學出版社
*/
#include"stc.h"
typedefunsignedcharUINT8;
typedefunsignedint UINT16;
typedefunsignedlongUINT32;
typedefcharINT8;
typedefintINT16;
typedeflongINT32;
#defineTIMER0_INITIAL_VALUE5000
#defineHIGH1
#defineLOW0
#defineON1
#defineOFF0
#defineSEG_PORTP0
#defineLS164_DATA(x){if((x))P0_4=1;elseP0_4=0;}
#defineLS164_CLK(x){if((x))P0_5=1;elseP0_5=0;}
#defineNORTH_R_LIGHT(x){if((x))P2_0=0;elseP2_0=1;}
#defineNORTH_Y_LIGHT(x){if((x))P2_1=0;elseP2_1=1;}
#defineNORTH_G_LIGHT(x){if((x))P2_2=0;elseP2_2=1;}
#defineSOUTH_R_LIGHT(x){if((x))P2_3=0;elseP2_3=1;}
#defineSOUTH_Y_LIGHT(x){if((x))P2_4=0;elseP2_4=1;}
#defineSOUTH_G_LIGHT(x){if((x))P2_5=0;elseP2_5=1;}
#defineTRAFFIC_STATUS_10
#defineTRAFFIC_STATUS_21
#defineTRAFFIC_STATUS_32
#defineUART_MARKER0xEE
UINT8Timer0IRQEvent=0;
UINT8Time1SecEvent=0;
UINT8Time500MsEvent=0;
UINT8TimeCount=0;
UINT8SegCurPosition=0;
UINT8LightOrgCount[4]={15,5,15,5};
UINT8LightCurCount[4]={15,5,15,5};
UINT8TrafficLightStatus=0;
codeUINT8SegCode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
UINT8SegBuf[4]={0};
codeUINT8SegPosition[4]={0x07,0x0b,0x0d,0x0e};
typedefstruct_LIGHT_VAL
{
UINT8Head;
UINT8val[4];
}LIGHT_VAL;
typedefunion_LIGHT_VAL_EX
{
LIGHT_VALlv;
UINT8p[5];
}LIGHT_VAL_EX;
voidLS164Send(UINT8byte)
{
UINT8j;
for(j=0;j<=7;j++)
{
if(byte&(1<<(7-j)))
{
LS164_DATA(HIGH);
}
else
{
LS164_DATA(LOW);
}
LS164_CLK(LOW);
LS164_CLK(HIGH);
}
}
voidRefreshDisplayBuf(UINT8s1) //刷新顯示緩存
{
SegBuf[0]=s1%10;
SegBuf[1]=s1/10;
SegBuf[2]=s1%10;
SegBuf[3]=s1/10;
}
voidSegDisplay(void)
{
UINT8t;
t=SegCode[SegBuf[SegCurPosition]];
SEG_PORT|=0x0f;
LS164Send(t);
SEG_PORT=(SEG_PORT|0x0f)&SegPosition[SegCurPosition];
if(++SegCurPosition>=4)
{
SegCurPosition=0;
}
}
voidTimerInit(void)
{
TH1=0;
TL1=0;
TH0=(65536-TIMER0_INITIAL_VALUE)/256;
TL0=(65536-TIMER0_INITIAL_VALUE)%256;//定時1MS
TMOD=0x51; /*01010001T1計數,T0定時*/
}
voidTimer0Start(void)
{
TR0=1; //啟動計時器1
ET0=1;
}
voidTimer0Stop(void)
{
TR0=0; //啟動計時器1
ET0=0;
}
voidPortInit(void)
{
P0=P1=P2=P3=0xFF;
}
voidUartInit(void)
{
SCON=0x40;
T2CON=0x34;
RCAP2L=0xD9;
RCAP2H=0xFF;
REN=1;
ES=1;
}
voidUartSendByte(UINT8byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
voidUartPrintfString(INT8*str)
{
while(str&&*str)
{
UartSendByte(*str++);
}
}
voidmain(void)
{
UINT8i=0;
PortInit();
TimerInit();
Timer0Start();
UartInit();
RefreshDisplayBuf(LightCurCount[0]);
EA=1;
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
while(1)
{
if(Timer0IRQEvent)
{
Timer0IRQEvent=0;
TimeCount++;
if(TimeCount>=200)
{
TimeCount=0;
if(LightCurCount[0])
{
TrafficLightStatus=0;
}
elseif(LightCurCount[1])
{
TrafficLightStatus=1;
}
elseif(LightCurCount[2])
{
TrafficLightStatus=2;
}
elseif(LightCurCount[3])
{
TrafficLightStatus=3;
}
else
{
for(i=0;i<4;i++)
{
LightCurCount[i]=LightOrgCount[i];
}
TrafficLightStatus=0;
}
switch(TrafficLightStatus)
{
case0:
{
NORTH_R_LIGHT(ON);
SOUTH_R_LIGHT(OFF);
NORTH_G_LIGHT(OFF);
SOUTH_G_LIGHT(ON);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
break;
case1:
{
if(LightCurCount[1]%2)
{
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
}
else
{
NORTH_R_LIGHT(OFF);
SOUTH_G_LIGHT(OFF);
}
NORTH_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON);
}
break;
case2:
{
NORTH_R_LIGHT(OFF);
SOUTH_R_LIGHT(ON);
NORTH_G_LIGHT(ON);
SOUTH_G_LIGHT(OFF);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
break;
case3:
{
if(LightCurCount[3]%2)
{
NORTH_G_LIGHT(ON);
SOUTH_R_LIGHT(ON);
}
else
{
NORTH_G_LIGHT(OFF);
SOUTH_R_LIGHT(OFF);
}
NORTH_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON);
}
break;
default:break;
}
RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);
LightCurCount[TrafficLightStatus]--;
}
SegDisplay();
}
}
}
voidUartIRQ(void)interrupt4
{
staticUINT8cnt=0;
staticLIGHT_VAL_EXLightValEx;
if(RI)
{
RI=0;
LightValEx.p[cnt++]=SBUF;
if(LightValEx.lv.Head==UART_MARKER)
{
if(cnt>=5)
{
for(cnt=1;cnt<5;cnt++)
{
LightOrgCount[cnt-1]=LightValEx.lv.val[cnt];
LightCurCount[cnt-1]=LightValEx.lv.val[cnt];
}
cnt=0;
UartPrintfString("設置交通燈完成 ");
}
}
else
{
cnt=0;
}
}
}
voidTimer0IRQ(void)interrupt1
{
ET0 =0;
TH0=(65536-TIMER0_INITIAL_VALUE)/256;
TL0=(65536-TIMER0_INITIAL_VALUE)%256;//定時1MS
Timer0IRQEvent=1;
ET0 =1;
}
=====================================================================
坐等拿分!