找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1932|回复: 10
收起左侧

向大佬请教一个单片机定时器控制数码管显示数字的程序

[复制链接]
ID:480306 发表于 2019-5-7 12:59 | 显示全部楼层 |阅读模式
这个程序运行之后只在数码管的最高位显示了数字,并不能实现每隔一秒钟依次显示0-7,这是为什么?
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void display()
{                                 
u8 a;
for(a=0;a<8;a++)
{
switch(a)
{
                case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位                 
}
P0=smgduan[a];
P0=0x00;
}  
}
void dingshiqiyunxu()
{
TMOD|=0x01;
TH0=0XFC;
TL0=0X18;
ET0=1;
EA=1;
TR0=1;
}
void main()
{

  dingshiqiyunxu();
  while(1)
  {        
  }
}
void int1() interrupt 1 using 1
{

static u16 i;
TH0=0XFC;
TL0=0X18;
i++;
if(i==1000)
{
i=0;
display();
}
}  


回复

使用道具 举报

ID:149451 发表于 2019-5-24 08:12 | 显示全部楼层
粗看了下,给P0连续赋值有问题吧?另一处,主程序里缺显示语句,应该在第一行加上那句初始化才回有显示语句
回复

使用道具 举报

ID:516588 发表于 2019-5-24 10:27 | 显示全部楼层
你的while();循环语句里面是空的
回复

使用道具 举报

ID:516588 发表于 2019-5-24 10:30 | 显示全部楼层
P0=smgduan[a];这句后面加个简单的延时,然后主程序这儿while(1);后面加个分后,大括号删掉
回复

使用道具 举报

ID:93224 发表于 2019-5-24 18:25 | 显示全部楼层
论坛里面有好多数码管的程序,你可以下载看看
回复

使用道具 举报

ID:327029 发表于 2019-5-24 21:29 | 显示全部楼层
缺少延时程序,缺少循环显示程序
回复

使用道具 举报

ID:155507 发表于 2019-5-24 23:46 | 显示全部楼层
因为是动态显示,每位轮流显示,所以display(); 要每隔 10毫秒钟 运行
回复

使用道具 举报

ID:426861 发表于 2019-5-25 08:56 | 显示全部楼层
单步运行看一下,你程序只执行了一次
回复

使用道具 举报

ID:404263 发表于 2019-5-25 09:57 | 显示全部楼层
我觉得是你P0=0x00这里出了问题了吧P0=smgduan[a];P0=0x00;这里的话数据只显示了一瞬间就被清0了,而且定时器内使用for循环语句的话可能会导致定时器的时间不准确,最好少用
回复

使用道具 举报

ID:462827 发表于 2019-5-25 11:06 | 显示全部楼层
P0=smgduan[a];
P0=0x00;

这两行之间插入一个延时就可以了。
回复

使用道具 举报

ID:444146 发表于 2019-5-25 16:03 | 显示全部楼层
我觉得你缺少了一部分,没有延时
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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