完成了,,,庆祝 /*************************************************************** * 程序名称: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;i<x;i++) // 执行x次,延迟X*10ms for (j=1;j<120;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(); //调用 } }