谢谢大家了,昨天我又请教了一下同学,经过我们的反复检查调试已经成功解决问题了。/**************************************************
实验名:交通灯设计
实验内容:利用中断,定时/计数器,数码管和led灯进行交通灯的设计
*************************************************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wei1=P2^4; //定义位选 0
sbit wei2=P2^5; //1
sbit wei3=P2^6; //2
sbit wei4=P2^7; //3
sbit green_we=P1^2; //定义交通灯 绿东西
sbit green_ns=P1^3; //定义交通灯 绿南北
sbit red_we=P1^0; //定义交通灯 红东西
sbit red_ns=P1^1; //定义交通灯 红南北
sbit yellow_we=P1^4; //定义交通灯 黄东西
sbit yellow_ns=P1^5; //定义交通灯 黄南北
uchar num,num1,shi_we,shi_ns,ge_we,ge_ns;
uint xianshi_we,xianshi_ns;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //定义数值0,1,2...9
void delayms(uint xsm) //延时程序
{
uint i,j;
for(i=xsm;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi_we,uchar ge_we,uchar shi_ns,uchar ge_ns) //定义数码管动态扫描函数
{
wei1=1;
wei2=0;
wei3=0;
wei4=0;
P0=table[shi_we];
delayms(5);
wei1=0;
wei2=1;
wei3=0;
wei4=0;
P0=table[ge_we];
delayms(5);
wei1=0;
wei2=0;
wei3=1;
wei4=0;
P0=table[shi_ns];
delayms(5);
wei1=0;
wei2=0;
wei3=0;
wei4=1;
P0=table[ge_ns];
delayms(5);
}
void main()
{
num=0;
num1=0;
xianshi_we=19;
xianshi_ns=19;
shi_we=1;
ge_we=9;
shi_ns=1;
ge_ns=9;
TMOD=0x01; //设置定时器0和计数器1为工作方式1
TH0=(65536-46080)/256; //设置初值
TL0=(65536-46080)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
P1=0xff; //led灯全灭
P1=0xf6; //定义东西亮红灯,南北亮绿灯;
while(1)
{
display(shi_we,ge_we,shi_ns,ge_ns);
if(num1==17)
{
P1=0xde; //定义东西亮红灯,南北亮黄灯;
}
if(num1==19)
{
P1=0xf9; //定义东西亮绿灯,南北亮红灯;
xianshi_we=19;
xianshi_ns=19;
}
if(num1==36)
{
P1=0xed; //定义东西亮黄灯,南北亮红灯;
}
if(num1==39)
{
num1=0;
xianshi_we=19;
xianshi_ns=19;
P1=0xf6; //定义东西亮红灯,南北亮绿灯;
}
}
}
void T0_time()interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
num++;
if(num%20==0)
{
num=0; num1++;
xianshi_we--;
xianshi_ns--;
shi_we=xianshi_we/10;
ge_we=xianshi_we%10;
shi_ns=xianshi_ns/10;
ge_ns=xianshi_ns%10;
}
}
这是修改过的程序,已经在板子上实际检验过了,没大问题,基本能实现所预想的那样。剩下的就是添加外部中断以解决紧急情况了。再次感谢大家了 |