脉冲信号由AT89C51的P3.5输入,由单片机测量出脉冲信号的频率,并由4位数码管显示,具体电路如图5-19 所示。P1.0脚外接一开关key,按一下key则进行频率测试。其效果见如图5-19——频率7.458K的脉冲测试结果显示。
软件代码 - /*****脉冲信号由P3.5输入,按下key显示其频率*****/
- #include<reg51.h> //定义8051寄存器的头文件
- sbit KEY=P1^0;//声明开关接于P1.0脚
- unsigned char TAB[11]={
- 0xc0,0xf9,0xa4,0xb0,0x99, //数字0~4
- 0x92,0x82,0xf8,0x80,0x90, //数字5~9
- 0xbf};//"-"号
- unsigned char disp[4];//声明显示区数组
- unsigned char times = 0;
- /********声明基本变量*******/
- bit status_F = 1; //是否完成测量状态标志位
- unsigned char scan = 0X01; //扫描信号
- unsigned int freq = 0; //频率数值变量
- sfr16 DPTR = 0X82; //声明DPTR
- /*****函数声明*****/
- void delayms(int);
- void measure(void);
- void display(int);
- /******主程序*****/
- main(){
- while(1){
- if(KEY==0){ //按键按下开始测量
- delayms(20);//延时消抖
- if(KEY==0){ //确认按键按下
- status_F=0;
- startmeasure();
- while(status_F==0);//等待1S时间到
- }
- }
- display(freq);
- }
- }
- /*********开始测量函数***********/
- void startmeasure(){
- P3=0XFF;
- IE=0X82; //启用T0、T1中断
- TMOD=0X51;//T1为计数器,T0为定时器,均为方式1
- TH0=(65536-50000)/256 //定时器初值的高8位
- TL0=(65536-50000)%256 //定时器初值的低8位
- TH1=0;TL1=0;//设置T1归零
- TR0=1;TR1=1;//启动T0、T1
- }
- /*********T0中断服务程序,定时时间50mS***********/
- void T0_int () interrupt1{
- TH0=(65536-50000)/256 //定时器初值的高8位
- TL0=(65536-50000)%256 //定时器初值的低8位
- if(++times==20){ //若1S时间到
- times=0; //重新计次
- status_F=1; //完成测量
- TR1=0,TR0=0; //关闭T1、T0
- DPL=TL1;DPH=TH1; //脉冲计数值高、低8位
- freq=DPTR;//脉冲计数值存入freq变量
- }
- }
- /***********显示函数*************/
- void display(int dat){
- uchar i;
- if(dat>=10000){ //若计数值大于10K,即频率超过10KHz
- disp[0]=TAB[10];//负号填入千位数显示区
- disp[1]=TAB[10];//负号填入百位数显示区
- disp[2]=TAB[dat/10000];//计数值的"万"位填入十位显示区
- disp[3]=TAB[(dat/1000)%10];//计数值的"千"位填入个位显示区
- }
- else{ //频率低于10KHz
- disp[0]=TAB[(dat/1000)%10];//填入千位数显示区
- disp[1]=TAB[(dat/100)%10]; //填入百位数显示区
- disp[2]=TAB[(dat/10)%10]; //填入十位数显示区
- disp[3]=TAB[dat%10]; //填入个位数显示区
- }
- P3=0x01;//初始扫描信号
- for(i=0;i<4;i++){//扫描4次
- P2 =0XFF; //关闭7段LED数码管
- P3=~scan;//输出扫描信号
- P2=disp[ i];//[ i]输出显示信号
- delayms(4);//延时4ms
- P3<<=1; //下一个扫描信号
- }
- }
复制代码
|