标题:
用单片机定时器中断来做数码管扫描
[打印本页]
作者:
橘子先生
时间:
2018-10-28 16:02
标题:
用单片机定时器中断来做数码管扫描
频率计,利用delay函数进行数码管扫描,但老师要求我用定时器(T2)中断来做数码管扫描,该怎么写呢?求大神指点。
复制代码
#include <reg52.h>
#include<stdio.h>
#include<ctype.h>
#define uint unsigned int
unsigned char num=0;
sbit k1=P3^7;
sbit k3=P3^6;
code unsigned char TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned long x;
char str[19];
int i=0;
unsigned char timecount;
unsigned int T0count;
void inial();
void anjian();
void printf_1();
void delay();
int printf_time;
void inial()
{
TMOD |= 0x05;//计数器T0
TH0 = 0;
TL0 = 0;
EA = 1;
ET0 = 1;
TR0 = 1;
RCAP2H=0x0B;//定时器T2
RCAP2L=0xDC;
ET2=1;
TR2=1;
TMOD|=0x20;//串口配置
TH1=0xf3;
TL1=0xf3;
TR1=1;
PCON|=0x80;
SCON=0X50;
ES=1;
}
void delay( )
{
int y=300;
while(y--);
}
void display()
{
unsigned char ge,shi,bai,qian,wan,shiwan;//定义各个位
shiwan=x/100000;//十万
wan=x%100000/10000;//万位
qian=x%10000/1000;//千位
bai=x%1000/100;//百位
shi=x%100/10;//十位
ge=x%10;//个位
复制代码
for(i=0;i<6;i++) //显示
{
switch(i)
{
case 0:P2=0xFE,P0=TAB[ge];break;
case 1:P2=0xFd,P0=TAB[shi];break;
case 2:P2=0xFb,P0=TAB[bai];break;
case 3:P2=0xF7,P0=TAB[qian];break;
case 4:P2=0xeF,P0=TAB[wan];break;
case 5:P2=0xdf,P0=TAB[shiwan];break;
}
delay();
P0=0x00;
}
}
void anjian()
{
if(k1==0)
{
delay();
if(k1==0)
{
display();
}
}
}
void main()
{
inial();
while(1)
{
anjian();
printf_1();
}
}
void t0(void) interrupt 1
{
T0count++;
}
void t2(void)interrupt 5
{
TF2=0;
timecount++;
printf_time++;
if(timecount>=16)//定时1S
{
x=T0count*65536+TH0*256+TL0;
timecount=0;
T0count=0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
}
}
void ser() interrupt 4
{
RI=0;
}
void printf_1()//串口输出
{
if(printf_time>=48)
{
sprintf(str,"%06fHz\n",x);
for(i=0;i<9;i++)
{
SBUF=str[i];
while(!TI);
TI=0;
}
printf_time=0;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1