📄 定时器计数器.c
字号:
//完成的任务为:采用计数器0计数,当它达到250时产生中断,从新从新从0继续开始;
//而当外部中断0发生中断的时候,他也是从新从0开始计数
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define COM8255 XBYTE[0x7fff]
#define PA8255 XBYTE[0x7ffc]
#define PB8255 XBYTE[0x7ffd]
uint idata dis_buf[4]; /*这里在间接寻址片内数据存储区中预留了一个数组的空间*/
uint code table[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xcf,0xff};
void delay(uint N)// 函数功能:延时子程序,实现(16*N+24)us的延时
{ // 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
uint i;
for(i=0;i<N;i++)
;
}
void jisuan()
{
uint n;
n=TL0;
n=n-6; //想一想为什么这里要减6?
dis_buf[0]=n%10; //求个位上的数字
dis_buf[1]=n/10%10; //求十位上的数字
dis_buf[2]=n/100%10; //求百位上的数字
dis_buf[3]=n/1000; //求千位上的数字
}
void all_int0(void) //对所有的中断进行初始化
{ EA=1; /*CPU允许开中断,把CPU的总开关打开*/
IT0=1; /*外部中断0下降沿产生中断*/
EX0=1; /*外部中断0允许开中断*/
ET0=1; //C/T0允许开中断
IP=0x01; /*外部中断0最高优先级,这个地方不设也行*/
}
void initt0() //计数器0中初始化程序
{
TMOD=0x06; //设置计数器0为计数器,并且采用方式2
TH0=6; //设置初始值256-250
TL0=6;
TR0=1; //启动计数器0计数
}
void service_int0() interrupt 0 using 1 //外部中断0的服务子程序,采用第1组寄存器
{TL0=6; //让计数器0从新开始计数
}
void service_t0() interrupt 1 using 0 //计数器0的中断服务子程序,采用第0组寄存器
{
TR0=1; //由于发生一次中断,所以需要从新启动计数器0
}
void display(uint idata *p)
{
COM8255=0x80; /*给8255定义控制字*/
PB8255=0x08;
PA8255=table[*p];
delay(50);
p--;
PB8255=0x04;
PA8255=table[*p];
delay(500);
p--;
PB8255=0x02;
PA8255=table[*p];
delay(500);
p--;
PB8255=0x01;
PA8255=table[*p];
delay(500);
}
void main(void)
{ all_int0(); //先初始化中断
initt0(); //初始化计数器0,这个时候执行计数
while(1)
{
jisuan();
display(dis_buf+3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -