標題:
單片機定時器測量頻率程序 用1602液晶顯示
[打印本頁]
作者:
老手
時間:
2021-4-16 16:55
標題:
單片機定時器測量頻率程序 用1602液晶顯示
/*******************************************************************
* *
* 555定時器試驗 -—— 頻率計 *
* *
* *
* LCD1602顯示 *
*改變VR1電位器的電阻值,觀察液晶屏頻率發(fā)生變化 *
* *
*******************************************************************/
#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個字節(jié)
/*********************************************************
us延時函數(shù) (4.34us)
*********************************************************/
void delayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************
ms延時函數(shù)
*********************************************************/
void delayms(unsigned int ms)
{
unsigned char n;
while (ms--)
{
for (n = 0; n < 114; n++)
;
}
}
/**********************************************************
* *
* 顯示函數(shù) *
* *
**********************************************************/
void play()
{
unsigned char n;
for (n = 0; n <= 4; n++)
//數(shù)據(jù)轉(zhuǎ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]);
}
/*********************************************************
* *
* 主函數(shù) *
* *
*********************************************************/
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工作在計數(shù)方式
TH0 = 0x4c; //50ms定時
TL0 = 0x00;
TH1 = 0x00; //計數(shù)初值
TL1 = 0x00;
ET0 = 1; //使能TIMER0中斷
ET1 = 1; //使能TIMER1中斷
EA = 1; //允許中斷
PT1 = 1; //定義TIMER1中斷優(yōu)先
TR0 = 1;
TR1 = 1;
while (1)
{
if (sec)
{
Hdata = TH1; //取計數(shù)值
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中斷函數(shù) *
* *
**********************************************************/
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中斷函數(shù) *
* *
**********************************************************/
void Time1()interrupt 3
{
Count++;
}
/*********************************************************/
復制代碼
hex文件:
21 555脈沖發(fā)生器.rar
(172.81 KB, 下載次數(shù): 13)
2021-4-16 16:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1