找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5266|回复: 4
收起左侧

[求助]数码管自加计数

[复制链接]
ID:37875 发表于 2012-4-14 15:03 | 显示全部楼层 |阅读模式

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wei =P2^7;
sbit duan=P2^6;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
uint temp,n,bai,shi,ge;
void delay();

void display (uchar bai,uchar shi,uchar ge); //显示子函数


void main()
{ wei=0;temp=0;
 duan=0;
 TMOD=0x01;   //选择定时器及其工作方式
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;   //开总中断
 ET0=1; //开定式终端
 TR0=1;  //启动定时

while(1)
{

  wei=1;
  P0=0xfb;
  wei=0;
  duan=1;
  P0=table[ge];
  duan=0;

delay();
  wei=1;
  P0=0xfd;
  wei=0;
  duan=1;
  P0=table[shi];
  duan=0;
delay();
  wei=1;
  P0=0xfe;
  wei=0;
  duan=1;
  P0=table[bai];
  duan=0;
delay();  
  
}
}


void jishuqi () interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 n++;
 if(n==20)
    { n=0;
  temp++;
 }
 bai=temp/100;
 shi=temp%100/10;
 ge =temp%100%10;
}


void delay()
{    uint x,y;
 for(x=5;x>0;x--)
  for(y=110;y>0;y--);
}

这位是我学郭天祥编写的数码管自家计数器可是为何有的数字不显示


 

回复

使用道具 举报

ID:30546 发表于 2012-4-15 21:46 | 显示全部楼层

这是我看他的视频写的。你参考下

#include<reg52.h>//导入头文件
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
sbit dula=P2^6;//定义段选口
sbit wela=P2^7;//定义位选口
//数码表
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

uchar temp,bai,shi,ge,aa;//变量声明

void display(uchar bai,uchar shi,uchar ge);//三位数显示函数声明
void delay(uint z);//延时函数声明
void init();//初始化声明
void main()
{
 init();//调用初始化函数
 while(1)
 {
  if(aa==20)//判断定时器1S时间
  {
   aa=0;//定时器清0
   temp++;
   if(temp==100)
   {
    temp=0;
   }//只规定从0加到100
   bai=temp/100;//求百位数
   shi=temp%100/10;//求十位数
   ge=temp%10;//求个位数
  }
  display(bai,shi,ge);//调用三位数显示函数
 }
}
//1MS延时函数
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
//三位数显示函数
void display(uchar bai,uchar shi,uchar ge)
{
   dula=1;
  P0=table[bai];//P0口送百位数码
  dula=0;
  P0=0xff;//消隐
  wela=1;
  P0=0xfe;
  wela=0;
  delay(5);//延时5MS,不能超过定时器的时间,不然会出错

  dula=1;
  P0=table[shi];//P0口送十位数码
  dula=0;
  P0=0xff;//消隐
  wela=1;
  P0=0xfd;
  wela=0;
  delay(5);//延时5MS,不能超过定时器的时间,不然会出错

  dula=1;
  P0=table[ge];//P0口送个位数码
  dula=0; 
  P0=0xff;//消隐
  wela=1;
  P0=0xfb;
  wela=0;
  delay(5);//延时5MS,不能超过定时器的时间,不然会出错
}
//程序初始化函数
void init()
{
 dula=0;//消隐,上电时关掉段锁存器
 wela=0;//消隐,上电时关掉位锁存器
 TMOD=0x01;//给TMOD赋值确定T0和T1的工作方式
 //50MS定时
 TH0=(65536-50000)/256;//高八位存入60转换成十六进制数是3C
 TL0=(65536-50000)%256;//低八位存入176转换成十六进制数是B0
 EA=1;//开总中断
 ET0=1;//开定时器0中断
 TR0=1;//启动定时器0

}

void timer0() interrupt 1//值为0时是外部中断0,为1时是定时器计数器0
{
 ////再装一次初值,因为值装满后清0,这样下次进入中断就会变成0
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 aa++;
}

回复

使用道具 举报

ID:535271 发表于 2019-6-11 14:57 | 显示全部楼层
我也没有显示数字
回复

使用道具 举报

ID:612499 发表于 2019-10-14 09:46 | 显示全部楼层
延时5MS应该有问题,一个数码管最多1MS,不然会全部熄灭,或者数码管变暗,达不到理想的效果。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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