求助一个单片机设计的交通灯程序,用C语言编写。

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-30
c51单片机c语言交通灯的程序

Proteus仿真原理图:

程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
uchar data buf[4];
uchar data sec_dx=20;//东西数默认
uchar data sec_nb=30;//南北默认值
uchar data set_timedx=20;
uchar data set_timenb=30;
int n;
uchar data b;//定时器中断次数
sbit k1=P1^6;//定义5组开关
sbit k2=P1^7;
sbit k3=P2^7;
sbit k4=P3^0;
sbit k5=P3^1;
sbit Yellow_nb=P2^5; //南北黄灯标志
sbit Yellow_dx=P2^2; //东西黄灯标志
sbit Green_nb=P2^4;
sbit Green_dx=P2^1;
sbit Buzz=P3^7;
bit Buzzer_Indicate;
bit time=0;//灯状态循环标志
bit set=1;//调时方向切换键标志
uchar code table[11]={ //共阴极字型码
0x3f, //--0
0x06, //--1
0x5b, //--2
0x4f, //--3
0x66, //--4
0x6d, //--5
0x7d, //--6
0x07, //--7
0x7f, //--8
0x6f, //--9
0x00 //--NULL
};
//函数的声明部分
void delay(int ms);//延时子程序
void key();//按键扫描子程序
void key_to1();//键处理子程序
void key_to2();
void key_to3();
void display();//显示子程序
void logo(); //开机LOGO
void Buzzer();
//主程序
void main()
{
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
EA=1;
ET0=1;
TR0=1;
EX0=1;
EX1=1;
logo();
P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯
sec_nb=sec_dx+5;
while(1)
{
key(); //调用按键扫描程序
display(); //调用显示程序
Buzzer();
}
}
//函数的定义部分
void key() //按键扫描子程序
{
if(k1!=1)
{
delay(10);
if(k1!=1)
{
while(k1!=1)
{
key_to1();
for(n=0;n<40;n++)
{ display();}
}
}
}
if(k2!=1)
{
delay(10);
if(k2!=1)
{
while(k2!=1)
{
key_to2();
for(n=0;n<40;n++)
{ display();}
}
}
}
if(k3!=1)
{
TR0=1; //启动定时器
Buzzer_Indicate=0;
sec_nb=set_timenb; //从中断回复,仍显示设置过的数值
sec_dx=set_timedx;
if(time==0)
{ P2=0X99;sec_nb=sec_dx+5; }
else { P2=0xC3;sec_dx=sec_nb+5; }
}
if(k4!=1)
{
delay(5);
if(k4!=1)
{
while(k4!=1);
set=!set;
}
}
if(k5!=1)
{
delay(5);
if(k5!=1)
{
while(k5!=1)
key_to3();
}
}
}
void display() //显示子程序
{
buf[1]=sec_dx/10; //第1位 东西秒十位
buf[2]=sec_dx%10; //第2位 东西秒个位
buf[3]=sec_nb/10; //第3位 南北秒十位
buf[0]=sec_nb%10; //第4位 南北秒个位
P1=0xff; // 初始灯为灭的
P0=0x00;
P1=0xfe; //片选LCD1
P0=table[buf[1]];
delay(1);
P1=0xff;
P0=0x00;
P1=0xfd; //片选LCD2
P0=table[buf[2]];
delay(1);
P1=0xff;
P0=0x00;
P1=0Xfb; //片选LCD3
P0=table[buf[3]];
delay(1);
P1=0xff;
P0=0x00;
P1=0Xf7;
P0=table[buf[0]]; //片选LCD4
delay(1);
}
void time0(void) interrupt 1 using 1 //定时中断子程序
{
b++;
if(b==19) // 定时器中断次数
{ b=0;
sec_dx--;
sec_nb--;
if(sec_nb<=5&&time==0) //东西黄灯闪
{ Green_dx=0;Yellow_dx=!Yellow_dx;}
if(sec_dx<=5&&time==1) //南北黄灯闪
{ Green_nb=0;Yellow_nb=!Yellow_nb;}
if(sec_dx==0&&sec_nb==5)
sec_dx=5;
if(sec_nb==0&&sec_dx==5)
sec_nb=5;
if(time==0&&sec_nb==0)
{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}
if(time==1&&sec_dx==0)
{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}
}
}
void key_to1() //键盘处理子程序之+
{
TR0=0; //关定时器
if(set==0)
set_timenb++; //南北加1S
else
set_timedx++; //东西加1S
if(set_timenb==100)
set_timenb=1;
if( set_timedx==100)
set_timedx=1; //加到100置1
sec_nb=set_timenb ; //设置的数值赋给东西南北
sec_dx=set_timedx;
}
void key_to2() //键盘处理子程序之-
{
TR0=0; //关定时器
if(set==0)
set_timenb--; //南北减1S
else
set_timedx--; //东西减1S
if(set_timenb==0)
set_timenb=99;
if( set_timedx==0 )
set_timedx=99; //减到1重置99
sec_nb=set_timenb ; //设置的数值赋给东西南北
sec_dx=set_timedx;
}
void key_to3() //键盘处理之紧急车通行
{
TR0=0;
P2=0Xc9;
sec_dx=00;
sec_nb=00;
Buzzer_Indicate=1;
}
void int0(void) interrupt 0 using 1 //只允许东西通行
{
TR0=0;
P2=0Xc3;
Buzzer_Indicate=0;
sec_dx=00;
sec_nb=00;
}
void int1(void) interrupt 2 using 1 //只允许南北通行
{
TR0=0;
P2=0X99;
Buzzer_Indicate=0;
sec_nb=00;
sec_dx=00;
}
void logo()//开机的Logo "- - - -"
{ for(n=0;n<50;n++)
{
P0=0x40;
P1=0xfe;
delay(1);
P1=0xfd;
delay(1);
P1=0Xfb;
delay(1);
P1=0Xf7;
delay(1);
P1 = 0xff;
}
}
void Buzzer()
{
if(Buzzer_Indicate==1)
Buzz=!Buzz;
else Buzz=0;
}
void delay(int ms) //延时子程序
{
uint j,k;
for(j=0;j<ms;j++)
for(k=0;k<124;k++);
}

