STC单片机采集计算瞬时频率和总脉冲数
/*******************************************************
STCC58RD+单片机驱动LCD1602液晶显示脉冲数和瞬时频率?
使用外部中断1和定时中断1
*******************************************************/
#include<STCC58.h>
#define uint unsigned int
#define uchar unsigned char
uchar code count[]="01234567";
sbit lcdrs=P4^0;
sbit lcdrw=P3^6;
sbit lcden=P3^7;
uint num,sec,set,n; //num:计算外部中断的总个数;sec:计算瞬时频率;set,n中间变量
/*******************************************************
外部中断
*******************************************************/
void init_tc0()
{
EA=1;
EX0=1;
ET0=1;
IT0=1;
TMOD=0x01;
TH0=0x3c;
TL0=0xaf;
TR0=1;
}
void timer0() interrupt 0 //外部中断
{
num++;
}
/*******************************************************
定时中断
*******************************************************/
void t0() interrupt 1 //定时中断
{
TH0=0x4c;
TL0=0x00;
set++;
if(set==20)
{
set=0;
sec=num-n;
n=num;
}
}
/*******************************************************
延时函数
*******************************************************/
void delay(uint t)
{
uint x,y;
for(x=t;x>0;x--)
{
for(y=112;y>0;y--)
{
}
}
}
/*******************************************************
LCD1602驱动
*******************************************************/
void lcd_wite_com(uchar com)
{
lcdrs=0;
delay(2);
lcdrw=0;
delay(2);
P2=com;
lcden=1;
delay(2);
lcden=0;
}
void lcd_wite_dat(uchar dat)
{
lcdrs=1;
delay(2);
lcdrw=0;
delay(2);
P2=dat;
lcden=1;
delay(2);
lcden=0;
}
void lcd_int()
{
lcd_wite_com(0x38);
lcd_wite_com(0x0f);
lcd_wite_com(0x0c);
//不显示光标(0x06显示光标)0x0c不显示光标
lcd_wite_com(0x01); //清屏
delay(4);
}
void display(uchar x,uchar y,uchar dat) 要显示的数据
{
uchar m;
if(x==1)
{
m=0x40;
}
else
m=0;
m=y|m;
//液晶行和列显示,X:行 Y:列 dat:
lcd_wite_com(0x80+m);
lcd_wite_dat(dat);
}
/*******************************************************
显示总脉冲数 换算
*******************************************************/
void display_num()
{
uchar ge,shi,bai,qian,wan;
ge=num%10;
shi=num%100/10;
bai=num%1000/100;
qian=num%10000/1000;
wan=num%100000/10000;
display(1,8,count[ge]);
delay(1);
display(1,7,count[shi]);
delay(1);
display(1,6,count[bai]);
delay(1);
display(1,5,count[qian]);
delay(1);
display(1,4,count[wan]);
delay(1);
}
/*******************************************************
显示瞬时频率 换算
*******************************************************/
void display_intnum()
{
uchar ge1,shi1,bai1,qian1;
ge1=sec%10;
shi1=sec%100/10;
bai1=sec%1000/100;
qian1=sec%10000/1000;
display(0,8,count[ge1]);
delay(1);
display(0,7,count[shi1]);
del
ay(1);
display(0,6,count[bai1]);
delay(1);
display(0,5,count[qian1]);
delay(1);
}
void main()
{
P0=0;
lcd_int();
init_tc0();
display(0,0,'C');
display(0,1,':');
while(1)
{
display_num();
display_intnum();
}
}