资源简介
利用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
相关资源
- 基于51单片机的锯齿波&正弦波发生器
- 利用51单片机实现了红外发射以及接受
- 51单片机LED16X16点阵滚动显示
- 基于51单片机的空调遥控器C源程序
- 51单片机控制RDA5807收音机模块
- 基于C51单片机的声光控灯
- 51单片机电子门铃设计
- 基于51单片机的 4×4键盘及8位数码管显
- 基于51单片机的霹雳灯
- 51单片机贪吃蛇游戏程序
- 51单片机控制57步进电机启停,正反转
- 51单片机实现Modbus从机程序
- 51单片机看门狗设计
- 51单片机开发的韦根接受的C程序;支
- 51单片机ADXL345三轴加速度传感器源代
- 51单片机1602万年历矩阵按键
- 超声波测距仪
- STC89C52RC使用电位器控制WS2812B调光
- C51单片机电子琴
- 带串口通信的温度控制器(带proteus仿
- 基于51单片机的智能家居系统程序
- AD9833驱动程序
- 基于C51单片机音乐盒设计[1]
- 89C51单片机控制HT1621B驱动LCD(C程序)
- 51单片机 lcd1602测试C程序
- 基于51单片机LCDLM041L显示贪吃蛇小游戏
- 基于51单片机的串行通信程序
- 51单片机 pwm波产生.zip
- 《51单片机原理及应用:基于KeilC与
- 51单片机 红外循迹 红外避障小车 双
评论
共有 条评论