找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7615|回复: 5
收起左侧

数码管断码显示-问题

[复制链接]
ID:25285 发表于 2010-8-8 13:45 | 显示全部楼层 |阅读模式

各位大师好!

      我现在在学动太数码管显示,在做试验时出现异常,一直找不出问题所在原因。请各位大师帮心分析。

条件:实验板为:51Hei-5

作业内容为:我们实验板上为8个数码管,现只用前面6个。先第1个数码管亮1,其它不亮,1秒后第2个数码管亮2,其它数码农管不亮,再过1秒后第3个数码管亮3,其它数码管不亮。按这个规率一直循环下去。

可我实验的结果:8个数码管却一直常亮全部显示“8”。

请各位大师指点!

以下是我的原码:

 


#include<reg52.h>
#include<intrins.h>//参数左移头文件
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,numdu,numwe;
sbit dula=P2^6;//定义dula
sbit wela=P2^7;//定义wela
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//数给的格试uchar code table[]={}在{}中要写入数据
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void main()
{
 numdu=0;
 numwe=0;
 aa=0;
 
 TMOD=0x01;//对TMOD付值也可写:TMOD=1;
 TH0=(65536-50000)/256;//THO初值,"/"为求莫,(65536-50000)/256放到高8位中
 TL0=(65536-50000)%256;//HO初值,"*"为求余,(65536-50000)%256放到低8位中
 EA=1;//开总中断
 ET0=1;//开定时器中断
 TR0=1;//启动定时器
/*定时器/计数器设置流程
1对TMOD赋值,以确定T0及T1的工作方式;
2计算初值,并将其值写入TH0,TL0或TH1,TL1中;
3中断方式时,则对IE赋值,开放中断;
4致TR0或TR1置位,启动定时/计数器定时或计数
*/
 while(1)
  {
   if(aa=20)
    {
     numdu++;
     if(numdu==7)
      numdu=1;
     dula=1;
     P0=table[numdu];
     dula=0;

     wela=1;
     P0=tablewe[numwe];
     wela=0;
     numwe++;
     if(numwe==6)
      numwe=0;
    }
 
  }
}
void timer0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 aa++;
}
回复

使用道具 举报

ID:1 发表于 2010-8-8 17:21 | 显示全部楼层
看了你的程序要求,这其实就是一个数码动态扫描的慢动作吧, 我先帮你看看程序中的错误
[此贴子已经被作者于2010-8-8 20:11:20编辑过]
回复

使用道具 举报

ID:1 发表于 2010-8-8 20:15 | 显示全部楼层

给你修正了2处错误,见红色字体部分,我在51hei-5开发板上已经可以正常运行,这其实就是个动态扫描的慢动作,也就是静态显示,如果要改为动态扫描显示连续的123456, 只需加快速度,加入消隐部分 即可.

 

#include<reg52.h>
#include<intrins.h>//参数左移头文件
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,numdu,numwe;
sbit dula=P2^6;//定义dula
sbit wela=P2^7;//定义wela
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//数给的格试uchar code table[]={}在{}中要写入数据
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void main()
{
 numdu=0;
 numwe=0;
 aa=0;
 
 TMOD=0x01;//对TMOD付值也可写:TMOD=1;
 TH0=(65536-50000)/256;//THO初值,"/"为求莫,(65536-50000)/256放到高8位中
 TL0=(65536-50000)%256;//HO初值,"*"为求余,(65536-50000)%256放到低8位中
 EA=1;//开总中断
 ET0=1;//开定时器中断
 TR0=1;//启动定时器
/*定时器/计数器设置流程
1对TMOD赋值,以确定T0及T1的工作方式;
2计算初值,并将其值写入TH0,TL0或TH1,TL1中;
3中断方式时,则对IE赋值,开放中断;
4致TR0或TR1置位,启动定时/计数器定时或计数
*/
while(1)
{
 if(aa==20)   //原来是错误的,你用的赋值符号应该要用 == 号
 {
  numdu++;
  if(numdu==7)
  numdu=1;
  P0=table[numdu];    //送段
  dula=1;
  dula=0;
  P0=tablewe[numwe];  //送位
  wela=1;
  wela=0;

  numwe++;
  if(numwe==6)
  numwe=0;

  aa=0; //你原来的程序没有置0
  }
 
 }
}
void timer0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 aa++;
}

 

[此贴子已经被作者于2010-8-10 17:24:28编辑过]
回复

使用道具 举报

ID:24515 发表于 2010-8-9 14:41 | 显示全部楼层

楼上的正解

回复

使用道具 举报

ID:25285 发表于 2010-8-10 11:08 | 显示全部楼层

OK了!

admin 谢谢!

回复

使用道具 举报

ID:1 发表于 2010-8-10 17:23 | 显示全部楼层
不用谢,你的提问方式很好很详细,这样我解决起来也好办.大家以后提问都尽量把问题描述得详细一点.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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