c51单片机c语言交通灯的程序
Proteus仿真原理图:
程序如下:
#include <reg51.h>
#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++);
}
C51单片机程序设计题,要求用C语言做,模拟交通灯控制单片机电路,答案要...
答:晚上随手写,也未调试,权当看看 程序有不严谨地方还得调试修改 include <REGX51.H> 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,...
普中科技的51单片机例程,里面有个交通灯的程序,我看不懂,这段代码啥...
答:第【3】同理,还是假如这个数是123,直接对10取模,相当于123除以10的余数,所以这句是求个位数。同样的【6】【7】的值是和【2】【3】相同,直接赋过去就行(只看这一段程序也看不出什么,我也就只能看到这个程度了,如果是对语法不清楚,建议查看一下C语言编程相关章节,这段程序挺简单的还是...
求51单片机的C代码
答:给你参考,可以联系我 / 十字路口交通灯控制 C 程序 / define uchar unsigned char define uint unsigned int include <reg52.h> /***定义控制位***/ sbit Time_Show_LED2=P2^5;//Time_Show_LED2控制位 sbit Time_Show_LED1=P2^4;//Time_Show_LED1控制位 sbit EW_LED2=P2^3;...
求89C51单片机C语言用四个74hc595控制四个LED实现交通灯程序
答:define uchar unsigned char define uint unsigned int uint t1oc=20; //20*50000us=1s uint count;uchar tp[8];uchar t1,t2,t3,t4;uchar d1,d2,d3,d4;//数码管显示代码 unsigned char code tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,...
跪求51单片机交通信号灯c语言程序设计
答:GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1;GREEN11 = 0; //宝田路绿灯亮 GREEN10 = 0; //宝田路人行道绿灯亮 RED01 = 0; //前进路红灯亮 RED00 = 0; //前进路人行道红灯亮 } //--黄灯等待切换状态,5秒--// else if(S...
求高人帮忙单片机交通灯编程
答://以下代码经过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秒 绿灯...
利用mcs-51单片机指令系统设计一段交通灯轮流点亮的程序
答:;路口1的车直行时各路口灯亮情况3a3b2p绿3c红+4a4b4c3p全红+1c绿1a1b4p红+2c绿2a2b1p红 ROAD1:MOV DPTR,#7F00H ;置8155命令口地址;无关位为1)MOV A,#03H ;A口、B口输出,A口、B口为基本输入输出方式 MOVX @DPTR,A ;写入工作方式控制字 INC DPTR ;指向A口 MOV A,#...
交通灯C51程序设计问题 有一错误:error c129 如何解决 急!!!_百度...
答:试试看:include <reg51.h> include <absacc.h> include <intrins.h> define uchar unsigned char define uint unsigned int define PA8255 0x8000 define PB8255 0x8100 define PC8255 0x8200 define CTRL8255 0x8400 define S1 (P1 = 0x28)define S2 (P0 = 0x51)define ...
单片机的红绿灯控制程序如何写啊
答://--- //名称:LED模拟交通灯 //作者:彭伟《单片机C语言程序设计实训100例-基于8051+PROTEUS仿真》//--- //说明:东西向绿灯亮若干秒后,黄灯闪烁,闪烁5次后亮红灯 // 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁 // 闪烁5次后亮红灯,东西向绿灯亮,如此重复 //-...
交通灯 C语言 单片机。中断函数问题
答:参考《51单片机C语言创新教程》温子祺等著。源码转自:《51单片机C语言创新教程》。/*实验名称:交通灯实验 描 述:交通灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒,当红灯切换为绿灯或者绿灯切换为红灯,要实现灯闪烁。红灯、绿灯、黄灯的点亮持续时间可以通过串口来修改,并在下一个循环中更新...