• 大小: 65KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-18
  • 语言: 其他
  • 标签: 等精度  51单片机  

资源简介

利用51单片机的两个计数器测频率 可对1~40KHZ的信号进行精确测量,误差小于1/65536.

资源截图

代码片段和文件信息

#include
#define uchar unsigned char
#define uint unsigned int

void delay(uchar iuchar j)   //延时子程序延时时间为 i*(j*8+6)+10 us
{
 while(i--)
 while(j--);
}

//以下为测频子程序
sbit OnOff=P1^3;   //74LS74 的D端
sbit Reset=P1^4;   //74LS74 的R端异步置0
sbit flag=P3^2;    //用flag作为一次测量数据完成与否的标志
uchar n;
uchar pinlv[11];
float N1N0;
unsigned long Fx;

void cepin()//测频程序
{
 n=0;       //n用于记录T0的溢出次数
 TMOD=0x59; //设定89C51两个计数器的工作方式T1工作于定时模式T0工作于计数模式均为方式1T0的门控位置1
 TH0=0;     //两个计数器都置初值为0
 TL0=0;
 TH1=0;
 TL1=0;
 EA=1;      //总中断允许
 ET0=1;     //T0中断允许
 Reset=0;   //将 74LS74 Q端置0定时器T0不工作;同时 Q非 置1 74LS02 关闭T1不对被测信号计数
 OnOff=0;  //将 74LS74 D端置0以使D和Q保持一致这样即使 74LS74 的CLK有效也不改变Q的状态
 delay(128); //延时约1 ms以完成上面两个指令
 Reset=1;     //74LS74 的R端置1清0无效
 TR0=1;       //T0计时开
 TR1=1;       //T1计时开
 OnOff=1; //将 74LS74 D端置1使D和Q相异一旦 74LS74 的CLK有效Q即为1(T0定时开始)Q非 为0(T1计时开始)
 while(flag==0); //从将 74LS74 D端置1到 74LS74 的CLK第一次有效之间flag即P3^2为0定时未开始
 while(flag==1); //74LS74 的CLK第一次有效之后flag即P3^2为1(定时开始)直至定时结束
 if(flag==0)     //flag再次为0表示本次测量已结束
   {
    TR0=0;    //T0计时关(要注意计数及定时的开与关直接由 被测信号 的上升沿决定而不是这两个命令)
    TR1=0;    //T1计时关
    N1=TH1*256+TL1;           //取T1计数器中的值(注意N1N0都为float型这样计算结果准确度高)
    N0=n*65536+TH0*256+TL0;   //取T0计数的总值
   }
}

void timer0() interrupt 1 using 1      //T0中断服务
{
 n++;      //T0记满65535之后n加1以确定一次测量中T0的总定时时间
 OnOff=0;  //将 74LS74 D端置0待 74LS74 的CLK下次有效Q非 为1(T1计时结束)Q即为0(T0定时结束)
}

void PinlvtoStr()
{
 Fx=N1*1000000/N0*100000; //被测结果的实际值为N1*1000000/N0,但为了显示5位小数,故有 *100000
 pinlv[0]=Fx/1000000000;
 Fx=Fx%1000000000;
 pinlv[1]=Fx/100000000;
 Fx=Fx%100000000;
 pinlv[2]=Fx/10000000;
 Fx=Fx%10000000;
 pinlv[3]=Fx/1000000;
 Fx=Fx%1000000;
 pinlv[4]=Fx/100000;
 Fx=Fx%100000;
 pinlv[5]=0x2e;
 pinlv[6]=Fx/10000;
 Fx=Fx%10000;
 pinlv[7]=Fx/1000;
 Fx=Fx%1000;
 pinlv[8]=Fx/100;
 Fx=Fx%100;
 pinlv[9]=Fx/10;
 pinlv[10]=Fx%10;
}
//以上为测频子程序

//以下为1602显示子程序
sbit DS1602_RS=P1^0;
sbit DS1602_RW=P1^1;
sbit DS1602_EN=P1^2;

void Write1602_com(uchar com)
{
 P0=com;
 DS1602_RS=0;     //RS为0输入指令
 DS1602_RW=0;     //向LCD写入(指令或数据)
 DS1602_EN=1;     //以下3行产生一个EN下降沿以供1602执行指令
 delay(15);      //该延时不可省略具体延时长短可由调试确定
 DS1602_EN=0;
}

void Write1602_data(uchar dat)
{
 P0=dat;
 DS1602_RS=1;     //RS为1输入数据
 DS1602_RW=0;     //向LCD写入(指令或数据)
 DS1602_EN=1;     //以下3行产生一个EN下降沿以供1602执行输入
 delay(15);      //该延时不可省略具体延时长短可由调试确定
 DS1602_EN=0;
}

void init1602()        //初始化1602
{
 Write1602_com(0x38);  //数据总线为8位显示两行5*7点阵
 Write1602_com(0x0c);  //显示功能开无光标不闪烁
 Write1602_com(0x06);  //写入新数据后光标右移
 Write1602_com(0x01);  //清除液晶显示器
}

void displaypinlv()    //显示频率
{
 uchar i;
 Write1602_com(0x80);
 for(i=0;i<11;i++)
    {
     if(i!=5)
        Write1602_data(pinlv[i]+0x30);
     else
        Write1602_data(pinlv[i]);
    }
}

void main()
{
 init1602();
 while(1)
      {
       cepin();
       PinlvtoStr();
       displaypinlv();

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8781  2009-09-02 13:52  等精度测频-LCD\djdcp-lcd

     文件       3638  2009-09-02 13:52  等精度测频-LCD\djdcp-lcd.c

     文件     113911  2009-11-29 18:37  等精度测频-LCD\djdcp-lcd.DSN

     文件       4833  2009-09-02 13:52  等精度测频-LCD\djdcp-lcd.hex

     文件         66  2009-09-02 13:52  等精度测频-LCD\djdcp-lcd.lnp

     文件      31380  2009-09-02 13:52  等精度测频-LCD\djdcp-lcd.LST

     文件      12565  2009-09-02 13:52  等精度测频-LCD\djdcp-lcd.M51

     文件       8866  2009-09-02 13:52  等精度测频-LCD\djdcp-lcd.OBJ

     文件       1055  2009-09-02 13:53  等精度测频-LCD\djdcp-lcd.Opt

     文件        357  2009-09-02 13:53  等精度测频-LCD\djdcp-lcd.plg

     文件        742  2009-11-29 18:37  等精度测频-LCD\djdcp-lcd.PWI

     文件       2211  2009-08-15 21:11  等精度测频-LCD\djdcp-lcd.Uv2

     文件         44  2009-09-02 13:52  等精度测频-LCD\djdcp-lcd.__i

     文件       1056  2009-09-01 23:46  等精度测频-LCD\djdcp-lcd_Opt.Bak

     文件          0  2009-08-15 21:06  等精度测频-LCD\djdcp-lcd_Uv2.Bak

     文件     113945  2009-09-07 15:17  等精度测频-LCD\Last Loaded djdcp-lcd.DBK

     文件       6376  2005-03-22 15:22  等精度测频-LCD\STARTUP.A51

     文件      14049  2009-08-15 21:08  等精度测频-LCD\STARTUP.LST

     文件        749  2009-08-15 21:08  等精度测频-LCD\STARTUP.OBJ

     目录          0  2009-11-29 18:37  等精度测频-LCD

----------- ---------  ---------- -----  ----

               324624                    20


评论

共有 条评论