STC单片机数码管动态显示——计时器(不使用中断)

 

一.原理:

1.(如何用仅用一组P0口段选控制5位数码管)?

    假设5位数码管由5个IO口控制5个端,首先关闭5个端口,然后打开com1(以下简称cn),将c1控制的数码管显示一个数,然后关闭c1,打开c2,将c2控制的数码管显示一个数,关闭c2,期间会发现数码管1显示一个数字,然后灭,随后数码管2显示一个数字,然后灭。因此,只需将亮灭频率降低至肉眼可见范围即可产生同时显示2个数字的现象。

2.如何实现计时?

    假设计数范围为(0~100)利用数字编码方式显示数字。

    共阳极(0-9)编码为

        table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};

    设数字为i;

    个位为i%10

    十位为i/10


二.遇到的问题

1.出现闪烁:

原因

    在设置i++的间隔时,c1-c5均为0,不显示,i++结束后,数字显示,因此数码管会闪烁,且闪烁间隔为i++的间隔。

解决方法:

    通过循环亮灯部分,设置循环次数以达到控制计数的时间间隔。而i++部分不进行延迟,即显示01时循环亮灭500次约1ms,随机i++,显示02,以此类推,既实现计数间隔的设置,且不出现闪烁。


三.硬件部分:

    单片机:stc8a8k64d系列

    数码管:共阳极5位数码管

 ·数码管引脚-编码对应图

四.代码部分

1.初始部分

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
void delays(uint);
sfr P5=0xc8;
sfr P0M0   =   0x94;  
sfr P0M1   =   0x93;   
sfr P2M0   =   0x96;   
sfr P2M1   =   0x95;

2.建立编码(0-8)采用共阳极数码管

unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};

3.delay(延迟函数的定义)


void delays(uint xms)
{uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);

}

4.IO口的定义
 


sbit key=P5^1;//按键(开关)
sbit k1=P2^5;//接com端
sbit k2=P2^4;//接com端
sbit k3=P2^3;//接com端
sbit k4=P2^6;//接com端
sbit k5=P2^7;//接com端

5.主程序部分


int i;
int j;
void main()
{P0M0=0;
P0M1=0;
P2M0=0xff;
P2M1=0;
k1=0;
k2=0;  
k3=0;
k4=0;
k5=0;



while(1)
  {i++;j=300;
while(j>0){

k1=1;
  if(key==0)
  i=0;
P0=table[i/100];
delays(10);
k1=0;
//  

k2=1;
  if(key==0)
  i=0;
P0=table[(i/10)%10];
delays(10);
k2=0;
k3=1;
  if(key==0)
  i=0;
P0=table[i%10];
delays(10);
k3=0;
j--;
  if(key==0)
  i=0;
}   
}
}

作者:ysw

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值