晚上随手写,也未调试,权当看看
程序有不严谨地方还得调试修改
#include
#define STATUS_1S1
#define STATUS_2S2
#define STATUS_3S3
#define STATUS_4S4
#define STATUS_5S5
#define STATUS_15S15
#define STATUS_28S28
#define STATUS_29S29
#define STATUS_30S30
unsigned char flag,status,status_temp=1,status_temp_;
sbit K1=P0^0;
sbit K2 =P0^1;
sbit RLED=P0^2;
sbit YLED=P0^3;
sbit GLED=P0^4;
void Init(void)
{
ET0=1;
TR0=1;
RLED=0; //亮
YLED=0;
GLED=0;
while(status_temp)
{
switch (status)
{
case STATUS_1S://1S
{
RLED=1;//灭,闪一次
YLED=1;
GLED=1;
}break;
case STATUS_2S://1S
{
RLED=0;//亮,闪一次
YLED=0;
GLED=0;
}break;
case STATUS_3S://1S
{
RLED=1; //灭
YLED=1;
GLED=1;
status_temp=0;
}break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
void Init_Timer0(void)
{
TMOD=0x01;
//ET0=1;
//TR0=1;
EA=1;
TH0=0X3C;
TL0=0XB0; // 未计算,偷楼上的
}
void M_Start(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //红亮
while(status_temp)
{
switch (status)
{
case STATUS_1S:
{
if(status_temp_==1)
{
YLED=0;
}
}break;
case STATUS_2S:
{
if(status_temp_==1)
{
YLED=1;
}
}break;
case STATUS_3S:
{
if(status_temp_==1)
{
YLED=0;
status_temp_=0;
}
}break;
case STATUS_15S://15S灭,绿亮
{
RLED=1;
GLED=0;
}break;
case STATUS_28S:
{
GLED=1;
}break;
case STATUS_29S:
{
GLED=0;
}break;
case STATUS_30S:
{
GLED=1;
status=0;
status_temp_=1;
}break;
}
}
ET0=0;
TR0=0;
status=0;
status_temp=1;
YLED=1;
}
void M_End(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //亮 1次
YLED=0;
GLED=0;
while(status_temp)
{
switch (status)
{
case STATUS_1S://1S
{
RLED=1;//灭一次
YLED=1;
GLED=1;
}break;
case STATUS_2S://1S
{
RLED=0;//亮二次
YLED=0;
GLED=0;
}break;
case STATUS_3S://1S
{
RLED=1; ////灭二次
YLED=1;
GLED=1;
}break;
case STATUS_4S://1S
{
RLED=0; ////亮三次
YLED=0;
GLED=0;
}break;
case STATUS_5S://1S
{
RLED=1; ////灭三次
YLED=1;
GLED=1;
status_temp=0;
}break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1==0)
M_Start();//模拟开始
if(K2==0)
M_End();//模拟结束
}
}
void interrupt_time0() interrupt 1 //核对头文件,一致就好
{
TH0=0X3C;
TL0=0XB0;
flag++;
if(flag==20)
{
status++;
flag=0;
}
}

#include <reg52.h>
#define uint unsigned int
sbit red1=P1^2;
sbit yel1=P1^1;
sbit gre1=P1^7;
sbit red2=P1^4;
sbit yel2=P1^5;
sbit gre2=P1^6;//假设灯亮为低电平
sbit key1=P0^2;
sbit key2=P0^3;
uint tt;
void delay(uint z)
{
uchar x;
while(z--)
for(x=110;x>0;x--);
}
void key_1() //按键1
{
if(key1==0)
{
delay(10);
if(key1==0)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
tt=0;
while(!key1);
}

}
}
void key_2()///按键2
{
if(key2==0)
{
delay(10);
if(key2==0)
{
TR0=0;
P1=0xff;
while(!key2);
}

}
}
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
key_1();
key_2();

}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==1)
{
red1=0;gre2=0;// 红灯1绿灯2亮
}
if(tt==501)
{
red1=1;gre2=1; //红灯1绿灯2关
red1=0;yel2=0;//红灯1黄灯2亮
}
if(tt==601)
{
red1=1;yel2=1;//红灯1黄灯2关
gre1=0;red2=0;//绿灯1红灯2亮
}
if(tt==701)
{
tt=0;
gre1=1;red2=1;//绿灯1红灯2关
}
}

