这次写的是基于单片机控制的交通灯,由于第一次写,外部中断服务程序还没写,只写了数码管倒计时 红黄绿状态变化的代码,我就编译了 把hex文件装入proteus里模拟了一下,行不通,不知道是电路画错了还是程序错了,我实在是检查不出哪里有问题。。求各位大神指教一下,小生感激不尽,好人好报。在这里把代码和模拟电路的文件贴出来。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define time 50000
sbit red_a=P1^3;
sbit green_a=P1^4;
sbit yellow_a=P1^5;
sbit red_b=P1^0;
sbit green_b=P1^1;
sbit yellow_b=P1^2;
sbit int0_key=P3^2;
sbit kai=P3^7;
uint n1,n2,n3,n4,g1,g2,g3,g4;
uchar mm=0; //全局变量
uchar flag0=0; //a绿 b红 定义标志位
uchar flag1=0; //a黄 b红
uchar flag2=0; //a红 b绿
uchar flag3=0; //a红 b黄
uchar t=0; //35秒倒计时完 跳变到25倒计时
uchar b=35,a=25,ac=30,bc=20; //分别为b车道和a车道红灯时间 a车道和b车道绿灯时间
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
void inittime01() //初始化定时器0 外部中断0
{
TMOD=0X11; //定时器0和1都工作在方式1
TH0=(65536-50000)/256; //50ms计时
TL0=(65536-50000)%256;
TH1=(65536-50000)/256; //50ms计时
TL1=(65536-50000)%256;
TR0=1; //启动定时器0 开始计时
ET0=1; //允许定时器0中断
EA=1; //开总中断
IE0=1; //启动外部中断0
EX0=1; //开中断0
IT0=1; //外部中断0为跳变沿触发
PX0=1; //外部中断0优先级设为最高
}
void delay(uint num)
{
while(num--);
}
void timer0() interrupt 1 //定时器0中断服务程序
{
mm++;
TH0=(65536-50000)/256; //50ms计时
TL0=(65536-50000)%256;
if(mm==20) //每到一秒都会执行这个语句
{
mm=0;
if(b<=35&&b>0)
{
b--; //b车道红灯值35
ac--; //a车道绿灯和黄灯的倒计时值30和5
}
if(t==1) //切换状态 倒计时25秒
{
a--; //a车道红灯值25
bc--; //b车道绿灯和黄灯倒计时值20和5
}
}
}
void disp_daojishi1() //a车道通车b车道红灯停车 数码管倒计时显示
{
n1=ac/10; //a车道十位
n2=ac%10; //a车道个位
n3=b/10; //b车道十位
n4=b/10; //b车道个位
P2=0xf7; //b车道个位
P0=led[n4];
delay(200);
P2=0xfb; //b车道十位
P0=led[n3];
delay(200);
P2=0xfd; //a车道个位
P0=led[n2];
delay(200);
P2=0xfe; //a车道十位
P0=led[n1];
delay(200);
P0=0xff;
}
void disp_daojishi2() //a车道红灯b车道通车 数码管倒计时显示
{
g1=a/10; //a车道十位
g2=a%10; //a车道个位
g3=bc/10; //b车道十位
g4=bc/10; //b车道个位
P2=0xf7; //b车道个位
P0=led[g4];
delay(200);
P2=0xfb; //b车道十位
P0=led[g3];
delay(200);
P2=0xfd; //a车道个位
P0=led[g2];
delay(200);
P2=0xfe; //a车道十位
P0=led[g1];
delay(200);
P0=0xff;
}
void qiehuan()
{
if(b) //b红灯倒计时35s
{
a=25; //又给a赋值25秒
bc=20;
if(b<=35&&b>5)
flag0=1; //a绿 b红
if(b<=5) //a黄 b红
{
ac=5; // a黄灯置初值5秒
flag0=0; //关闭状态0
flag1=1;
if(b==0)
t=1;
}
else
{
flag0=1;
}
}
if(t==1)
{
flag1=0; //关闭状态1
if(a)
{
if(a<=25&&a>=5)
{
flag2=1; //a红 b绿
}
if(a<=5)
{
bc=5; //置b车道黄灯初值5秒
flag2=0; //关闭状态2
flag3=1; //a红 b黄
if(b==0)
{
b=35; //又返回第0状态 置初值
ac=30;
flag3=0; //关闭状态3
t=0; //关闭切换状态b——倒计时25秒
}
}
}
}
}
void main()
{
kai=1; //74hc573通断开关
P0=0xff;
P2=0xff; //开始时使a b车道都不亮
inittime01();
while(1)
{
qiehuan();
if(b<=35&&b>0)
disp_daojishi1();
if(t==1)
disp_daojishi2();
if(flag0) //状态0 a绿 b红
{
green_a=0;
red_b=0;
}
if(flag1) //启动状态1 a黄b红
{
green_a=1; //关闭状态0
red_b=1;
yellow_a=0;
red_b=0;
}
if(flag2) //启动状态2 a红b绿
{
yellow_a=1;
red_b=1;
red_a=0;
green_b=0;
}
if(flag3) //启动状态3 a红b黄
{
red_a=1;
green_b=1;
red_a=0;
yellow_a=0;
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
为什么我反正是通的,很多年啦,印象还是很深刻啊。
一样的原理图,proteus是可以的,手工焊接了的不行,然后我看到了上拉。
一周热门 更多>