从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 我是没有用到,我就是想不明白,一个不用的变量怎么会影响到数码管的点呢?
写完这一个程序后,对于中断的概念、用法都有了一定的了解。
在此很希望在这条技术路上给我指导。谢谢大家。
#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++
}
是怎么工作的。