本人想把50000HZ的方波频率,通过定时加中断的方法显示在液晶上,但是总是显示不出来。
定时加中断:通过定时1S,然后计算出1s内的脉冲数来计算频率。
电路图如下:方波信号接在了T1口。 液晶显示器在P0口
程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code count[]="0123456789";
- uint counter=0; //脉冲数
- uint calsp; //设定多长时间计数一次
- uint frequency; //频率数值
- sbit rs=P2^4;
- sbit rw=P2^5;
- sbit en=P2^6;
- void delay(uint);
- void timer_init();
- void lcd_init();
- void write_cmd(uchar);
- void write_data(uchar);
- void tran();
- void display(uchar,uchar,uchar);
- void display_num();
- void main() //主程序
- {
- lcd_init();
- timer_init();
- while(1)
- {
- tran();
- display_num();
- }
- }
- void delay(uint num)
- {
- uint x,y;
- for(x=num;x>0;x--)
- for(y=110;y>0;y--)
- ;
- }
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256; //重新装入初值,计数时间为50ms
- TL0=(65536-50000)%256;
- calsp++;
- }
- void IN_T0() interrupt 0
- {
- counter++;
- }
- void tran()
- {
- if(calsp==20)
- frequency=counter;
- counter=0; //脉冲数清零
- calsp=0; //标志位清零
- }
- void timer_init() //定时器和外部中断初始化
- {
- EA=1; //开启总中断
- EX0=1; //开启外部中断0
- IT0=1; //设置成下降沿触发方式
- TMOD=0x01; //设置定时器0为模式1,即16位计数模式
- TH0=(65536-50000)/256; //计数时间为50ms
- TL0=(65536-50000)%256;
- ET0=1; //开启定时器0中断
- TR0=1; //启动定时器0
- }
- void write_cmd(uchar cmd) //写命令函数
- {
- rs=0;
- rw=0;
- P0=cmd;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void write_data(uchar dat) //写数据函数
- {
- rs=1;
- rw=0;
- P0=dat;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void lcd_init() //lcd初始化
- {
- rs=0;
- rw=0;
- en=0;
- write_cmd(0x02);
- write_cmd(0x06);
- write_cmd(0x0c);
- write_cmd(0x38);
- write_cmd(0x01);
- }
- void display(uchar x,uchar y,uchar dat) //液晶行和列显示,X:行 Y:列 dat:要显示的数据
- {
- uchar m;
- if(x==1)
- {
- m=0x40;
- }
- else
- m=0;
- m=y|m;
- write_cmd(0x80+m);
- write_data(dat);
- }
- void display_num()
- {
- uchar ge,shi,bai,qian,wan;
- ge=frequency%10;
- shi=frequency%100/10;
- bai=frequency%1000/100;
- qian=frequency%10000/1000;
- wan=frequency%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);
- }
复制代码
有大神帮忙看下是什么原因吗?
一周热门 更多>