MSC51单片机交通灯程序
时间:08-16
来源:互联网
点击:
/***************************************************************
* 程序名称:MSC51单片机交通灯 晶振:12.00 P1口
* 实验对象:HC6800单片机学习开发板
* 单 片 机:AT89S52或STC89C52 时间:红绿灯各亮10s
*
* 更多的资料和程序共享请关注51hei.com
****************************************************************/
/#include reg52.h>
#define uchar unsigned char /*宏定义 */
#define uint unsigned int /*宏定义 */
uchar sec,sec1; /*秒*/
uchar int_num; /*定时溢出作用标号*/
sbit reda=P1^0; //A路口红灯
sbit yellowa=P1^1; //A路口黄灯
sbit greena=P1^2; //A路口绿灯
sbit redb=P1^3; //B路口红灯
sbit yellowb=P1^4; //b路口黄灯
sbit greenb=P1^5; //b路口绿灯
void redyellowb(); //b路口红黄灯闪烁
void redyellowa(); //a路口红黄灯闪烁
void delay10ms(uint x); //闪烁延时
void inter_init(); /*定时器初始化子函数声明*/
/****专用数码管显示表***/
//uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; /*0x40显示“一”符号*/
//uchar code wema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00};
//---------------------初始化T0函数--------------------------
void time0(void) interrupt 1 /*定时器T0服务子程序*/
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_num++;
}
//---------------------定时器函数--------------------------
void inter_init() /*定时器初始化子函数*/
{
EA=1;
ET0=1; /*打开定时器T0*/
TMOD=0x01; /*工作方式1*/
TCON = 0x00; /*触发方式*/
IP = 0x01; /*中断优先级别,T0优先*/
TH0=(65535-50000)/256; /*置初值,大约50ms一个中断 */
TL0=(65535-50000)%256;
TR0=1; /*置位TR0,启动定时器0*/
}
//--------------------- 交通灯变换--------------------------
void time10()
{
if(int_num==20) //20为1s可改为10加速调试
{
int_num=0;
sec++;
sec1++;
if(sec==10) //10s
{
greenb=1; // b路口绿灯关
EA=0; // 关中断
redyellowa(); // a路口红黄灯共闪(调用)
reda=1; // a路口红灯关
greena=0; // a路口绿灯开
redb=0; // b路口红灯开
EA=1; // 开中断
}
if(sec1==20) //20s
{
greena=1; // a路口绿灯关
EA=0; // 关中断
redyellowb(); // b路口红黄灯
redb=1; // b路口红灯关
greenb=0; // b路口绿灯开
reda=0; // a路口红灯开
sec=0; // 秒清零
EA=1; // 关中断
sec1=0; // 秒1清零 ()
}
} //
}
//------------------------------10ms时间调用----------------------------------
void delay10ms(uint x)
{ uint i,j; // 声明变量
for (i=1;ix;i++) // 执行x次,延迟X*10ms
for (j=1;j120;j++);// 执行120次,延迟10ms
} // delay1ms()函数结束
//---------------------- // a路口红黄灯共闪(调用)---------------------------
void redyellowa()
{
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
}
//---------------------- // b路口红黄灯共闪(调用)---------------------------
void redyellowb()
{
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
}
//---------------------主函数--------------------------------
void main()
{
inter_init(); /*定时器初始化*/
reda=0;greenb=0; // 路灯初始化
while(1) //死循环
{
time10(); //调用
}
}
* 程序名称:MSC51单片机交通灯 晶振:12.00 P1口
* 实验对象:HC6800单片机学习开发板
* 单 片 机:AT89S52或STC89C52 时间:红绿灯各亮10s
*
* 更多的资料和程序共享请关注51hei.com
****************************************************************/
/#include reg52.h>
#define uchar unsigned char /*宏定义 */
#define uint unsigned int /*宏定义 */
uchar sec,sec1; /*秒*/
uchar int_num; /*定时溢出作用标号*/
sbit reda=P1^0; //A路口红灯
sbit yellowa=P1^1; //A路口黄灯
sbit greena=P1^2; //A路口绿灯
sbit redb=P1^3; //B路口红灯
sbit yellowb=P1^4; //b路口黄灯
sbit greenb=P1^5; //b路口绿灯
void redyellowb(); //b路口红黄灯闪烁
void redyellowa(); //a路口红黄灯闪烁
void delay10ms(uint x); //闪烁延时
void inter_init(); /*定时器初始化子函数声明*/
/****专用数码管显示表***/
//uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; /*0x40显示“一”符号*/
//uchar code wema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00};
//---------------------初始化T0函数--------------------------
void time0(void) interrupt 1 /*定时器T0服务子程序*/
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
int_num++;
}
//---------------------定时器函数--------------------------
void inter_init() /*定时器初始化子函数*/
{
EA=1;
ET0=1; /*打开定时器T0*/
TMOD=0x01; /*工作方式1*/
TCON = 0x00; /*触发方式*/
IP = 0x01; /*中断优先级别,T0优先*/
TH0=(65535-50000)/256; /*置初值,大约50ms一个中断 */
TL0=(65535-50000)%256;
TR0=1; /*置位TR0,启动定时器0*/
}
//--------------------- 交通灯变换--------------------------
void time10()
{
if(int_num==20) //20为1s可改为10加速调试
{
int_num=0;
sec++;
sec1++;
if(sec==10) //10s
{
greenb=1; // b路口绿灯关
EA=0; // 关中断
redyellowa(); // a路口红黄灯共闪(调用)
reda=1; // a路口红灯关
greena=0; // a路口绿灯开
redb=0; // b路口红灯开
EA=1; // 开中断
}
if(sec1==20) //20s
{
greena=1; // a路口绿灯关
EA=0; // 关中断
redyellowb(); // b路口红黄灯
redb=1; // b路口红灯关
greenb=0; // b路口绿灯开
reda=0; // a路口红灯开
sec=0; // 秒清零
EA=1; // 关中断
sec1=0; // 秒1清零 ()
}
} //
}
//------------------------------10ms时间调用----------------------------------
void delay10ms(uint x)
{ uint i,j; // 声明变量
for (i=1;ix;i++) // 执行x次,延迟X*10ms
for (j=1;j120;j++);// 执行120次,延迟10ms
} // delay1ms()函数结束
//---------------------- // a路口红黄灯共闪(调用)---------------------------
void redyellowa()
{
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
}
//---------------------- // b路口红黄灯共闪(调用)---------------------------
void redyellowb()
{
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
}
//---------------------主函数--------------------------------
void main()
{
inter_init(); /*定时器初始化*/
reda=0;greenb=0; // 路灯初始化
while(1) //死循环
{
time10(); //调用
}
}
- 基于MSC51系列的LCD1602通用程序(11-11)
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)