问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

【单片机实训问题】设计一个交通控制器

发布网友 发布时间: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,还给你加了紧急按键和正常工作按键。自己看看吧,我已经在硬件上实现了,程序没问题,记得守信,给我分!
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
无水奶油对健康的影响是什么? 《米修斯之印》预约奖励介绍 蓝色星原旅谣在哪预约-游戏预约地址 阴阳师百闻牌taptap礼包怎么领_taptap礼包兑换码分享 猫之城抽卡怎么退出 猫之城测试资格怎么获得 内测名额申请教学 猫之城预约奖励有什么 预约奖励详细攻略 无人机怕什么干扰?解析无人机干扰的类型及应对措施 什么叫干扰三要素 观察动物日记越多越好 用亚龙单片机实训装置,通过51单片机控制机械手,我把矩阵键盘的键盘扫描... SPDIF-Out 端口 有什么用 密码长度6—20字符怎么设置- 问一问 6到20个字符怎么设置? 用户客名请输入6-20位字符是什么意思- 问一问 十二星座最造合学的乐器 斤斤计较的家庭,真的走不出胸怀博大的孩子吗? 如何在生活中运用观人术? 心相篇的介绍 心相篇的作者 适合12星座的东方乐器! (中国古代乐器) 为什么收派服务费会计入管理费用办公费, 供应链公司经常发生的收派服务费计入成本还是费用 92神雕侠侣之痴心情长剑 刘德华和吴孟达的一老电影 战狼2电影还用胶片吗 纪录片《加油中国》 下载 ...又是英语~~2006年考研英语阅读第5篇的开头第一句话的翻译 08~09国产电影 文献片《加油·中国》的片尾曲是什么? 十二星座最擅长的学科是哪门 12星座最擅长哪门学科 罗致徵聘 用选聘与挚友造句 用推推搡搡,恕不可遏,驰聘,漩涡,寒噤,造句。要求一句话。用上所有词语... 十二星座最擅长哪门学科 盘点十二星座最擅长的学科 合金筷子抗菌和不抗菌的区别 买合金筷子要选抗菌的吗? 有什么好玩的大型动作网游 推荐几款横版动作的网游 有什么好玩的网游 、最好是动作竞技类得 、TX游戏就憋住吧~ 推荐一款3D动作类网游 谁有父子同志片啊?小说也行! 跪求有中年同志或者父子同志小说的发给我tn1188@163.com越多越好。最好... 求父子同性小说和图片! bl父子文,大概是父饮醉后强了自己的儿子.后来儿子不愿回家成了gay... 电影[儿子同志]下载 谁有泰国同志电影父子同行的资源,谢谢! 新房交房条件和新房交房的注意事项 十二星座适合什么民族乐器
  • 焦点

最新推荐

猜你喜欢

热门推荐