LscmunaixMG 发表于 2017-7-16 09:53:21

基于C51单片机的数字方波频率计,采用软串口输出,无需数码管或液晶显示。


/*
基于C51单片机的数字方波频率计,采用软串口输出,无需数码管或液晶显示。
采用模拟软串口发送频率数据,输入端级联74系列分频器可加宽频率测量范围。
源码用Keil4编译即可:
*/
#include "stc15f104e.h"
#include "intrins.h"
sbit txd=P3^1; //串口发送口
sbit input=P3^2;//方波输入口
unsigned long hz_add=0;//频率计数
unsigned long hz=0;//频率
unsigned int ms=0;//毫秒计数
void delay_uart(){ //延时时间1除以波特率秒
    unsigned char a,b;
    for(b=115;b>0;b--)
      for(a=6;a>0;a--);
}


void InitTimer0(void){ //初始化定时器
    TMOD = 0x01;
    TH0 = 0x7E;
    TL0 = 0x66;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void txd_data(unsigned char i){//发送数据
unsigned char j=1;//控制移位
unsigned char k=8;//控制循环次数
ET0=0;
delay_uart();//延时时间
txd=0; //发送起始位,低电平
while(k--){ //下面循环8次
delay_uart();//延时时间
txd=(i&j)/j; //发送数据
j<<=1; //左移1位,发送下1位数据
}
delay_uart();//延时时间
txd=1;//发送停止位
ET0=1;
}
void main(){
    AUXR = AUXR|0x80;// T0, 1T Mode
    InitTimer0(); //初始化定时器
while(1){
if(input==0){
hz_add++;
while(input==0);
}
}
}

void Timer0Interrupt(void) interrupt 1{ //1毫秒中断
    TH0 = 0x7E;
    TL0 = 0x66;
ms++; //毫秒加1
if(ms >= 1000){ //毫秒加到1000 1秒计算1次频率
ms=0;//毫秒清零
hz=hz_add; //计算频率
hz_add=0; //清零频率计数
//txd_data((hz/10000000%10)|0x30);
txd_data((hz/1000000%10)|0x30);
txd_data((hz/100000%10)|0x30);
txd_data((hz/10000%10)|0x30);
txd_data((hz/1000%10)|0x30);
txd_data((hz/100%10)|0x30);
txd_data((hz/10%10)|0x30);
txd_data((hz%10)|0x30);

txd_data(0x48); //发送字母H
txd_data(0x7A); //发送字母z
txd_data(0x20); //发送空格
txd_data(0x0D); //发送换行
txd_data(0x0A); //发送换行
   }
}


demon 发表于 2017-7-24 18:33:33

{:5_119:}沙发。

66大顺 发表于 2017-9-17 14:01:25

板凳。
页: [1]
查看完整版本: 基于C51单片机的数字方波频率计,采用软串口输出,无需数码管或液晶显示。