这是我上个月做的代码,
内有源代码,
请多多指导。- #include "reg52.h"
- #include "intrins.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- #define GPIO_DIG P0
- #define GPIO_TRAFFIC P1
- sbit RED10 = P1^0; //上人行道红灯
- sbit GREEN10 = P1^1; //上人行道绿灯
- sbit RED11 = P1^2;
- sbit YELLOW11= P1^3;
- sbit GREEN11 = P1^4;
- sbit RED00 = P3^0; //右人行道红灯
- sbit GREEN00 = P3^1; //右人行道绿灯
- sbit RED01 = P1^5;
- sbit YELLOW01= P1^6;
- sbit GREEN01 = P1^7;
- sbit k3=P3^2; //定义按键K3
- int TIME=0;
- u8 code smgduan[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴 code 代码 编码
- u8 DisplayData[8];//8个以上的(显示0~F的值 一个8段的数码管)
- /*******************************************************************************
- * 函数名 :UsartInit()
- * 函数功能 :设置串口
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- //void Usart()
- //{
- // SCON=0X50; //设置为工作方式1,sm0=0,sm1=1,sm2=0,ren=1,高位0101=0X5,低位0X00,224页
- // TMOD=0X20; //设置计数器工作方式2 0010 178页
- // PCON=0X80; //波特率加倍 1000 0000 SMOD=1 225页
- // TH1=0XF3; //计数器初始值设置,注意波特率是4800的,51波特率计算
- // TL1=0XF3;
- // ES=1; //打开接收中断 149页ES串口中断允许位
- // EA=1; //打开总中断 149页 EA : CPU的总中断允许控制位,EA=1
- // TR1=1; //打开计数器 177页 TR1: 定时器T1的运行控制位
- //
- //}
- void delay(u16 i)
- {
- while(i--);
- }
-
- void DigDisplay()
- {
- u8 j;
- for(j=0;j<8;j++)
- {
- switch(j) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- }
- GPIO_DIG=DisplayData[j];//发送段码
- delay(100); //间隔一段时间扫描
- GPIO_DIG=0x00;//消隐
-
- }
-
- }
- void Int0Init()
- {
- //设置INT0
- IT0=1;//跳变沿出发方式(下降沿)
- EX0=1;//打开INT0的中断允许。
- EA=1;//打开总中断
- }
- /*******************************************************************************
- * 函 数 名 : datapros()
- * 函数功能 : 数据处理转换函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void datapros()
- {
- static u16 i=0;
- i++;
- if(i==5) //改变i的数值可调节跳的快慢
- {
- i=0;
- TIME ++;
- }
- DisplayData[0] = 0x00;
- DisplayData[1] = smgduan[TIME/1000000];
- DisplayData[2] = smgduan[TIME%1000000/100000];
- DisplayData[3] = smgduan[TIME%100000/10000];
- DisplayData[4] = smgduan[TIME%10000/1000];
- DisplayData[5] = smgduan[TIME%1000/100];
- DisplayData[6] = smgduan[TIME%100/10]|0x80;
- DisplayData[7] = smgduan[TIME%10];
- if(TIME==2000) TIME=0; //TIME的数值,计到2000,回0从新开始
-
- }
- void main()
- {
- Int0Init(); // 设置外部中断0
- // Usart(); // 串口初始化
- while (1)
- {
- datapros(); //数据处理函数
- DigDisplay(); //数码管显示函数
- // RI=0;
- // SBUF=TIME;
- if(TIME>1000)
- {
- GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭
- RED00 = 1;
- GREEN00 = 1;
- GREEN11 = 0; //宝田路绿灯亮
- GREEN10 = 0; //宝田路人行道绿灯亮
- RED01 = 0; //前进路红灯亮
- RED00 = 0; //前进路人行道红灯亮
- }
- else
- {
- GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭
- RED00 = 1;
- GREEN00 = 1;
- YELLOW11 = 0; //宝田路黄灯亮
- RED10 = 0; //宝田路人行道红灯亮
- YELLOW01 = 0; //前进路红灯亮
- RED00 = 0; //前进路人行道红灯亮
- }
- }
-
-
- }
- void Int0() interrupt 0 //外部中断0的中断函数
- {
- delay(1000); //延时消抖
- if(k3==0)
- {
- TIME=520;
- }
- }
复制代码
|