这个代码是改的其他人的,但是仿真的时候不知道是哪里出问题了
单片机源程序如下:
- #include <reg52.h>
- #define led P2
- sbit LED1 = P3^0;
- sbit LED2 = P3^1;
- sbit LED3 = P3^2;
- sbit LED4 = P3^3;
- sbit LED5 = P3^4;
- sbit LED6 = P3^5;
- unsigned char code LedChar[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};//数码管显示字符转换表
- unsigned char LedBuff[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓冲区,初值 0xFF 确保启动时都不亮
- unsigned char i = 0; //动态扫描的索引
- unsigned int cnt = 0; //记录 T0 中断次数
- unsigned char flag1s = 0; //1 秒定时标志
- void main()
- {
- unsigned long sec ; //记录经过的秒数
- EA = 1; //使能总中断
- TMOD = 0x01; //设置 T0 为模式 1
- TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1ms
- TL0 = 0x67;
- ET0 = 1; //使能 T0 中断
- TR0 = 1; //启动 T0
- while (1)
- {
- if (flag1s == 1) //判断 1 秒定时标志
- {
- flag1s = 0; //1 秒定时标志清零
- sec++; //秒计数自加 1
-
- //以下代码将 sec 按十进制位从低到高依次提取并转为数码管显示字符
- }
- LedBuff[0] = LedChar[sec%10];
- LedBuff[1] = LedChar[sec/10%10];
- LedBuff[2] = LedChar[sec/100%10];
- LedBuff[3] = LedChar[sec/1000%10];
- LedBuff[4] = LedChar[sec/10000%10];
- LedBuff[5] = LedChar[sec/100000%10];
-
- }
- }
- /* 定时器 0 中断服务函数 */
- void InterruptTimer0() interrupt 1
- {
- TH0 = 0xFC; //重新加载初值
- TL0 = 0x67;
- cnt++; //中断次数计数值加 1
- if (cnt >= 1000) //中断 1000 次即 1 秒
- {
- cnt = 0; //清零计数值以重新开始下 1 秒计时
- flag1s = 1; //设置 1 秒定时标志为 1
- }
-
- //以下代码完成数码管动态扫描刷新
-
- P2 = 0xff; //显示消隐
- switch (i)
- {
- case 0: LED1 = 0;i++; led = LedBuff[0]; LED1 = 1; break;
- case 1: LED2 = 0;i++; led = LedBuff[1]; LED2 = 1; break;
- case 2: LED3 = 0;i++; led = LedBuff[2]; LED3 = 1; break;
- case 3: LED4 = 0;i++; led = LedBuff[3]; LED4 = 1; break;
- case 4: LED5 = 0;i++; led = LedBuff[4]; LED5 = 1; break;
- case 5: LED6 = 0;i=0; led = LedBuff[5]; LED6 = 1; break;
- default: break;
- }
- }
复制代码
|