找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4671|回复: 1
收起左侧

51单片机计数与数码管显示问题

[复制链接]
ID:301728 发表于 2018-5-31 20:54 | 显示全部楼层 |阅读模式
这个程序的目的是通过P1.0口产生周期为两秒的方波,由外部中断0口输入方波并计数,从数码管中输出数字,外部中断1接开关,按第一下开始产生方波,计数并显示,按第二下停止计数,显示学号。我的程序的问题是按下开关,方波在产生了几下之后就不产生了,而且显示有问题,显示的时间变长(动态显示),不知道怎么回事,谁能解决一下?(共阴极数码管,六位)
#include<reg51.h>
#define uchar unsigned char
uchar number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极断码0到9
uchar student[6]={0x6f,0x7f,0x4f,0x4f,0x7d,0x06};//学号163389
uchar number_1[6]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};//要显示的数字,他是计的数
uchar i=0,k=6;//k是数字的位数,先默认为六位,在后面的程序中再判断
unsigned long j=0;//j作为方波计数的数字
sbit P1_0=P1^0;//P1.0产生方波
void delay(uchar m);//声明延时函数
void main()
{
uchar m;//m作为循环的变量使用
TMOD=0x01;//使用定时器T0,方式一
TH0=0x3c;//
TL0=0xaf;//初值,50毫秒一中断
TR0=0;//先不启动T0,按下键在启动
EA=1;//总中断允许
ET0=1;//T0中断允许
EX0=1;//T1允许
IT0=1;//外部中断1触发方式跳沿
EX1=1;
IT1=1;//外部中断1,触发方式跳沿
while(1)
{
  P2=0xfe;//P2最低位选中
  if(TR0)//如果定时器开启
   for(m=0;m<k;m++)
   {
    P0=number_1[m];//显示计的数字
   delay(5);//动态显示,延时
   P2=P2<<1|0x01;//下一位选通
   }
  else
   for(m=0;m<6;m++)
   {
    P0=student[m];//如果不开启,就显示学号
delay(5);//延时一会
P2=P2<<1|0x01;//下一位选通
   }
  }
}
void timer_0() interrupt 1//定时器T0中断函数
{
TH0=0x3c;//重载
TL0=0xaf;
i++;
if(i==20)//如果计到1秒

{
  i=0;//清零
  P1_0=~P1_0;//P1.0取反产生方波
}
}
void int_1() interrupt 2//外部中断一中断函数
{
  TR0=~TR0;//进入一次中断函数,一次开启,再一次不开启
}
void int_0() interrupt 0//外部中断0中断程序
{
unsigned long m=1000000,n=100000,c=10,d=1;//为了获得j的位数,先从最高位开始找,因为j最大是六位,所以m取七位,n取六位
uchar t,r;//t的目的是记录j相应位的数字
j++;//进入一次中断,及来一次下降沿,j加一
if(j==999999)//记到最大清零
  j=0;
while(1)
{
  t=j%m/n;//检查每一位,从高处检查,如果是零,就跳出,记录位数k
  if(t!=0)
   break;//跳出语句
   k--;
    m=m/10;
    n=n/10;
  }
for(r=0;r<k;r++)//现在确定了j的位数,计为k
{
  t=j%c/d;//从低位开始记录各位数字
  number_1[r]=number[t];//根据找到的数字,从number数组里拿出数字给到number1数组
  c=c*10;//
  d=d*10;//乘10,准备检查下一位
}
}
void delay(uchar m)//延时函数
{
uchar t;
while(m--)
{
  for(t=0;t<120;t++);
}
}
不正常的显示如图所示


5LBWE3MG0KLBDQ{I5S8F3~V.png
F`M{{92F4KCH42JPL_7SX%H.png
回复

使用道具 举报

ID:301728 发表于 2018-5-31 21:15 | 显示全部楼层
改好了,原来是在外部中断0每次记录j的位数时,忘了在中断服务程序的开头处写上k=6,不然若第一次记录了k=1,下一次就会继续减,成了别的数了,不再可以记录位数了。

评分

参与人数 1黑币 +70 收起 理由
admin + 70 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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