欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機的US-100(超聲波模塊)1602顯示程序
[打印本頁]
作者:
喬納森喬斯達
時間:
2018-3-8 10:37
標題:
基于51單片機的US-100(超聲波模塊)1602顯示程序
#include<reg52.h>
#include<intrins.h>
#define nops {_nop_();_nop_();_nop_();_nop_();}
/******************************引腳及變量的定義****************************/
sbit RS = P2^0; //寄存器選擇位
sbit RW = P2^1; //讀取選擇位
sbit E = P2^2; //使能信號位
sbit BF = P0^7; //忙碌信號位
unsigned char code Tab[] = {"0123456789"};
unsigned char code string[] = {"range:2cm--4.5m"};
char part,ge,shi,bai;
char idata GLengthLoh[2]; //接收緩沖區
bit success_flag; //定義測試成功標志位
/*********************************************************/
/*********函數名稱:delay1ms(void) ******************/
/*********函數功能:延時1毫秒 ******************/
/*********函數參數:void ******************/
/*********************************************************/
void delay1ms(void) //誤差 -0.651041666667us
{
char a,b;
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
/*********************************************************/
/*********函數名稱:delaynms(char n) ******************/
/*********函數功能:延時n個1毫秒 ******************/
/*********函數參數:n ******************/
/*********************************************************/
void delaynms(char n)
{
char a;
for(a = 0;a > n;a--)
delay1ms();
}
/*********************************************************/
/*********函數名稱:BusyTest(void) ******************/
/*********函數功能:判斷液晶模塊忙碌狀態******************/
/*********函數參數:返回值:result ******************/
/*********************************************************/
unsigned char BusyTest()
{
bit result;
RS = 0;
RW = 1; //RS為低電平,RW為高電平時,可以讀狀態
E = 1; //使能為高電平時可讀取信息
nops; //延時40us,給硬件反應時間
result = BF; //將忙碌標志位電平賦給result
E = 0; //使能1到0:執行指令
return result;
}
/*********************************************************/
/*********函數名稱:WriteInstruction(char dictate)*******/
/*********函數功能:將模式設置指令或顯示地址寫入液晶模塊**/
/*********函數參數:dictate ******************/
/*********************************************************/
void WriteInstruction(char dictate)
{
while(BusyTest() == 1); //如果忙碌標志位忙碌則等待
RS = 0;
RW = 0; //RS/RW位同時為低電平時可寫入指令
E = 0; //使能0到1:寫入指令
nops;
P0 = dictate; //將數據送入P0口,寫入數據或地址
nops;
E = 1; //使能0到1:寫入指令
nops;
E = 0; //使能1到0:執行指令
}
/*********************************************************/
/*********函數名稱:WriteAddress(char x) *******/
/*********函數功能:指定字符顯示的實際地址 ***********/
/*********函數參數:x ******************/
/*********************************************************/
void WriteAddress(char x)
{
WriteInstruction(x|0x80); //80H+地址碼
}
/*********************************************************/
/*********函數名稱:WriteData(char y) *******/
/*********函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊*/
/*********函數參數:y ******************/
/*********************************************************/
void WriteData(char y)
{
while(BusyTest() == 1); //如果忙碌標志位忙碌則等待
RS = 1;
RW = 0; //RS為高電平,RW為低電平時,可以寫入數據
E = 0;
P0 = y;
nops;
E = 1;
nops;
E = 0;
}
/*********************************************************/
/*********函數名稱:LCDInit(void) *******/
/*********函數功能:液晶模塊初始化 ****************/
/*********函數參數:void ******************/
/*********************************************************/
void LCDInit(void)
{
delaynms(15); //延時15毫秒,首次寫入液晶指令應給反應時間
WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
delaynms(5); //延時5秒,反應時間
WriteInstruction(0x38);
delaynms(5); //延時5秒,反應時間
WriteInstruction(0x38);
delaynms(5); //連續三次,確保初始化成功
WriteInstruction(0x0c); //顯示模式設置:顯示開,無光標,光標不閃爍
delaynms(5);
WriteInstruction(0x06); //顯示模式設置:顯示光標右移,屏幕不移動
delaynms(5);
WriteInstruction(0x01); //清屏
delaynms(5);
}
/*********************************************************/
/*********函數名稱:UART_Send(char dat) *******/
/*********函數功能:串口發送函數 ****************/
/*********函數參數:dat ******************/
/*********************************************************/
void UART_Send(char dat)
{
TI = 0; // 清發送標志
SBUF = dat; //如果TI為0等待
while (!TI); //等待發送數據
}
/*********************************************************/
/*********函數名稱:UART_Init() ***************/
/*********函數功能:串口初始化函數 ****************/
/*********函數參數:無 ******************/
/*********************************************************/
void UART_Init()
{
TH1 = 0xFD;
TL1 = 0xFD;
TMOD = 0x21; //設置定時器1為模式2;定時器0為模式1
TH0 =(65536-2500)/256; //約2.50MS定時器初值
TL0 =(65536-2500)%256; //約2.50MS定時器初值
ET0 = 1;
TR0 = 1; //啟動定時器
TR1 = 1; //啟動定時器 SM0 SM1
SM0 = 0; //串口通信模式設置 0 0 = 0
SM1 = 1; // 0 1 = 1
// 1 0 = 2
// 1 1 = 3
REN = 1; //串口允許接收數據
ES = 1; //開串中斷
EA = 1;
}
/*********************************************************/
/*********函數名稱:UART_ISR(void) ***************/
/*********函數功能:串口中斷函數 ****************/
/*********函數參數:void ******************/
/*********************************************************/
void UART_ISR(void) interrupt 4
{
char temp,k;
ES = 0; //關中斷
if(RI)
{
RI = 0; //清接收標志
temp = SBUF;
GLengthLoh[k] = temp;
k++;
if(k == 2) //k=數據長度
k = 0;
}
ES = 1; //開中斷
}
/*********************************************************/
/*********函數名稱:timer0() ***************/
/*********函數功能:定時器函數 ****************/
/*********函數參數:void ******************/
/*********************************************************/
timer0() interrupt 1 // 定時器0中斷是1號
{
TH0 =(65536-2500)/256; //約2.50MS定時器初值
TL0 =(65536-2500)%256; //約2.50MS定時器初值 TH0 = 0xef; TL0 = 0x94; //寫入定時器0初始值
}
/*********************************************************/
/*********函數名稱:conversion(int8 temp_data) *******/
/*********函數功能:數據轉換 ****************/
/*********函數參數:temp_data ******************/
/*********************************************************/
void conversion(int temp_data)
{
char part_data,ge_data,shi_data,bai_data;
bai_data = temp_data / 1000;
shi_data = (temp_data % 1000) / 100;
ge_data = (temp_data % 100) / 10;
part_data = temp_data % 10;
EA = 0;
bai = bai_data;
shi = shi_data;
ge = ge_data;
part = part_data;
EA = 1;
}
/*********************************************************/
/*********函數名稱:main(void) *******/
/*********函數功能:主函數 ****************/
/*********函數參數:void ******************/
/*********************************************************/
void main(void)
{
int k;
long PreLength;
LCDInit(); //調用液晶初始化函數
delaynms(10);
UART_Init();
PreLength = 0;
k = 0;
while(1)
{
WriteAddress(0x01);
while(string[k] != '\0')
{
WriteData(string[k]);
k++;
}
UART_Send(0X55);
PreLength = GLengthLoh[0] * 256 + GLengthLoh[1] - 5;
conversion(PreLength);
WriteAddress(0x41); //從第2行第6列開始顯示
WriteData('J'); //將特定的字符常量寫入LCD
WriteData('U');
WriteData('L');
WriteData('I');
WriteData(':');
if(PreLength <= 4500 && PreLength >= 20)
{
WriteData(Tab[bai]); //將百位數字的字符常量寫入LCD
WriteData(Tab[shi]); //將十位數字的字符常量寫入LCD
WriteData(Tab[ge]); //將個位數字的字符常量寫入LCD
WriteData('.');
WriteData(Tab[part]);
}
else
{
WriteData('-');
WriteData('-');
WriteData('-');
WriteData('-');
WriteData('-');
}
WriteData(' ');
WriteData('c');
WriteData('m');
}
}
復制代碼
作者:
111222333牛逼
時間:
2018-7-10 20:38
為什么·12到25厘米之間無顯示?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1