我可以帮你编辑好并作出防真

这些简单 但是繁杂 还是自己慢慢写吧

  • 求助一个单片机设计的交通灯程序,用C语言编写。
    答:red1=1;yel2=1;//红灯1黄灯2关 gre1=0;red2=0;//绿灯1红灯2亮 }
  • c51单片机c语言交通灯的程序
    答:接下来,我将详细解释如何为C51单片机使用C语言编写交通灯控制程序。首先,我们需要了解C51单片机的基本结构和资源,包括其I/O端口、定时器/计数器等。通常,交通灯系统需要控制红、黄、绿三种颜色的灯的亮灭,每种颜色的灯对应一个I/O端口。此外,我们还需要使用定时器来设置交通灯的切换时间。在编写程...
  • c51单片机c语言交通灯的程序
    答:void display();//显示子程序 void logo(); //开机LOGO void Buzzer();//主程序 void main(){ TMOD=0X01;TH0=0XD8;TL0=0XF0;EA=1;ET0=1;TR0=1;EX0=1;EX1=1;logo();P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5;while(1){ key(); //调用按键扫描程序...
  • 单片机做一个交通灯南北绿灯80秒黄灯3秒,东西绿灯60秒,当救护车来时...
    答:在设计中采用6个发光二极管来模拟2个路口的黄红绿灯,通过单片机P1口实现对交通灯的控制,控制连线的对应关系如表1所示。表1交通灯与单片机之间的控制关系1R 1Y 1B 1R 1Y 1BP1.5 P1.4 P1.3 P1.2 P1.1 P1.0南北红灯南北黄灯南北绿灯东西红灯东西黄灯东西绿灯主程序执行对P1口各使用位的控...
  • c51单片机控制交通灯要求用汇编语言
    答:// 51单片机控制交通灯要求用汇编语言,仿真实例,可以参考一下 SNF EQU 00H ; 南北通行标志位 EWF EQU 01H ; 东西通行标志位 URF EQU 02H ; 紧急事件标志位 ORG 0000H LJMP MAIN ; 上电转主程序 ORG 000BH ; 定时中断入口 LJMP DSZD ORG 0003H ...
  • 单片机控制十字路口交通灯程序设计
    答:如果一个单位时间为1秒,这里设定的十字路口交通灯按如下方式四个步骤循环工作:�8�5 60个单位时间,南北红,东西绿;�8�5 10个单位时间,南北红,东西黄;�8�5 60个单位时间,南北绿,东西红;�8�5 10个单位时间,...
  • 80c51单片机交通灯程序
    答:;正常运行交通灯 LP1:MOV P1,#61H CLR P3.2 CLR P3.3 CLR P3.4 SETB P3.5 ;1,3 路口红灯亮,2,4 路口绿灯亮 LCALL DELAY1 MOV B,#04H ;设置循环次数为4次 M:MOV P1,#51H CLR P3.5 SETB P3.4 ;1,3路口红灯亮,2,4路口黄灯亮 LCALL DELAY2 MOV P1,#41H CL...
  • 单片机控制交通灯
    答:DELAY1: MOV R1,#00H DELAY2: MOV R0,#0C2H DJNZ R0,DJNZ R1,DELAY2 ;延时100ms DJNZ R2,DELAY1 POP 00H POP 01H POP 02H RET END C51参考程序:/* 交通灯实验 */ //===声明区=== include<reg51.h> // 定义8051暂存器之标头档 define LED...
  • 有人可以帮我设计一个关于单片机的交通灯的程序吗,不需要太复杂_百度知 ...
    答:while(x--) for(i=0;i<120;i++);}//交通灯切换void Traffic_Light(){switch(Operation_Type){case 1: //东西向绿灯与南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case 2: //东西向黄灯闪烁绿灯关闭DelayMS(...
  • 急求:单片机汇编语言设计的交通灯,各位大侠帮帮忙 谢谢!!!
    答:设计要求:用AT89c51设计,要有驱动程序,东西南北方向的交通灯用六个指示灯分别别表示两个方向的红黄绿灯,要有复位功能,晶振为12MHZ,同时用数码管显示倒计时时间,可用按钮实现控... 设计要求:用AT89c51 设计,要有驱动程序,东西南北方向的交通灯 用六个指示灯分别别表示两个方向的红黄绿灯,要有复位功能,晶振为12M...