标题:
51单片机数字频率计
[打印本页]
作者:
hey-boy
时间:
2018-6-19 16:29
标题:
51单片机数字频率计
QQ截图20180619162700.jpg
(168.19 KB, 下载次数: 24)
下载附件
2018-6-19 16:27 上传
#include"reg52.h"
#define ucharunsigned char
#define uintunsigned int
sbit lcdrs=P1^0; //液晶数据命令选择端
sbit lcden=P1^1; //液晶使能端
sbit A0=P2^3; //8选1(A0~A2)接口
sbit A1=P2^4;
sbit A2=P2^5;
void delay();
void write_com();
void write_date();
void init();
void display();
void fenpin();
uchartable[]={"frequence:"};
uint f,K;
uchar num1,count;
ucharbw,sw,w,q,b,s,g;
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voidwrite_com(uchar com)
{
lcdrs=0; //选择写命令模式
P0=com; //将要写的命令字送到数据总线上
delay(5); //稍微延时以待数据稳定
lcden=1; //使能端给一高脉冲
delay(5); //稍微延时
lcden=0; //将使能端置0以完成高脉冲
}
void write_date(uchardate)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
lcden=0;
write_com(0x38); //设置16×2显示,5×7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
write_com(0x80); //设置显示初始坐标
for(num=0;num<10;num++) //显示frequency
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40+3); //写出频率f
write_date('f');
delay(5);
write_com(0x80+0x40+4); //写出频率=
write_date('=');
delay(5);
write_com(0x80+0x40+12); //写出频率单位Hz
write_date('H');
delay(5);
write_com(0x80+0x40+13);
write_date('z');
delay(5);
TMOD=0X15; //设置定时器0和1工作方式1
TH1=(65536-45872)/256; //对TH0 TL0赋值
TL1=(65536-45872)%256; //使定时器50ms中断一次
TH0=0;
TL0=0;
EA=1; //开总中断
TR0=1; //启动定时器0 开始计时
TR1=1; //启动计数器1
PT0=1; //计数优先
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
}
void display()
{
bw=f/1000000;
sw=f%1000000/1000000;
w=f%1000000%100000/10000;
q=f%1000000%100000%10000/1000;
b=f%1000000%100000%10000%1000/100;
s=f%1000000%100000%10000%1000%100/10;
g=f%1000000%100000%10000%1000%100%10;
write_com(0x80+0x40+5);
write_date(0x30+bw);
delay(5);
write_com(0x80+0x40+6);
write_date(0x30+sw);
delay(5);
write_com(0x80+0x40+7);
write_date(0x30+w);
delay(5);
write_com(0x80+0x40+8);
write_date(0x30+q);
delay(5);
write_com(0x80+0x40+9);
write_date(0x30+b);
delay(5);
write_com(0x80+0x40+10);
write_date(0x30+s);
delay(5);
write_com(0x80+0x40+11);
write_date(0x30+g);
delay(5);
}
void fenpin()
{
if(f>5000000)
{
A0=0;
A1=0;
A2=0;
K=10;
f=K*f;
}
else
{
A0=0;
A1=0;
A2=1;
K=1;
f=K*f;
}
}
void main()
{
init();
while(1)
{
fenpin();
display();
}
}
void T0_time()interrupt 1
{
count++;
}
void T1_time()interrupt 3
{
TH1=(65536-45872)/256; //对TH0 TL0赋值
TL1=(65536-45872)%256; //重装计数初值
num1++; //每过50ms numt加1
if(num1==20) //如果到了20次,说明1秒时间到
{
num1=0; //清0
f=count*65536+(TH0*256+TL0);
TH0=0;
TL0=0;
count=0;
}
TR1=1;
}
3.2软件各模块设计
3.2.1显示模块:
void display()
{
bw=f/1000000;
sw=f%1000000/1000000;
w=f%1000000%100000/10000;
q=f%1000000%100000%10000/1000;
b=f%1000000%100000%10000%1000/100;
s=f%1000000%100000%10000%1000%100/10;
g=f%1000000%100000%10000%1000%100%10;
write_com(0x80+0x40+5);
write_date(0x30+bw);
delay(5);
write_com(0x80+0x40+6);
write_date(0x30+sw);
delay(5);
write_com(0x80+0x40+7);
write_date(0x30+w);
delay(5);
write_com(0x80+0x40+8);
write_date(0x30+q);
delay(5);
write_com(0x80+0x40+9);
write_date(0x30+b);
delay(5);
write_com(0x80+0x40+10);
write_date(0x30+s);
delay(5);
write_com(0x80+0x40+11);
write_date(0x30+g);
delay(5);
}
3.2.2定时和计数模块:
void T0_time()interrupt 1
{
count++;
}
void T1_time()interrupt 3
{
TH1=(65536-45872)/256; //对TH0 TL0赋值
TL1=(65536-45872)%256; //重装计数初值
num1++; //每过50ms numt加1
if(num1==20) //如果到了20次,说明1秒时间到
{
num1=0; //清0
f=count*65536+(TH0*256+TL0);
TH0=0;
TL0=0;
count=0
}
TR1=1;
}
其中T0计数,T1定时。
3.2.3延时模块:
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
3.2.4液晶1602初始化模块:
void write_com(uchar com)
{
lcdrs=0; //选择写命令模式
P0=com; //将要写的命令字送到数据总线上
delay(5); //稍微延时以待数据稳定
lcden=1; //使能端给一高脉冲
delay(5); //稍微延时
lcden=0; //将使能端置0以完成高脉冲
}
voidwrite_date(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
lcden=0;
write_com(0x38); //设置16×2显示,5×7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
write_com(0x80); //设置显示初始坐标
for(num=0;num<10;num++) //显示frequency
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40+3); //写出频率f
write_date('f');
delay(5);
write_com(0x80+0x40+4); //写出频率=
write_date('=');
delay(5);
write_com(0x80+0x40+12); //写出频率单位Hz
write_date('H');
delay(5);
write_com(0x80+0x40+13);
write_date('z');
delay(5);
}
3.2.5分频模块:
void fenpin()
{
if(f>5000000)
{ A0=0;
A1=0;
A2=0;
K=10;
f=K*f;
}
else
{ A0=0;
A1=0;
A2=1;
K=1;
f=K*f;
}
}
3.2.6主函数模块:
void main()
{ init();
TMOD=0X15; //设置定时器0和1工作方式1
TH1=(65536-45872)/256; //对TH0 TL0赋值
TL1=(65536-45872)%256; //使定时器50ms中断一次
TH0=0;
TL0=0;
EA=1; //开总中断
TR0=1; //启动定时器0 开始计时
TR1=1; //启动计数器1
PT0=1; //计数优先
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
while(1)
{ fenpin();
display();
}
}
复制代码
作者:
feiji666
时间:
2018-6-19 17:37
很好用,漂亮
作者:
大西北的熊
时间:
2019-3-23 10:08
思路不错,可以借鉴一下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1