找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2494|回复: 12
打印 上一主题 下一主题
收起左侧

单片机小白,定时1ms,数码管依旧闪烁怎么解决?

[复制链接]
跳转到指定楼层
楼主
ID:719032 发表于 2020-3-30 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编程实现前五位数码管显示固定数字,后两位数码管循环显示数字0~99
定时为1ms,前四位一直闪烁
#include<reg51.h>
#include<intrins.h>
#define SEG1 P0//段码线
#define SEG2 P1//段码线
#define SEG3 P3//段码线
sbit S1=P2^0;//第1个数码管公共端  位选线
sbit S2=P2^1;//第2个数码管公共端  位选线
sbit S3=P2^2;//第3个数码管公共端  位选线
sbit S4=P2^3;//第4个数码管公共端  位选线
sbit S5=P2^4;//第5个数码管公共端  位选线
void Delayms(unsigned int c);/*延时函数*/


//unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x671};//显示0~F的值 共阴极
//0~F段码 //显示0~F的值 共阴极

unsigned char code DIG_CODE[16]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值         共阳极
//0~F段码 //显示0~F的值         共阳极
void main()
{
                int n;
                while(1)
                  for(n=0;n<=99;n++)
        {
          {       
                S1= 1;S2= 0;S3= 0;S4= 0;S5=0 ;//第1个数码管工作 第2/3/4/5个数码管不工作
                SEG1 = DIG_CODE[0];         //万位
                Delayms(1);
                S1= 0;S2= 1;S3= 0;S4= 0;S5=0; //第1/3/4/5个数码管不工作 第2个数码管工作
                SEG1 = DIG_CODE[6];        //千位
                Delayms(1);
                S1= 0;S2= 0;S3= 1;S4= 0;S5=0; //第1/2/4/5个数码管不工作 第3个数码管工作
                SEG1 = DIG_CODE[1]; //百位
                Delayms(1);
                S1= 0;S2= 0;S3= 0;S4= 1;S5=0; //第1/2/3/5个数码管不工作 第4个数码管工作
                SEG1 = DIG_CODE[2];         //十位
                Delayms(1);
                S1= 0;S2= 0;S3= 0;S4= 0;S5=1; //第1/2/3/4个数码管不工作 第5个数码管工作
                SEG1 = DIG_CODE[3];         //个位
                Delayms(1);       
                         SEG2=        DIG_CODE[n%100/10];
                         SEG3=        DIG_CODE[n%10];
                         Delayms(50);
                }
          
        }                               
}

void Delayms(unsigned int c)                //@12.000MHz
{
        unsigned char i, j;
        while(c--)
        {
                i = 2;
                j = 239;
                do
                {
                        while (--j);
                } while (--i);
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2020-3-30 21:17 | 只看该作者
把延时程序改为用定时器延时2ms就好了,因为循环延时不准确
回复

使用道具 举报

板凳
ID:114631 发表于 2020-3-31 04:08 | 只看该作者
主要是Delayms(50);这个太长,导致最后一位显示时间长,前面的4位显示时间每位只有Delayms(1),就会引起闪烁。
把Delayms(50)去掉。Delayms(1);改大一点,可以改成Delayms(5);
回复

使用道具 举报

地板
ID:584814 发表于 2020-3-31 10:25 | 只看该作者
从硬件方面,将前几位信号锁存就不闪了,如果仅做样子可以直接短接;
从软件方面,显示同步延时,末两位多次显示相同内容后再加1以求效果。
回复

使用道具 举报

5#
ID:213173 发表于 2020-3-31 13:34 | 只看该作者
void main()
{
        int n;
        while(1)
?????????
        for(n=0;n<=99;n++)
        {
                {       
回复

使用道具 举报

6#
ID:718123 发表于 2020-3-31 18:53 | 只看该作者
delay函数的延时问题,建议把delay后面的数值慢慢调试,但是用delay函数的话延时1ms一般都不会很精确,可以采用定时中断定时1ms。
回复

使用道具 举报

7#
ID:201555 发表于 2020-3-31 22:02 | 只看该作者
整体刷新频率低于50hz()肯定闪烁,即刷新周期大于20
ms肯定闪烁。
回复

使用道具 举报

8#
ID:719032 发表于 2020-4-1 07:38 来自手机 | 只看该作者
chenalfe2013 发表于 2020-3-31 04:08
主要是Delayms(50);这个太长,导致最后一位显示时间长,前面的4位显示时间每位只有Delayms(1),就会引起闪 ...

把延时改小的话0~99循环太快就看不清了
回复

使用道具 举报

9#
ID:719032 发表于 2020-4-1 07:41 来自手机 | 只看该作者
wulin 发表于 2020-3-31 13:34
void main()
{
        int n;

把for语句放在后面前四位闪一下就不亮了
回复

使用道具 举报

10#
ID:719032 发表于 2020-4-1 07:47 来自手机 | 只看该作者
man1234567 发表于 2020-3-31 10:25
从硬件方面,将前几位信号锁存就不闪了,如果仅做样子可以直接短接;
从软件方面,显示同步延时,末两位多 ...

能给一下具体的程序吗?我刚刚开始学这门课,不太理解
回复

使用道具 举报

11#
ID:719032 发表于 2020-4-1 07:49 来自手机 | 只看该作者
起风了~ 发表于 2020-3-31 18:53
delay函数的延时问题,建议把delay后面的数值慢慢调试,但是用delay函数的话延时1ms一般都不会很精确,可以 ...

定时中断怎么用?可以具体解释一下吗?我刚刚接触这门课,不太懂
回复

使用道具 举报

12#
ID:584556 发表于 2020-4-1 10:48 | 只看该作者
你这个for循坏加的目的是不是想快速扫描达到消隐的效果,结果是不是和你预想不一样,首先呐,循环不用那么多,你有几个数码管就用几个循环,然后加入你的段选位选信号,然后定时器产生1ms延时。建议写一个显示函数,不要在主程序里面写那么多。
回复

使用道具 举报

13#
ID:719032 发表于 2020-4-1 12:58 来自手机 | 只看该作者
一泓秋 发表于 2020-4-1 10:48
你这个for循坏加的目的是不是想快速扫描达到消隐的效果,结果是不是和你预想不一样,首先呐,循环不用那么 ...

for循环是为了最后两位循环显示0~99,下面的那些是前五位固定数字的显示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表