『壹』 求一個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;
}
}}
『貳』 單片機C語言紅綠燈程序,要求:數碼管顯示時間倒計時、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; //定時器T0工作方式1:16位方式
P1=0x3f; //P1埠初值:允許接收、鎖存、顯示
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; //行號埠清○
RCLK = 1; //顯示數據打入輸出鎖存器
P1 |= i; //寫入行號
RCLK = 0; //鎖存顯示數據
G = 0; //打開顯示
}
『叄』 用Keilc軟體設計一個交通燈程序C程序
東西和南北的時間不同步,樓主沒有說得很清楚
你把時間流程說清楚我可以把代碼寫出來
/敗念/以下代碼經過Keil C51軟體調試通過
#include "reg51.h" //頭文件包含
//宏定義
#define uint unsigned int
#define uchar unsigned char
#define ON 0 //0的時候燈亮
#define OFF 1 //1的時候燈亮
//管腳定義
//南北道凱鬧 黃燈亮3秒 紅燈亮 30秒 黃燈3秒 綠燈38秒
//東西道 黃燈亮3秒 綠燈亮 28秒 黃燈3秒 紅燈40秒
sbit PortDX_Yellow = P1^0; //東西方向黃燈
sbit PortDX_Red = P1^1; //東西方向紅燈盯枯罩
sbit PortDX_Green = P1^2; //東西方向綠燈
sbit PortNB_Yellow = P1^3; //南北方向黃燈
sbit PortNB_Red = P1^4; //南北方向紅燈
sbit PortNB_Green = P1^5; //南北方向綠燈
void delay(uint ms) // 毫秒級延時(AT89C52 @ 11.0592MHz)
{
uint ti;
while(ms--)
{
for(ti=0;ti<112;ti++){}//112
}
}
/*==================== 主函數 ====================*/
void main(void)
{
delay(400); //開機延時400ms
while(1)
{
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黃燈亮3秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//東西黃燈亮3秒
delay(3000);
PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北紅燈亮28秒
PortDX_Yellow = OFF;PortDX_Red = OFF;PortDX_Green = ON ;//東西綠燈亮28秒
delay(28000);
PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北紅燈亮2秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//東西黃燈亮2秒
delay(2000);
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黃燈亮1秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//東西黃燈亮1秒
delay(1000);
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黃燈亮2秒
PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//東西紅燈亮2秒
delay(2000);
PortNB_Yellow = OFF;PortNB_Red = OFF;PortNB_Green = ON ;//南北綠燈亮38秒
PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//東西紅燈亮38秒
delay(3800);
}
}
『肆』 急求KEIL C51 紅綠燈程序!(用C語言!)
//12M晶振
//共陰數碼管
#include<reg51.h>
sbitred=P1^0;
sbitgreen=P1^1;
sbityellow=P1^2;
bitflag=1;
unsignedcharcodean[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharcodewei[]={0xfd,0xfe};
unsignedchartime=35;
voidmain()
{
voidshow_time();
voidshow_light();
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
red=0;
while(1)
{
show_time();
show_light();
}
}
voidshow_time()
{
voiddelay();
unsignedcharnum=time,i;
for(i=0;i<2;++i)
{
P2=wei[i];
P0=an[num%10];
delay();
基悉 P0=0x00;
num/=10;
}
}
voiddelay()
{
inti;
for(i=1000;i;i--);
}
voidshow_light()
{
if(flag)
{
if(!time)
{
flag=0;
red=1;
green=0;
time=35;
}
}
else
{
if(time>0&&time<4)
{
green=1;
yellow=0;
}
搏指乎 if(!time)
{
yellow=1;
red=0;
逗空 flag=1;
time=35;
}
}
}
voiddec_sec()interrupt1
{
staticcount=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++count==20)
{
count=0;
time--;
}
}
『伍』 51單片機C語言程序:交通燈系統
這種問題一般沒人會的,像 CSDN、程序員網 等等有類似的設計,你可以去看看
『陸』 單片機編程題目。c語言 交通紅綠燈...額這個幫朋友問的,希望能得到一個原創答案,謝謝謝!再多分數也不足
給你一個思路:假設是單此雀伏純的紅綠燈,無黃森攜燈的話,設紅燈30秒,綠燈歲早30秒。需要兩個狀態量,方向Dir(1:東西,0:南北),東西燈顏色LightcolorEW,
『柒』 如何用c語言編程在單片機上做交通信號燈
硬體電路設計
此電中路設計採用AT89C51單片機,74LS47(數碼管驅動)74LS373(數碼管驅動輸出鎖存),8個數碼管顯示其延時值,四個紅、黃、綠指示燈。硬體設計關鍵在於,延時顯示時,要考慮到當個位數字顯示時,要確保十位數字顯示輸出的不變。因此,可加輸出鎖存器。在延時最後三秒時,要讓黃燈進行閃爍,並同時顯示數字(這一步在軟體設計上很關鍵)。
(1)電路連接圖:
三、軟體程序(C語言)
以下是整個設計的軟體程序,直接可以編譯成*。Hex代碼。通過以上電路,下載到單片機,可直接運行。
//*****************************//
//程序名:十字路口交通燈控制
//編寫人:黃庭劍
//初寫時間:2009年1月2日
//程序功能:南北為車行道,延時60秒;東西方向為人行道,延時20秒,且在最後3秒黃燈顯示2秒鍾再實現切換.
//CPU說明:AT89C51型單片機;24MHZ晶體振盪器
//完成時間:2009年1月6日
//*****************************//
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
sfrp0=0x80;
sfrp1=0x90;
sfrp2=0xA0;
sfrp3=0xb0;//這部分內容其實在「#include<reg51.h>」里已經有,但裡面定義的必須區分大小寫,在這里,因為我程序採用的是小寫,reg51.h里對各個埠與寄存器的定義都是大寫,所以在編譯連接時,會報錯,所以,在本設計程序里,我只用到了埠,在這里也就只定義了四個,而沒有去改reg51.h裡面的內容。其實兩者是一樣的。
sbitsw=p0^0;
sbitOE=P0^6;
sbitLE=P0^7;//74LS373鎖存器控制端定義
chardisplay[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};//p1口的數碼管時間顯示調用,利用74L74BCD碼,8位驅動輸出;
//函數聲明begin
voiddelay1(intcount);
voiddelay_long(intnumber1,intnumber2);
voidpeople_car_drive();
//函數聲明end
//***********************//延時子程序
voiddelay1(intcount)
{inti;
for(i=count;i>0;i--)
{;}
}
voiddelay_long(intnumber1,intnumber2)
{
inta,b;
for(a=number1;a>0;a--)
{
for(b=number2;b>0;b--)
{_nop_();}
}
}
//**********************//延時子程序
voidpeople_car_drive()
{
intp_1=2,i,j=9,p_2=6;//****************//行人通行時,延時20秒
p2=0x09;//南北紅燈亮
p3=0x24;//東西綠燈亮
while(p_1-->0)
{LE=1;
OE=0;
if(p_1==0){OE=1;}//當十位數減到0時,只顯示個位數
p1=display[p_1];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_1==0&&j==3)break;//減到3時退出循環,讓其黃燈閃爍顯示
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
//*******************************************************************************//
p2=0x12;//南北黃燈閃爍三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
//*****************以下是車輛通行時延時60秒//
p2=0x24;//南北綠燈亮
p3=0x09;//東西紅燈亮
while(p_2-->0)
{LE=1;
OE=0;
if(p_2==0){OE=1;}//當十位數減到0時,只顯示個位數
p1=display[p_2];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_2==0&&j==3)break;//減到2時退出循環
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
p2=0x12;//南北黃燈閃爍三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);//南北黃燈閃爍三秒完畢
}
voidmain()//主函數入口處
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00;//初始化各埠
{while(1)
{
if(sw==0)
{people_car_drive();}
else
{
p2=0x00;
p3=0x00;//關閉所有交通燈
}
}
}
}
『捌』 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分誘惑不大。。