最近在做数字频率计,用的AT89C51单片机,选用的系统时钟为24M,T0定时,T1计数。不知道为什么出不来,麻烦大家帮看看。以下是程序和图:
#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS=P2^0; //引脚定义 sbit RW=P2^1; sbit E=P2^2; sfr LCDDATA=0x80; //LCD数据总线定义为P0口 sbit RDY=LCDDATA^7; //就绪BF线,低电平有效 extern void lcd_cmd(uchar cmd) //写指令到LCD { LCDDATA=cmd; RS=0; RW=0; E=1; _nop_(); E=0; while(1) {LCDDATA=0xff; RS=0; RW=1; E=0; _nop_(); E=1; if(RDY==0) break; } } extern void lcd_data(uchar dat) //写数据到LCD {LCDDATA=dat; RS=1; RW=0; E=1 ; _nop_(); E=0; while(1) {LCDDATA=0xff; RS=0; RW=1; E=0; _nop_(); E=1; if(RDY==0) break; } } extern void init_lcd(void) //初始化LCD {lcd_cmd(0x01); lcd_cmd(0x3c); lcd_cmd(0x0C); } extern void disp_str(uchar x, uchar y,uchar *p) //字符串显示 {if(x==0) lcd_cmd(0x80+ y); else lcd_cmd(0xc0+ y); while(*p) lcd_data(*p++); } #include <reg51.h> unsigned char time1_H,time1_L; //T1定时初值 unsigned char cont_25; //25ms计数器 unsigned char time0_H,time0_L; //T0当前计数值 unsigned char T0_num = 0; //T0溢出计数器 unsigned long fdata; //频率 unsigned char flag_1s=0x00; //1s到标志 void delay_s (unsigned char n) //延时函数 { unsigned char i; for( i=0;i<n;i++); } void Time1_int(void) interrupt 3 { TH1=time1_H; //T1定时25ms到,重装初值 TL1=time1_L; cont_25++; //25ms计数器+1 if(cont_25>39) { cont_25=0; //25ms计数器清0 TR0=0; time0_H=TH0; //1s到读出当前计数值 time0_L=TL0; TH0=0;TL0=0; //T0重新清0 TR0=1; fdata=(time0_H*256+time0_L)+T0_num*65536; //计算频率 T0_num=0; //T0溢出次数清0 flag_1s=1; } } void Time0_int(void)interrupt 1 {T0_num++; //溢出计数器增1 } void t0_t1_init(void) //定时器T0、T1初始化函数 {floatx; unsigned int y,z; TMOD=0x15; //T1定时,T0计数 x=12/24.00; y=25000/x; z=65536-y; time1_H=z/256; time1_L=z%256; TH1=time1_H; TL1=time1_L; TR1=1; TH0=0; TL0=0; TR0=1; } void main(void) {unsignedchar i; unsignedchar str[6]={0,0,0,0,0,0,}; init_lcd(); t0_t1_init(); ET1=1; ET0=1; EA=1; cont_25=0; T0_num=0; flag_1s=0; disp_str(0,5,"Frequencyis:"); while(1) {if(flag_1s== 1) {for(i=6;i>0;i--) {str[i-1]=fdata%10+0x30; fdata=fdata%10; } disp_str(1,5,str); flag_1s=0; } delay_s(200); } }
|