51单片机动态数码管显示时间+protues仿真

项目场景:

纯小白 第一次写文章 写的不好请见谅

做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();
}

附上仿真图及效果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值