久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機+LM393測速傳感器在LCD12864上顯示程序
[打印本頁]
作者:
zzz2269501
時間:
2019-5-18 23:12
標題:
單片機+LM393測速傳感器在LCD12864上顯示程序
第一次發,不知道怎么發。。。為比賽準備的程序,可惜比賽沒用到。用的LCD12864是帶字庫的,用的是LM393測速傳感器如圖。
程序分為main.c+lcd12864.c+lcd12864.h
制作出來的實物圖如下:
IMG_20190518_225512.jpg
(4.21 MB, 下載次數: 55)
下載附件
2019-5-18 23:11 上傳
單片機源程序如下:
//lcd12864.h的程序
#ifndef __LCD12864_H
#define __LCD12864_H
//---包含頭文件---//
#include<reg51.h>
//---重定義關鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//---如果使用畫圖模式定義這個---//
//#define LCD12864_PICTURE
//---定義使用的IO口---//
#define LCD12864_DATAPORT P0 //數據IO口
sbit LCD12864_RS = P2^6; //(數據命令)寄存器選擇輸入
sbit LCD12864_RW = P2^5; //液晶讀/寫控制
sbit LCD12864_EN = P2^7; //液晶使能控制
sbit LCD12864_PSB = P3^2; //串/并方式控制
sbit LCD12864_RST = P3^4; //復位端
//---聲明全局函數---//
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"
/*******************************************************************************
* 函 數 名 : LCD12864_Delay1ms
* 函數功能 : 延時1MS
* 輸 入 : c
* 輸 出 : 無
*******************************************************************************/
void LCD12864_Delay1ms(uint c)
{
uchar a,b;
for(; c>0; c--)
{
for(b=199; b>0; b--)
{
for(a=10; a>0; a--);
}
}
}
/*******************************************************************************
* 函 數 名 : LCD12864_Busy
* 函數功能 : 檢測LCD是否忙
* 輸 入 : 無
* 輸 出 : 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) //檢測讀取到的值
{
i++;
if(i > 100)
{
LCD12864_EN = 0;
return 0; //超過等待時間返回0表示失敗
}
}
LCD12864_EN = 0;
return 1;
}
/*******************************************************************************
* 函 數 名 : LCD12864_WriteCmd
* 函數功能 : 寫命令
* 輸 入 : cmd
* 輸 出 : 無
*******************************************************************************/
void LCD12864_WriteCmd(uchar cmd)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超過等待退出
}
}
LCD12864_RS = 0; //選擇命令
LCD12864_RW = 0; //選擇寫入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = cmd; //放置數據
LCD12864_EN = 1; //寫時序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 數 名 : LCD12864_WriteData
* 函數功能 : 寫數據
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超過等待退出
}
}
LCD12864_RS = 1; //選擇數據
LCD12864_RW = 0; //選擇寫入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = dat; //放置數據
LCD12864_EN = 1; //寫時序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 數 名 : LCD12864_ReadData
* 函數功能 : 讀取數據
* 輸 入 : 無
* 輸 出 : 讀取到的8位數據
*******************************************************************************/
#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; //超過等待退出
}
}
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
/*******************************************************************************
* 函 數 名 : LCD12864_Init
* 函數功能 : 初始化LCD12864
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void LCD12864_Init()
{
LCD12864_PSB = 1; //選擇并行輸入
LCD12864_RST = 1; //復位
LCD12864_WriteCmd(0x30); //選擇基本指令操作
LCD12864_WriteCmd(0x0c); //顯示開,關光標
LCD12864_WriteCmd(0x01); //清除LCD12864的顯示內容
}
/*******************************************************************************
* 函 數 名 : LCD12864_ClearScreen
* 函數功能 : 在畫圖模式下,LCD12864的01H命令不能清屏,所以要自己寫一個清
* * 屏函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
#ifdef LCD12864_PICTURE
void LCD12864_ClearScreen(void)
{
uchar i,j;
LCD12864_WriteCmd(0x34); //開啟拓展指令集
for(i=0;i<32;i++) //因為LCD有縱坐標32格所以寫三十二次
{
LCD12864_WriteCmd(0x80+i); //先寫入縱坐標Y的值
LCD12864_WriteCmd(0x80); //再寫入橫坐標X的值
for(j=0;j<32;j++) //橫坐標有16位,每位寫入兩個字節的的數據,也
{ //就寫入32次以為當寫入兩個字節之后橫坐標會自
LCD12864_WriteData(0xFF); //動加1,所以就不用再次寫入地址了。
}
}
LCD12864_WriteCmd(0x36); //0x36擴展指令里面打開繪圖顯示
LCD12864_WriteCmd(0x30); //恢復基本指令集
}
#endif
/*******************************************************************************
* 函 數 名 : LCD12864_SetWindow
* 函數功能 : 設置在基本指令模式下設置顯示坐標。注意:x是設置行,y是設置列
* 輸 入 : x, y
* 輸 出 : 無
*******************************************************************************/
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];
//用來存放要顯示的8位數的值
//--聲明全局函數--//
void TIMER_Configuration(); //初始化定時器
//--定義全局變量--//
unsigned long Freq; //用來存放要顯示的頻率值
unsigned long TimeCount; //用于計算1S鐘的
/*******************************************
*函數名 :main
*功 能 :主函數
*輸 入 :無
*輸 出 :無
*******************************************/
unsigned char code CharCode1[]="速度: n/s";
void main()
{
char i;
TIMER_Configuration();
LCD12864_Init();
LCD12864_SetWindow(0, 0);
while(1)
{
if(TR0 == 0) //當計數器停下的時候,表明計數完畢
{
Freq = Freq + TL1; //讀取TL的值
Freq = Freq + (TH1 * 256); //讀取TH的值
Freq= Freq/ 2; //根據扇葉數除數
//--求頻率的個十百千萬十萬位--//
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;
//--顯示完,重新計算下一次頻率。--//
Freq = 0;//將計算的頻率清零
TH1 = 0; //將計數器的值清零
TL1 = 0;
TR0 = 1; //開啟定時器
TR1 = 1; //開啟計數器
}
//--顯示求得的數值--//
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]);
}
}
/*******************************************
*函數名 :TIMER_Configuration
*功 能 :配置定時/計數器T0和T1
*輸 入 :無
*輸 出 :無
*******************************************/
void TIMER_Configuration()
{
//--定時器T1做計數器,工作方式1(16位定時器),只由TRx打開計數器--//
//--定時器T0做定時器,工作方式1(16位定時器),只由TRx打開定時器--//
TMOD=0x51;
//--設置定時器晶振為12MHZ時定時50ms--//
TH0=0x3C;
TL0=0xB0;
//--打開中斷-//
ET0=1;
ET1=1;
EA=1;
//--打開定時器*/
TR0=1;
TR1=1;
}
/*******************************************
*函數名 :Timer0
*功 能 :定時器0的中斷函數
*輸 入 :無
*輸 出 :無
*******************************************/
void Timer0() interrupt 1
{
TimeCount++;
if(TimeCount==20)//計時到1S
{
TR0=0;
TR1=0;
TimeCount=0;
}
//--12MHZ設置定時50ms的初值--//
TH0=0x3C;
TL0=0xB0;
}
/*******************************************
*函數名 :Timer1
*功 能 :定時器1的中斷函數
*輸 入 :無
*輸 出 :無
*******************************************/
void Timer1() interrupt 3
{
//--進入一次中斷,表明計數到了65536--//
Freq=Freq+65536;
}
復制代碼
全部資料51hei下載地址:
測速—12864.zip
(35.86 KB, 下載次數: 54)
2019-5-18 23:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
75535451
時間:
2019-5-19 11:24
感謝樓主分享
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲亚洲人成综合网络
|
av天天干
|
国产欧美日韩视频
|
欧美视频在线观看
|
国产精品国产三级国产aⅴ浪潮
|
亚洲第一毛片
|
av免费网
|
天堂影院av
|
亚洲深夜福利
|
九九热在线播放
|
黄色小视频免费看
|
国产福利在线视频
|
国产成人a亚洲精品
|
天天干天天操天天爽
|
日韩在线视频免费观看
|
日韩精品免费视频
|
久久黄网
|
亚洲视频一区二区三区
|
久久国产精品99久久人人澡
|
一区二区日韩
|
国产精品美女久久久久久久久
|
精品国产99
|
五月天网址
|
www性
|
一区二区影院
|
日韩色av
|
久综合
|
亚洲欧美日韩国产精品
|
国产网站在线
|
久久精品在线观看
|
亚洲成人a v
|
欧美精品系列
|
久久精品日韩
|
中文字幕一区二区三区视频
|
成人黄色一级片
|
国产日韩欧美
|
久久国产99
|
日韩国产精品一区二区
|
五月婷婷六月激情
|
男女在线视频
|
欧美黄色一区
|