楼主的程序:
- #include <reg52.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- char count=0,num=15,i,j; /**count为定时器技术变量,num为时刻变量,i为*/
- char number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//
- bit flag=0;//1s的标识变量
- //交通灯控制位
- sbit P1_0=P1^0;
- sbit P1_1=P1^1;
- sbit P1_2=P1^2;
- sbit P1_3=P1^3;
- sbit P1_4=P1^4;
- sbit P1_5=P1^5;
- sbit P1_6=P1^6;
- //数码管显示位控制
- sbit P2_0 = P2^0;
- sbit P2_1 = P2^1;
- //PT2272接收端
- sbit PT2272_DDR_D0 = P3^0;
- sbit PT2272_DDR_D1 = P3^1;
- sbit PT2272_DDR_D2 = P3^2;
- sbit PT2272_DDR_D3 = P3^3;
- /*************************************************************
- **函数名称:delayms()
- **函数功能:ms延时函数
- **入口参数:延时时间 i;
- **出口参数:无
- *************************************************************/
-
- void delayms(unsigned char i)
- { unsigned char j ;
- while(i--)
- {for(j=0;j<125;j++)
- {; } }
- }
- /*************************************************************
- **函数名称:Timer_srv() interrupt 1
- **函数功能:定时器中断函数
- **入口参数:无
- **出口参数:无
- *************************************************************/
- Timer_srv() interrupt 1 using 1
- {
- TH0=0x3c;
- TL0=0xaf; /**重新设置定时器初值**/
- count++; //定时器计数加1,表示已经计数100ms
- if(count==10)
- {
- count=0;
- flag=1;
- } //计满10次,定时器计数变量count初始化,并标识已计时1s
- }
- /*************************************************************
- **函数名称:Display(int n)
- **函数功能:数码管显示函数
- **入口参数:要显示的数字 n
- **出口参数:无
- *************************************************************/
- void Display(int n)
- {
- P2_0 = 1;
- P0 = number[n%10];
- delayms(1);
- P2 = 0x00;
- P2_1 = 1;
- P0 = number[n/10];
- delayms(1);
- P2 = 0x00;
- }
- /*************************************************************
- **函数名称:light()
- **函数功能:交通灯显示
- **入口参数:无
- **出口参数:无
- *************************************************************/
- void light(void)
- {
- while(1)
- {
- P1_0=!P1_0; //P1.0 S1状态打开 南北方向 红灯
- P1_3=!P1_3; //P1.3 S1状态打开 东西方向 绿灯
- Display(num);
- while(num<60&&num>5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //60秒倒计时显示
- }
-
- P1_0=!P1_0; //关闭S1状态,
- P1_3=!P1_3;
-
- P1_1=!P1_1; //打开S2状态 南北方向 黄灯
- P1_4=!P1_4; //打开S2状态 南北方向 黄灯
- while(num>=0&&num<=5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //5秒倒计时显示
- }
- P1_1=!P1_1; /*黄灯闪烁*/
- P1_4=!P1_4;
- if(0==num)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num);
- } //判断时刻为0,重置数据
-
- P1_2=!P1_2; //关闭S2状态,打开S3状态 南北方向 绿灯
- P1_5=!P1_5; //关闭S2状态,打开S3状态 东西方向 红灯
- while(num<=30&&num>5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //30秒倒计时显示
- }
- P1_2=!P1_2; //关闭S3
- P1_5=!P1_5;
-
- P1_1=!P1_1; //打开S2
- P1_4=!P1_4;
- while(num>=0&&num<=5)
- {
- while(!flag) //等待1s
- flag = 0;
- num --;
- Display(num); //5秒倒计时显示
- }
- P1_0=!P1_0; /*闪烁*/
- if(0==num)
- {
- while(!flag) //等待1s
- flag = 0;
- num = 60; //重置计数
- }
- }
- }
- /*************************************************************
- **函数名称:PT2272_init()
- **函数功能:PT2272初始化函数
- **入口参数:无
- **出口参数:无
- *************************************************************/
- void PT2272_init(void)
- {
- PT2272_DDR_D0&= ~(PT2272_DDR_D0);
- PT2272_DDR_D1 &= ~(PT2272_DDR_D1);
- PT2272_DDR_D2 &= ~(PT2272_DDR_D2);
- PT2272_DDR_D3 &= ~(PT2272_DDR_D3);
- }
- /***************主函数**************************/
- void main()
- {
- TMOD = 0x01;
- TH0=0x3c;
- TL0=0xaf;
- EA=1;
- TR0=1;/*开定时器0中断*/
- P0 = 0x00; /*初始化P0*/
- PT2272_init();//PT2272初始化
- light();/*调用显示子程序*/
- while(1);
- }
复制代码 |