標(biāo)題:
單片機(jī)+LM393測(cè)速傳感器在LCD12864上顯示程序
[打印本頁(yè)]
作者:
zzz2269501
時(shí)間:
2019-5-18 23:12
標(biāo)題:
單片機(jī)+LM393測(cè)速傳感器在LCD12864上顯示程序
第一次發(fā),不知道怎么發(fā)。。。為比賽準(zhǔn)備的程序,可惜比賽沒(méi)用到。用的LCD12864是帶字庫(kù)的,用的是LM393測(cè)速傳感器如圖。
程序分為main.c+lcd12864.c+lcd12864.h
制作出來(lái)的實(shí)物圖如下:
IMG_20190518_225512.jpg
(4.21 MB, 下載次數(shù): 55)
下載附件
2019-5-18 23:11 上傳
單片機(jī)源程序如下:
//lcd12864.h的程序
#ifndef __LCD12864_H
#define __LCD12864_H
//---包含頭文件---//
#include<reg51.h>
//---重定義關(guān)鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//---如果使用畫(huà)圖模式定義這個(gè)---//
//#define LCD12864_PICTURE
//---定義使用的IO口---//
#define LCD12864_DATAPORT P0 //數(shù)據(jù)IO口
sbit LCD12864_RS = P2^6; //(數(shù)據(jù)命令)寄存器選擇輸入
sbit LCD12864_RW = P2^5; //液晶讀/寫(xiě)控制
sbit LCD12864_EN = P2^7; //液晶使能控制
sbit LCD12864_PSB = P3^2; //串/并方式控制
sbit LCD12864_RST = P3^4; //復(fù)位端
//---聲明全局函數(shù)---//
void LCD12864_Delay1ms(uint c);
uchar LCD12864_Busy(void);
void LCD12864_WriteCmd(uchar cmd);
void LCD12864_WriteData(uchar dat);
void LCD12864_Init();
void LCD12864_ClearScreen(void);
void LCD12864_SetWindow(uchar x, uchar y);
#endif
//lcd12864.c 的程序
#include"lcd12864.h"
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_Delay1ms
* 函數(shù)功能 : 延時(shí)1MS
* 輸 入 : c
* 輸 出 : 無(wú)
*******************************************************************************/
void LCD12864_Delay1ms(uint c)
{
uchar a,b;
for(; c>0; c--)
{
for(b=199; b>0; b--)
{
for(a=10; a>0; a--);
}
}
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_Busy
* 函數(shù)功能 : 檢測(cè)LCD是否忙
* 輸 入 : 無(wú)
* 輸 出 : 1或0(1表示不忙,0表示忙)
*******************************************************************************/
uchar LCD12864_Busy(void)
{
uchar i = 0;
LCD12864_RS = 0; //選擇命令
LCD12864_RW = 1; //選擇讀取
LCD12864_EN = 1;
LCD12864_Delay1ms(1);
while((LCD12864_DATAPORT & 0x80) == 0x80) //檢測(cè)讀取到的值
{
i++;
if(i > 100)
{
LCD12864_EN = 0;
return 0; //超過(guò)等待時(shí)間返回0表示失敗
}
}
LCD12864_EN = 0;
return 1;
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_WriteCmd
* 函數(shù)功能 : 寫(xiě)命令
* 輸 入 : cmd
* 輸 出 : 無(wú)
*******************************************************************************/
void LCD12864_WriteCmd(uchar cmd)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超過(guò)等待退出
}
}
LCD12864_RS = 0; //選擇命令
LCD12864_RW = 0; //選擇寫(xiě)入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = cmd; //放置數(shù)據(jù)
LCD12864_EN = 1; //寫(xiě)時(shí)序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_WriteData
* 函數(shù)功能 : 寫(xiě)數(shù)據(jù)
* 輸 入 : dat
* 輸 出 : 無(wú)
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超過(guò)等待退出
}
}
LCD12864_RS = 1; //選擇數(shù)據(jù)
LCD12864_RW = 0; //選擇寫(xiě)入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = dat; //放置數(shù)據(jù)
LCD12864_EN = 1; //寫(xiě)時(shí)序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_ReadData
* 函數(shù)功能 : 讀取數(shù)據(jù)
* 輸 入 : 無(wú)
* 輸 出 : 讀取到的8位數(shù)據(jù)
*******************************************************************************/
#ifdef LCD12864_PICTURE
uchar LCD12864_ReadData(void)
{
uchar i, readValue;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return 0; //超過(guò)等待退出
}
}
LCD12864_RS = 1; //選擇命令
LCD12864_RW = 1;
LCD12864_EN = 0;
LCD12864_Delay1ms(1); //等待
LCD12864_EN = 1;
LCD12864_Delay1ms(1);
readValue = LCD12864_DATAPORT;
LCD12864_EN = 0;
return readValue;
}
#endif
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_Init
* 函數(shù)功能 : 初始化LCD12864
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void LCD12864_Init()
{
LCD12864_PSB = 1; //選擇并行輸入
LCD12864_RST = 1; //復(fù)位
LCD12864_WriteCmd(0x30); //選擇基本指令操作
LCD12864_WriteCmd(0x0c); //顯示開(kāi),關(guān)光標(biāo)
LCD12864_WriteCmd(0x01); //清除LCD12864的顯示內(nèi)容
}
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_ClearScreen
* 函數(shù)功能 : 在畫(huà)圖模式下,LCD12864的01H命令不能清屏,所以要自己寫(xiě)一個(gè)清
* * 屏函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
#ifdef LCD12864_PICTURE
void LCD12864_ClearScreen(void)
{
uchar i,j;
LCD12864_WriteCmd(0x34); //開(kāi)啟拓展指令集
for(i=0;i<32;i++) //因?yàn)長(zhǎng)CD有縱坐標(biāo)32格所以寫(xiě)三十二次
{
LCD12864_WriteCmd(0x80+i); //先寫(xiě)入縱坐標(biāo)Y的值
LCD12864_WriteCmd(0x80); //再寫(xiě)入橫坐標(biāo)X的值
for(j=0;j<32;j++) //橫坐標(biāo)有16位,每位寫(xiě)入兩個(gè)字節(jié)的的數(shù)據(jù),也
{ //就寫(xiě)入32次以為當(dāng)寫(xiě)入兩個(gè)字節(jié)之后橫坐標(biāo)會(huì)自
LCD12864_WriteData(0xFF); //動(dòng)加1,所以就不用再次寫(xiě)入地址了。
}
}
LCD12864_WriteCmd(0x36); //0x36擴(kuò)展指令里面打開(kāi)繪圖顯示
LCD12864_WriteCmd(0x30); //恢復(fù)基本指令集
}
#endif
/*******************************************************************************
* 函 數(shù) 名 : LCD12864_SetWindow
* 函數(shù)功能 : 設(shè)置在基本指令模式下設(shè)置顯示坐標(biāo)。注意:x是設(shè)置行,y是設(shè)置列
* 輸 入 : x, y
* 輸 出 : 無(wú)
*******************************************************************************/
void LCD12864_SetWindow(uchar x, uchar y)
{
uchar pos;
if(x == 0) // 第一行的地址是80H
{
x = 0x80;
}
else if(x == 1) //第二行的地址是90H
{
x = 0x90;
}
else if(x == 2) //第三行的地址是88H
{
x = 0x88;
}
else if(x == 3)
{
x = 0x98;
}
pos = x + y;
LCD12864_WriteCmd(pos);
}
//main.c的程序
#include<reg51.h>
#include<lcd12864.h>
//--定義全局變量--//
unsigned char DisplayData[8];
//用來(lái)存放要顯示的8位數(shù)的值
//--聲明全局函數(shù)--//
void TIMER_Configuration(); //初始化定時(shí)器
//--定義全局變量--//
unsigned long Freq; //用來(lái)存放要顯示的頻率值
unsigned long TimeCount; //用于計(jì)算1S鐘的
/*******************************************
*函數(shù)名 :main
*功 能 :主函數(shù)
*輸 入 :無(wú)
*輸 出 :無(wú)
*******************************************/
unsigned char code CharCode1[]="速度: n/s";
void main()
{
char i;
TIMER_Configuration();
LCD12864_Init();
LCD12864_SetWindow(0, 0);
while(1)
{
if(TR0 == 0) //當(dāng)計(jì)數(shù)器停下的時(shí)候,表明計(jì)數(shù)完畢
{
Freq = Freq + TL1; //讀取TL的值
Freq = Freq + (TH1 * 256); //讀取TH的值
Freq= Freq/ 2; //根據(jù)扇葉數(shù)除數(shù)
//--求頻率的個(gè)十百千萬(wàn)十萬(wàn)位--//
DisplayData[0] = (Freq%100000/10000)+0x30;
DisplayData[1] = (Freq%10000/1000)+0x30;
DisplayData[2] = (Freq%1000/100)+0x30;
DisplayData[3] = (Freq%100/10)+0x30;
DisplayData[4] = (Freq%10)+0x30;
//--顯示完,重新計(jì)算下一次頻率。--//
Freq = 0;//將計(jì)算的頻率清零
TH1 = 0; //將計(jì)數(shù)器的值清零
TL1 = 0;
TR0 = 1; //開(kāi)啟定時(shí)器
TR1 = 1; //開(kāi)啟計(jì)數(shù)器
}
//--顯示求得的數(shù)值--//
LCD12864_SetWindow(0,0);
LCD12864_WriteData(CharCode1[0]);
LCD12864_WriteData(CharCode1[1]);
LCD12864_WriteData(CharCode1[2]);
LCD12864_WriteData(CharCode1[3]);
LCD12864_WriteData(CharCode1[4]);
LCD12864_WriteData(CharCode1[5]);
for(i=0;i<5;i++)
LCD12864_WriteData(DisplayData[i]);
LCD12864_WriteData(CharCode1[7]);
LCD12864_WriteData(CharCode1[8]);
LCD12864_WriteData(CharCode1[9]);
}
}
/*******************************************
*函數(shù)名 :TIMER_Configuration
*功 能 :配置定時(shí)/計(jì)數(shù)器T0和T1
*輸 入 :無(wú)
*輸 出 :無(wú)
*******************************************/
void TIMER_Configuration()
{
//--定時(shí)器T1做計(jì)數(shù)器,工作方式1(16位定時(shí)器),只由TRx打開(kāi)計(jì)數(shù)器--//
//--定時(shí)器T0做定時(shí)器,工作方式1(16位定時(shí)器),只由TRx打開(kāi)定時(shí)器--//
TMOD=0x51;
//--設(shè)置定時(shí)器晶振為12MHZ時(shí)定時(shí)50ms--//
TH0=0x3C;
TL0=0xB0;
//--打開(kāi)中斷-//
ET0=1;
ET1=1;
EA=1;
//--打開(kāi)定時(shí)器*/
TR0=1;
TR1=1;
}
/*******************************************
*函數(shù)名 :Timer0
*功 能 :定時(shí)器0的中斷函數(shù)
*輸 入 :無(wú)
*輸 出 :無(wú)
*******************************************/
void Timer0() interrupt 1
{
TimeCount++;
if(TimeCount==20)//計(jì)時(shí)到1S
{
TR0=0;
TR1=0;
TimeCount=0;
}
//--12MHZ設(shè)置定時(shí)50ms的初值--//
TH0=0x3C;
TL0=0xB0;
}
/*******************************************
*函數(shù)名 :Timer1
*功 能 :定時(shí)器1的中斷函數(shù)
*輸 入 :無(wú)
*輸 出 :無(wú)
*******************************************/
void Timer1() interrupt 3
{
//--進(jìn)入一次中斷,表明計(jì)數(shù)到了65536--//
Freq=Freq+65536;
}
復(fù)制代碼
全部資料51hei下載地址:
測(cè)速—12864.zip
(35.86 KB, 下載次數(shù): 54)
2019-5-18 23:11 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
75535451
時(shí)間:
2019-5-19 11:24
感謝樓主分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1