微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 从0开始学习51单片机第三集——0到99计数器(中断方式)

从0开始学习51单片机第三集——0到99计数器(中断方式)

时间:10-02 整理:3721RD 点击:
/********程序名:0—99计数器(中断方式)********/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit low_order=P2^7;    /*定义位选*/
sbit hight_order=P2^6;    /*定义位选*/
uchar table[]={0xc0,0xf9,0xa4,   /******  0—9 的编码*****/
0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};
uchar num1,num2,num3; //num1用于记录个位位数;num3记录高位个数;num3记录订时的次数。
/*****延时程序*****/
void delay(uchar z)
{
uchar a,b;
for(a=z;a>0;a--)
  for(b=460;b>0;b--);
}
/*****显示程序*****/
void display()
{
low_order=0; //开低位位选
P0=table[num1]; //送到P0口显示
delay(2);
P0=0xff;  //P0口全部关闭显示,因为在之前没有全部关闭的时候,数码管有余晖
low_order=1; //关闭位选
hight_order=0;  //开高位位选
P0=table[num2];
delay(2);
P0=0xff;
hight_order=1;
if(num1>9)  //当低位大于9时向高位进1,并把低位置0
  {
   num2++;
   num1=0;
  }
if(num2>9)    //当高位大于9时向高位进1,并把高位置0
  {
   num2=0;
  }
}
/*****主程序*****/
void main()
{
    num1=0;     
num2=0;
TMOD=0x01;      //设置工作方式1
TH0=(65535-50000)/256; //装入初值50MS
TL0=(65535-50000)%256;
EA=1;       //开中断
ET0=1;
TCON=0x10;
while(1)
  {
   if(num3==20)   //定时50MS*20=1S
    {
         num3=0;
     num1++;
    }
   display();  
  }
}
/*****中断服务程序*****/
void time0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num3++;   
}
        以上这个是用中断写的程序,程序一定有可以改进的地方,希望大家能指出来。在写这个程序的时候,也遇到不少
的问题:1、只显示到8,然后高位就进1;2、解决上述问题后,低位不显示0了。3、程序结构问题,一开始我是在主程序里
用for来作延时,后来想了想,真没有必要。4、不知道为什么数码管的点伴随着0一起亮了。我看了又看,后来我将uchar i 删
除,点也就没有再亮了,其实 i 我是没有用到,我就是想不明白,一个不用的变量怎么会影响到数码管的点呢?
写完这一个程序后,对于中断的概念、用法都有了一定的了解。
       在此很希望在这条技术路上给我指导。谢谢大家。

等我学过计数器函数后跟你一起讨论啊~!哈哈~

好啊!

我想知道
if(num3==20)
{
num3=0
num1++
}
是怎么工作的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top