项目场景:
纯小白 第一次写文章 写的不好请见谅
做51单片机数码管显示时间实验的时候protues 仿真出现了问题
问题描述
做51单片机数码管显示时间实验的时候protues 仿真出现了问题
仿真数码管不显示时间 暂停仿真却显示当前单个数码管正常值
错误代码:
static unsigned char i = 0;
if(++i == 9) i = 1;
//消重影
P0 = 0x0;
switch(i)
{
case 1: P2=wei[0]; P0=~SMG[0]; break;
case 2: P2=wei[1]; P0=~SMG[1]; break;
case 3: P2=wei[2]; P0=~SMG[2]; break;
case 4: P2=wei[3]; P0=~SMG[3]; break;
case 5: P2=wei[4]; P0=~SMG[4]; break;
case 6: P2=wei[5]; P0=~SMG[5]; break;
case 7: P2=wei[6]; P0=~SMG[6]; break;
case 8: P2=wei[7]; P0=~SMG[7]; break;
//delay(1); 延时1ms
}
原因分析:
开始以为是定时器1时间短,修改后发现问题没解决,加入延时函数反而正常了
解决方案:
最后发现是P0消隐位置不对 加入延时刚好避开了消隐 凑巧解决了问题 修改消隐位置后问题解决
全程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char SMG[8];
unsigned char shi = 11,fen = 45,miao =14;
void delay (uint i)
{
uint m,n;
for(m=i;m>0;m--)
for(n=72;n>0;n--);
}
void show()
{
static unsigned char i = 0;
if(++i == 9) i = 1;
//消重影
switch(i)
{
case 1: P2=wei[0]; P0 = 0x0;P0=~SMG[0]; break;
case 2: P2=wei[1]; P0 = 0x0;P0=~SMG[1]; break;
case 3: P2=wei[2]; P0 = 0x0;P0=~SMG[2]; break;
case 4: P2=wei[3]; P0 = 0x0;P0=~SMG[3]; break;
case 5: P2=wei[4]; P0 = 0x0;P0=~SMG[4]; break;
case 6: P2=wei[5]; P0 = 0x0;P0=~SMG[5]; break;
case 7: P2=wei[6]; P0 = 0x0;P0=~SMG[6]; break;
case 8: P2=wei[7]; P0 = 0x0;P0=~SMG[7]; break;
}
}
void timer0_init(void)
{
EA = 1; //打开总中断
TMOD |= 0x01; //TMOD = 0x01
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256; //设置定时器初值
ET0 = 1; //打开定时器中断
TR0 = 1; // 打开定时器
}
void timer1_init(void)
{
EA = 1; //打开总中断
TMOD |= 0x10; // TMOD = TMOD | 0x10 = 0x11
TH1 = (65536 - 2000) / 256;
TL1 = (65536 - 2000) % 256; //设置定时器初值
ET1 = 1; //打开定时器中断
TR1 = 1; // 打开定时器
}
void main()
{
timer0_init();
timer1_init();
while(1);
}
void timer0_isr() interrupt 1
{
static unsigned char i = 0;
TH0 = (65536 - 50000) / 256; //高八位赋初值
TL0 = (65536 - 50000) % 256; //设置定时器初值,1ms产生一次中断 低八位赋初值
i++;
if(20 == i)
{
i = 0;
miao++;
if(60 == miao)
{
miao = 0;
fen++;
if(60 == fen)
{
fen = 0;
shi++;
if(24 == shi)
{
shi = 0;
fen = 0;
miao = 0;
}
}
}
}
SMG[0] = duan[shi / 10];
SMG[1] = duan[shi % 10];
SMG[2] = 0x40;
SMG[3] = duan[fen / 10];
SMG[4] = duan[fen % 10];
SMG[5] = 0x40;
SMG[6] = duan[miao / 10];
SMG[7] = duan[miao % 10];
}
void timer1_isr() interrupt 3
{
TH1 = (65536 - 2000) / 256;
TL1 = (65536 - 2000) % 256; //设置定时器初值
show();
}
附上仿真图及效果

510

被折叠的 条评论
为什么被折叠?



