标题:
单片机定时器测量频率程序 用1602液晶显示
[打印本页]
作者:
老手
时间:
2021-4-16 16:55
标题:
单片机定时器测量频率程序 用1602液晶显示
/*******************************************************************
* *
* 555定时器试验 -—— 频率计 *
* *
* *
* LCD1602显示 *
*改变VR1电位器的电阻值,观察液晶屏频率发生变化 *
* *
*******************************************************************/
#include <reg52.h>
#include <intrins.h>
#include "1602.h"
unsigned char code cdis1[] =
{
" CYMOMETER " //频率计
};
unsigned char code cdis2[] =
{
"FREQ: Hz "
};
bit sec = 0;
unsigned char msec = 0, Hdata = 0, Ldata = 0, Count = 0;
unsigned long temp = 0;
unsigned char data display[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节
/*********************************************************
us延时函数 (4.34us)
*********************************************************/
void delayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************
ms延时函数
*********************************************************/
void delayms(unsigned int ms)
{
unsigned char n;
while (ms--)
{
for (n = 0; n < 114; n++)
;
}
}
/**********************************************************
* *
* 显示函数 *
* *
**********************************************************/
void play()
{
unsigned char n;
for (n = 0; n <= 4; n++)
//数据转换
{
display[n] = temp % 10+0x30;
temp = temp / 10;
}
display[5] = temp + 0x30;
for (n = 5; n > 0; n--)
//高位为"0"不显示
{
if (display[n] == 0x30)
display[n] = 0x20;
else
break;
}
lcd_pos(0x46); //显示实际频率值
for (n = 5; n != 0xff; n--)
lcd_wdat(display[n]);
}
/*********************************************************
* *
* 主函数 *
* *
*********************************************************/
void main()
{
unsigned char m;
unsigned long frq_num;
P3 = 0xff;
lcd_init();
lcd_pos(0x00); //设置显示位置为第一行
for (m = 0; m < 16; m++)
lcd_wdat(cdis1[m]);
//显示字符
lcd_pos(0x40); //设置显示位置为第二行
for (m = 0; m < 16; m++)
lcd_wdat(cdis2[m]);
//显示字符
TMOD = 0x51; //定时器0工作在定时方式
//定时器1工作在计数方式
TH0 = 0x4c; //50ms定时
TL0 = 0x00;
TH1 = 0x00; //计数初值
TL1 = 0x00;
ET0 = 1; //使能TIMER0中断
ET1 = 1; //使能TIMER1中断
EA = 1; //允许中断
PT1 = 1; //定义TIMER1中断优先
TR0 = 1;
TR1 = 1;
while (1)
{
if (sec)
{
Hdata = TH1; //取计数值
Ldata = TL1;
frq_num = ((Count *65535+Hdata * 256+Ldata) *108 / 100);
TH1 = 0;
TL1 = 0;
sec = 0;
Count = 0;
TR1 = 1;
TR0 = 1;
}
temp = frq_num;
play();
}
}
/**********************************************************
* *
* Time0中断函数 *
* *
**********************************************************/
void Time0()interrupt 1
{
TH0 = 0x4c; //50ms定时
TL0 = 0x00;
msec++;
if (msec == 20)
//50*20=1S
{
TR0 = 0; //关闭TIMER0
TR1 = 0; //关闭TIMER1
msec = 0;
sec = 1; //置秒标记位
}
}
/**********************************************************
* *
* Time1中断函数 *
* *
**********************************************************/
void Time1()interrupt 3
{
Count++;
}
/*********************************************************/
复制代码
hex文件:
21 555脉冲发生器.rar
(172.81 KB, 下载次数: 13)
2021-4-16 16:55 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1