【单片机实训问题】设计一个交通控制器
发布网友
发布时间:2022-06-25 02:58
我来回答
共1个回答
热心网友
时间:2024-10-08 07:42
/*--------------------------------------------
程序名称:十字路*通灯控制程序
CPU:51单片机
功能:实现十字路口四组交通灯的控制,带时间显
示、紧急情况控制和恢复正常工作控制
--------------------------------------------*/
#include<reg52.h>
unsigned int i,j,shi,flag,ge,ew=25,sn=45,wait1=3,wait2=3;
sbit an=P2^6; //数码管段选通(第一个74HC573选通)
sbit wei=P2^7; //数码管位选通(第一个74HC573选通)
sbit accident=P2^5; // 紧急按键
sbit work=P2^3; // 正常工作按键
unsigned char code table[]={0x3f,0x06, //定义数组存放数码管的显示代码0~9
0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void inittimer();
void leddisplay(unsigned int x);
void delay();
void main()
{
inittimer(); //定时器初始化
while(1)
{
accident=1;
i=accident; //读按键accident
if(i==0) //当紧急情况键按下时进入
{
wei=1; //关闭数码管时间显示
P0=0xff;
wei=0;
P1=0xcf; //全部红灯亮
P3=0xfc;
work=1;
while(work) //按下了紧急情况键后而又没有按下回复工作键,则一直亮红灯
ew=25; //重新工作室重新设定计数初值
sn=45;
wait1=3;
wait2=3;
flag=0;
}
if(flag<=900) //南北通行45秒,在900*50=45000ms=45s,在45s时间范围内进行南北通行
{
P1=0xf0;
P3=0xff;
leddisplay(sn); //调用数码管显示子程序
}
if((flag>900)&&(flag<=960)) //中间黄灯闪3秒
{
P3=0xff;
leddisplay(wait1);
}
if((flag>960)&&(flag<=1460)) //东西通行25秒
{
P1=0xff;
P3=0x00;
leddisplay(ew);
}
if((flag>1460)&&(flag<1520)) //黄灯闪3秒
{
//P1=0x0f;
P3=0xff;
leddisplay(wait2);
}
}
}
/*-------------------------------------
函数名称:定时器1初始化程序
功能:设置工作方式为方式1(16位计数模式)
装初值(使每次计数时间为50ms)
开定时器中断,启动定时器
-------------------------------------*/
void inittimer()
{
TMOD=0X01; //方式1
TH0=0X3C; //装载初值
TL0=0Xb0;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
/*--------------------------------
函数名称:定时器0中断服务子程序
功能:重装初值,计数增减
--------------------------------*/
void timer0() interrupt 1
{
TH0=0X3C;
TL0=0Xb0;
flag++; //总的计数标志,没过50ms就加1
if(flag<=900)
{
if((flag%20)==0) //南北时间秒减1,flag对20取余等于0说明够1s了,显示时间减1
sn--;
}
if((flag>900)&&(flag<=960))
{
P1=0x0f;
if(flag%5==0) //黄灯每250ms闪烁一次
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1
wait1--;
}
if((flag>960)&&(flag<=1460))
{
if(flag%20==0) //东西时间秒减1
ew--;
}
if((flag>1460)&&(flag<1520))
{
P1=0x0f;
if(flag%5==0)
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1.
wait2--;
}
if(flag==1520) //计数慢一个周期后重新开始计数
{
flag=0;ew=25,sn=45,wait1=3,wait2=3;
}
}
/*---------------------------------
函数名称:数码管显示子程序
功能:把要显示的内容作为参数进行动态
显示
---------------------------------*/
void leddisplay(unsigned int x)
{
shi=x/10; //取出要显示的数的十位
ge=x%10; //取出要显示的数的个位
wei=1;
P0=0xaa; //选通十位的数码管
wei=0;
an=1;
P0=table[shi];
an=0;
delay(); //延时消隐
wei=1;
P0=0x55; //选通个位的数码管
wei=0;
an=1;
P0=table[ge];
an=0;
delay(); //延时消隐
}
void delay()
{
int t=200;
while(t--);
}
上面是我刚做的一个程序,跟你的要求几乎是一样的,只是灯亮的时间不同,中间黄灯闪烁3s,南北通行45s,东西通行25s,还给你加了紧急按键和正常工作按键。自己看看吧,我已经在硬件上实现了,程序没问题,记得守信,给我分!
热心网友
时间:2024-10-08 07:42
/*--------------------------------------------
程序名称:十字路*通灯控制程序
CPU:51单片机
功能:实现十字路口四组交通灯的控制,带时间显
示、紧急情况控制和恢复正常工作控制
--------------------------------------------*/
#include<reg52.h>
unsigned int i,j,shi,flag,ge,ew=25,sn=45,wait1=3,wait2=3;
sbit an=P2^6; //数码管段选通(第一个74HC573选通)
sbit wei=P2^7; //数码管位选通(第一个74HC573选通)
sbit accident=P2^5; // 紧急按键
sbit work=P2^3; // 正常工作按键
unsigned char code table[]={0x3f,0x06, //定义数组存放数码管的显示代码0~9
0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void inittimer();
void leddisplay(unsigned int x);
void delay();
void main()
{
inittimer(); //定时器初始化
while(1)
{
accident=1;
i=accident; //读按键accident
if(i==0) //当紧急情况键按下时进入
{
wei=1; //关闭数码管时间显示
P0=0xff;
wei=0;
P1=0xcf; //全部红灯亮
P3=0xfc;
work=1;
while(work) //按下了紧急情况键后而又没有按下回复工作键,则一直亮红灯
ew=25; //重新工作室重新设定计数初值
sn=45;
wait1=3;
wait2=3;
flag=0;
}
if(flag<=900) //南北通行45秒,在900*50=45000ms=45s,在45s时间范围内进行南北通行
{
P1=0xf0;
P3=0xff;
leddisplay(sn); //调用数码管显示子程序
}
if((flag>900)&&(flag<=960)) //中间黄灯闪3秒
{
P3=0xff;
leddisplay(wait1);
}
if((flag>960)&&(flag<=1460)) //东西通行25秒
{
P1=0xff;
P3=0x00;
leddisplay(ew);
}
if((flag>1460)&&(flag<1520)) //黄灯闪3秒
{
//P1=0x0f;
P3=0xff;
leddisplay(wait2);
}
}
}
/*-------------------------------------
函数名称:定时器1初始化程序
功能:设置工作方式为方式1(16位计数模式)
装初值(使每次计数时间为50ms)
开定时器中断,启动定时器
-------------------------------------*/
void inittimer()
{
TMOD=0X01; //方式1
TH0=0X3C; //装载初值
TL0=0Xb0;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
/*--------------------------------
函数名称:定时器0中断服务子程序
功能:重装初值,计数增减
--------------------------------*/
void timer0() interrupt 1
{
TH0=0X3C;
TL0=0Xb0;
flag++; //总的计数标志,没过50ms就加1
if(flag<=900)
{
if((flag%20)==0) //南北时间秒减1,flag对20取余等于0说明够1s了,显示时间减1
sn--;
}
if((flag>900)&&(flag<=960))
{
P1=0x0f;
if(flag%5==0) //黄灯每250ms闪烁一次
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1
wait1--;
}
if((flag>960)&&(flag<=1460))
{
if(flag%20==0) //东西时间秒减1
ew--;
}
if((flag>1460)&&(flag<1520))
{
P1=0x0f;
if(flag%5==0)
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1.
wait2--;
}
if(flag==1520) //计数慢一个周期后重新开始计数
{
flag=0;ew=25,sn=45,wait1=3,wait2=3;
}
}
/*---------------------------------
函数名称:数码管显示子程序
功能:把要显示的内容作为参数进行动态
显示
---------------------------------*/
void leddisplay(unsigned int x)
{
shi=x/10; //取出要显示的数的十位
ge=x%10; //取出要显示的数的个位
wei=1;
P0=0xaa; //选通十位的数码管
wei=0;
an=1;
P0=table[shi];
an=0;
delay(); //延时消隐
wei=1;
P0=0x55; //选通个位的数码管
wei=0;
an=1;
P0=table[ge];
an=0;
delay(); //延时消隐
}
void delay()
{
int t=200;
while(t--);
}
上面是我刚做的一个程序,跟你的要求几乎是一样的,只是灯亮的时间不同,中间黄灯闪烁3s,南北通行45s,东西通行25s,还给你加了紧急按键和正常工作按键。自己看看吧,我已经在硬件上实现了,程序没问题,记得守信,给我分!
热心网友
时间:2024-10-08 07:42
/*--------------------------------------------
程序名称:十字路*通灯控制程序
CPU:51单片机
功能:实现十字路口四组交通灯的控制,带时间显
示、紧急情况控制和恢复正常工作控制
--------------------------------------------*/
#include<reg52.h>
unsigned int i,j,shi,flag,ge,ew=25,sn=45,wait1=3,wait2=3;
sbit an=P2^6; //数码管段选通(第一个74HC573选通)
sbit wei=P2^7; //数码管位选通(第一个74HC573选通)
sbit accident=P2^5; // 紧急按键
sbit work=P2^3; // 正常工作按键
unsigned char code table[]={0x3f,0x06, //定义数组存放数码管的显示代码0~9
0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void inittimer();
void leddisplay(unsigned int x);
void delay();
void main()
{
inittimer(); //定时器初始化
while(1)
{
accident=1;
i=accident; //读按键accident
if(i==0) //当紧急情况键按下时进入
{
wei=1; //关闭数码管时间显示
P0=0xff;
wei=0;
P1=0xcf; //全部红灯亮
P3=0xfc;
work=1;
while(work) //按下了紧急情况键后而又没有按下回复工作键,则一直亮红灯
ew=25; //重新工作室重新设定计数初值
sn=45;
wait1=3;
wait2=3;
flag=0;
}
if(flag<=900) //南北通行45秒,在900*50=45000ms=45s,在45s时间范围内进行南北通行
{
P1=0xf0;
P3=0xff;
leddisplay(sn); //调用数码管显示子程序
}
if((flag>900)&&(flag<=960)) //中间黄灯闪3秒
{
P3=0xff;
leddisplay(wait1);
}
if((flag>960)&&(flag<=1460)) //东西通行25秒
{
P1=0xff;
P3=0x00;
leddisplay(ew);
}
if((flag>1460)&&(flag<1520)) //黄灯闪3秒
{
//P1=0x0f;
P3=0xff;
leddisplay(wait2);
}
}
}
/*-------------------------------------
函数名称:定时器1初始化程序
功能:设置工作方式为方式1(16位计数模式)
装初值(使每次计数时间为50ms)
开定时器中断,启动定时器
-------------------------------------*/
void inittimer()
{
TMOD=0X01; //方式1
TH0=0X3C; //装载初值
TL0=0Xb0;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
/*--------------------------------
函数名称:定时器0中断服务子程序
功能:重装初值,计数增减
--------------------------------*/
void timer0() interrupt 1
{
TH0=0X3C;
TL0=0Xb0;
flag++; //总的计数标志,没过50ms就加1
if(flag<=900)
{
if((flag%20)==0) //南北时间秒减1,flag对20取余等于0说明够1s了,显示时间减1
sn--;
}
if((flag>900)&&(flag<=960))
{
P1=0x0f;
if(flag%5==0) //黄灯每250ms闪烁一次
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1
wait1--;
}
if((flag>960)&&(flag<=1460))
{
if(flag%20==0) //东西时间秒减1
ew--;
}
if((flag>1460)&&(flag<1520))
{
P1=0x0f;
if(flag%5==0)
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1.
wait2--;
}
if(flag==1520) //计数慢一个周期后重新开始计数
{
flag=0;ew=25,sn=45,wait1=3,wait2=3;
}
}
/*---------------------------------
函数名称:数码管显示子程序
功能:把要显示的内容作为参数进行动态
显示
---------------------------------*/
void leddisplay(unsigned int x)
{
shi=x/10; //取出要显示的数的十位
ge=x%10; //取出要显示的数的个位
wei=1;
P0=0xaa; //选通十位的数码管
wei=0;
an=1;
P0=table[shi];
an=0;
delay(); //延时消隐
wei=1;
P0=0x55; //选通个位的数码管
wei=0;
an=1;
P0=table[ge];
an=0;
delay(); //延时消隐
}
void delay()
{
int t=200;
while(t--);
}
上面是我刚做的一个程序,跟你的要求几乎是一样的,只是灯亮的时间不同,中间黄灯闪烁3s,南北通行45s,东西通行25s,还给你加了紧急按键和正常工作按键。自己看看吧,我已经在硬件上实现了,程序没问题,记得守信,给我分!
热心网友
时间:2024-10-08 07:42
/*--------------------------------------------
程序名称:十字路*通灯控制程序
CPU:51单片机
功能:实现十字路口四组交通灯的控制,带时间显
示、紧急情况控制和恢复正常工作控制
--------------------------------------------*/
#include<reg52.h>
unsigned int i,j,shi,flag,ge,ew=25,sn=45,wait1=3,wait2=3;
sbit an=P2^6; //数码管段选通(第一个74HC573选通)
sbit wei=P2^7; //数码管位选通(第一个74HC573选通)
sbit accident=P2^5; // 紧急按键
sbit work=P2^3; // 正常工作按键
unsigned char code table[]={0x3f,0x06, //定义数组存放数码管的显示代码0~9
0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void inittimer();
void leddisplay(unsigned int x);
void delay();
void main()
{
inittimer(); //定时器初始化
while(1)
{
accident=1;
i=accident; //读按键accident
if(i==0) //当紧急情况键按下时进入
{
wei=1; //关闭数码管时间显示
P0=0xff;
wei=0;
P1=0xcf; //全部红灯亮
P3=0xfc;
work=1;
while(work) //按下了紧急情况键后而又没有按下回复工作键,则一直亮红灯
ew=25; //重新工作室重新设定计数初值
sn=45;
wait1=3;
wait2=3;
flag=0;
}
if(flag<=900) //南北通行45秒,在900*50=45000ms=45s,在45s时间范围内进行南北通行
{
P1=0xf0;
P3=0xff;
leddisplay(sn); //调用数码管显示子程序
}
if((flag>900)&&(flag<=960)) //中间黄灯闪3秒
{
P3=0xff;
leddisplay(wait1);
}
if((flag>960)&&(flag<=1460)) //东西通行25秒
{
P1=0xff;
P3=0x00;
leddisplay(ew);
}
if((flag>1460)&&(flag<1520)) //黄灯闪3秒
{
//P1=0x0f;
P3=0xff;
leddisplay(wait2);
}
}
}
/*-------------------------------------
函数名称:定时器1初始化程序
功能:设置工作方式为方式1(16位计数模式)
装初值(使每次计数时间为50ms)
开定时器中断,启动定时器
-------------------------------------*/
void inittimer()
{
TMOD=0X01; //方式1
TH0=0X3C; //装载初值
TL0=0Xb0;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
/*--------------------------------
函数名称:定时器0中断服务子程序
功能:重装初值,计数增减
--------------------------------*/
void timer0() interrupt 1
{
TH0=0X3C;
TL0=0Xb0;
flag++; //总的计数标志,没过50ms就加1
if(flag<=900)
{
if((flag%20)==0) //南北时间秒减1,flag对20取余等于0说明够1s了,显示时间减1
sn--;
}
if((flag>900)&&(flag<=960))
{
P1=0x0f;
if(flag%5==0) //黄灯每250ms闪烁一次
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1
wait1--;
}
if((flag>960)&&(flag<=1460))
{
if(flag%20==0) //东西时间秒减1
ew--;
}
if((flag>1460)&&(flag<1520))
{
P1=0x0f;
if(flag%5==0)
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1.
wait2--;
}
if(flag==1520) //计数慢一个周期后重新开始计数
{
flag=0;ew=25,sn=45,wait1=3,wait2=3;
}
}
/*---------------------------------
函数名称:数码管显示子程序
功能:把要显示的内容作为参数进行动态
显示
---------------------------------*/
void leddisplay(unsigned int x)
{
shi=x/10; //取出要显示的数的十位
ge=x%10; //取出要显示的数的个位
wei=1;
P0=0xaa; //选通十位的数码管
wei=0;
an=1;
P0=table[shi];
an=0;
delay(); //延时消隐
wei=1;
P0=0x55; //选通个位的数码管
wei=0;
an=1;
P0=table[ge];
an=0;
delay(); //延时消隐
}
void delay()
{
int t=200;
while(t--);
}
上面是我刚做的一个程序,跟你的要求几乎是一样的,只是灯亮的时间不同,中间黄灯闪烁3s,南北通行45s,东西通行25s,还给你加了紧急按键和正常工作按键。自己看看吧,我已经在硬件上实现了,程序没问题,记得守信,给我分!
热心网友
时间:2024-10-08 07:43
/*--------------------------------------------
程序名称:十字路*通灯控制程序
CPU:51单片机
功能:实现十字路口四组交通灯的控制,带时间显
示、紧急情况控制和恢复正常工作控制
--------------------------------------------*/
#include<reg52.h>
unsigned int i,j,shi,flag,ge,ew=25,sn=45,wait1=3,wait2=3;
sbit an=P2^6; //数码管段选通(第一个74HC573选通)
sbit wei=P2^7; //数码管位选通(第一个74HC573选通)
sbit accident=P2^5; // 紧急按键
sbit work=P2^3; // 正常工作按键
unsigned char code table[]={0x3f,0x06, //定义数组存放数码管的显示代码0~9
0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void inittimer();
void leddisplay(unsigned int x);
void delay();
void main()
{
inittimer(); //定时器初始化
while(1)
{
accident=1;
i=accident; //读按键accident
if(i==0) //当紧急情况键按下时进入
{
wei=1; //关闭数码管时间显示
P0=0xff;
wei=0;
P1=0xcf; //全部红灯亮
P3=0xfc;
work=1;
while(work) //按下了紧急情况键后而又没有按下回复工作键,则一直亮红灯
ew=25; //重新工作室重新设定计数初值
sn=45;
wait1=3;
wait2=3;
flag=0;
}
if(flag<=900) //南北通行45秒,在900*50=45000ms=45s,在45s时间范围内进行南北通行
{
P1=0xf0;
P3=0xff;
leddisplay(sn); //调用数码管显示子程序
}
if((flag>900)&&(flag<=960)) //中间黄灯闪3秒
{
P3=0xff;
leddisplay(wait1);
}
if((flag>960)&&(flag<=1460)) //东西通行25秒
{
P1=0xff;
P3=0x00;
leddisplay(ew);
}
if((flag>1460)&&(flag<1520)) //黄灯闪3秒
{
//P1=0x0f;
P3=0xff;
leddisplay(wait2);
}
}
}
/*-------------------------------------
函数名称:定时器1初始化程序
功能:设置工作方式为方式1(16位计数模式)
装初值(使每次计数时间为50ms)
开定时器中断,启动定时器
-------------------------------------*/
void inittimer()
{
TMOD=0X01; //方式1
TH0=0X3C; //装载初值
TL0=0Xb0;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
/*--------------------------------
函数名称:定时器0中断服务子程序
功能:重装初值,计数增减
--------------------------------*/
void timer0() interrupt 1
{
TH0=0X3C;
TL0=0Xb0;
flag++; //总的计数标志,没过50ms就加1
if(flag<=900)
{
if((flag%20)==0) //南北时间秒减1,flag对20取余等于0说明够1s了,显示时间减1
sn--;
}
if((flag>900)&&(flag<=960))
{
P1=0x0f;
if(flag%5==0) //黄灯每250ms闪烁一次
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1
wait1--;
}
if((flag>960)&&(flag<=1460))
{
if(flag%20==0) //东西时间秒减1
ew--;
}
if((flag>1460)&&(flag<1520))
{
P1=0x0f;
if(flag%5==0)
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1.
wait2--;
}
if(flag==1520) //计数慢一个周期后重新开始计数
{
flag=0;ew=25,sn=45,wait1=3,wait2=3;
}
}
/*---------------------------------
函数名称:数码管显示子程序
功能:把要显示的内容作为参数进行动态
显示
---------------------------------*/
void leddisplay(unsigned int x)
{
shi=x/10; //取出要显示的数的十位
ge=x%10; //取出要显示的数的个位
wei=1;
P0=0xaa; //选通十位的数码管
wei=0;
an=1;
P0=table[shi];
an=0;
delay(); //延时消隐
wei=1;
P0=0x55; //选通个位的数码管
wei=0;
an=1;
P0=table[ge];
an=0;
delay(); //延时消隐
}
void delay()
{
int t=200;
while(t--);
}
上面是我刚做的一个程序,跟你的要求几乎是一样的,只是灯亮的时间不同,中间黄灯闪烁3s,南北通行45s,东西通行25s,还给你加了紧急按键和正常工作按键。自己看看吧,我已经在硬件上实现了,程序没问题,记得守信,给我分!
热心网友
时间:2024-10-08 07:43
/*--------------------------------------------
程序名称:十字路*通灯控制程序
CPU:51单片机
功能:实现十字路口四组交通灯的控制,带时间显
示、紧急情况控制和恢复正常工作控制
--------------------------------------------*/
#include<reg52.h>
unsigned int i,j,shi,flag,ge,ew=25,sn=45,wait1=3,wait2=3;
sbit an=P2^6; //数码管段选通(第一个74HC573选通)
sbit wei=P2^7; //数码管位选通(第一个74HC573选通)
sbit accident=P2^5; // 紧急按键
sbit work=P2^3; // 正常工作按键
unsigned char code table[]={0x3f,0x06, //定义数组存放数码管的显示代码0~9
0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void inittimer();
void leddisplay(unsigned int x);
void delay();
void main()
{
inittimer(); //定时器初始化
while(1)
{
accident=1;
i=accident; //读按键accident
if(i==0) //当紧急情况键按下时进入
{
wei=1; //关闭数码管时间显示
P0=0xff;
wei=0;
P1=0xcf; //全部红灯亮
P3=0xfc;
work=1;
while(work) //按下了紧急情况键后而又没有按下回复工作键,则一直亮红灯
ew=25; //重新工作室重新设定计数初值
sn=45;
wait1=3;
wait2=3;
flag=0;
}
if(flag<=900) //南北通行45秒,在900*50=45000ms=45s,在45s时间范围内进行南北通行
{
P1=0xf0;
P3=0xff;
leddisplay(sn); //调用数码管显示子程序
}
if((flag>900)&&(flag<=960)) //中间黄灯闪3秒
{
P3=0xff;
leddisplay(wait1);
}
if((flag>960)&&(flag<=1460)) //东西通行25秒
{
P1=0xff;
P3=0x00;
leddisplay(ew);
}
if((flag>1460)&&(flag<1520)) //黄灯闪3秒
{
//P1=0x0f;
P3=0xff;
leddisplay(wait2);
}
}
}
/*-------------------------------------
函数名称:定时器1初始化程序
功能:设置工作方式为方式1(16位计数模式)
装初值(使每次计数时间为50ms)
开定时器中断,启动定时器
-------------------------------------*/
void inittimer()
{
TMOD=0X01; //方式1
TH0=0X3C; //装载初值
TL0=0Xb0;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
/*--------------------------------
函数名称:定时器0中断服务子程序
功能:重装初值,计数增减
--------------------------------*/
void timer0() interrupt 1
{
TH0=0X3C;
TL0=0Xb0;
flag++; //总的计数标志,没过50ms就加1
if(flag<=900)
{
if((flag%20)==0) //南北时间秒减1,flag对20取余等于0说明够1s了,显示时间减1
sn--;
}
if((flag>900)&&(flag<=960))
{
P1=0x0f;
if(flag%5==0) //黄灯每250ms闪烁一次
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1
wait1--;
}
if((flag>960)&&(flag<=1460))
{
if(flag%20==0) //东西时间秒减1
ew--;
}
if((flag>1460)&&(flag<1520))
{
P1=0x0f;
if(flag%5==0)
P1=(~P1)|0x0f;
if(flag%20==0) //黄灯等待减1.
wait2--;
}
if(flag==1520) //计数慢一个周期后重新开始计数
{
flag=0;ew=25,sn=45,wait1=3,wait2=3;
}
}
/*---------------------------------
函数名称:数码管显示子程序
功能:把要显示的内容作为参数进行动态
显示
---------------------------------*/
void leddisplay(unsigned int x)
{
shi=x/10; //取出要显示的数的十位
ge=x%10; //取出要显示的数的个位
wei=1;
P0=0xaa; //选通十位的数码管
wei=0;
an=1;
P0=table[shi];
an=0;
delay(); //延时消隐
wei=1;
P0=0x55; //选通个位的数码管
wei=0;
an=1;
P0=table[ge];
an=0;
delay(); //延时消隐
}
void delay()
{
int t=200;
while(t--);
}
上面是我刚做的一个程序,跟你的要求几乎是一样的,只是灯亮的时间不同,中间黄灯闪烁3s,南北通行45s,东西通行25s,还给你加了紧急按键和正常工作按键。自己看看吧,我已经在硬件上实现了,程序没问题,记得守信,给我分!