欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
超聲波測距+1602顯示 單片機程序
[打印本頁]
作者:
記得好好學習
時間:
2019-7-20 09:30
標題:
超聲波測距+1602顯示 單片機程序
本人親自看視頻一手敲出來的 實測能用 代碼比較規范好看點
單片機源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit in=P1^1; //超聲波接收 就是ECHO
sbit out=P1^0; // 發射 就是TRIG
//lcd1602端口定義
sbit RS= P3^5; //寄存器選擇位
sbit RW = P3^6; //讀寫選擇位
sbit E = P3^4; //使能
sbit BF=P0^7; //忙碌標志
#define LCD1602data P0
uint time; //無符號整型
unsigned long s=0; //無符號長整型
bit flag; //超聲波超出量程標志位
uint s1,s2,s3;
// 1602模塊語句
//延時一毫秒
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
//延時若干毫秒 入口參數N
void delay(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay1ms();
}
//判斷液晶忙碌狀態
// 返回值 result result=1 忙碌 result=0 不忙
bit BusyTest(void)
{
bit result; //為位類型 長度0或1
RS=0;
RW=1; ///RS=0 RW=1 讀狀態
E=1; // e=1 允許讀寫
_nop_(); // kong操作
_nop_();
_nop_();
_nop_();
result=BF; //將忙碌電平給RESULT
E=0;
return result;
}
// 將模式指令 顯示地址寫入液晶
// 入口參數 dictate
void Write_com (unsigned char dictate) //寫命令字 lcd_w_cmd
{
while(BusyTest()==1); //忙碌等待
RS=0; //RS RW同時為0 才能寫入指令
RW=0;
E=0; //先置零 01跳變
_nop_();
_nop_(); //空操作 硬件反應
LCD1602data=dictate; //將數據送入P0口 寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}
//指定字符顯示實際地址 入口參數x
void WriteAddress(unsigned char x)
{
Write_com(x|0x80); //顯示位置確定為80+地址碼X
}
//將字符寫入液晶 入口參數Y
void WriteData(unsigned char y) //lcd_w_dat
{
while (BusyTest()==1);
RS=1;
RW=0;
E=0;
LCD1602data=y; // 將數據送入P0口 即將數據寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0; //液晶模塊執行命令
}
// LCD初始化
void LcdInt(void)
{
delay(15);
Write_com(0x38); //顯示模式設置 16*2 5*7點陣 8位數據口
delay(5);
Write_com(0x38);
delay(5);
Write_com(0x38);
delay(5); //3次寫設置模式
//write_com(0x0f); 顯示模式設置 顯示開 有光標 光標閃爍
// delay(5);
Write_com(0x0c); // 顯示開 不顯示光標
delay(5);
Write_com(0x06); // 顯示模式設置 光標右移 字符不移
delay(5);
Write_com(0x01); // 清屏指令 以前內容清楚
delay(5);
}
// ADD為顯示字符位置 在第二行顯示 X為顯示字符
// 調用函數注意 函數為顯示數字 display(10,9); display(10,a)
//分別表示第二行第十位顯示數字9和A代表的數字
// 如果想把此函數改寫成顯示字母的
// 只需把最writedata(0x30+x)中的0x30+去掉
display(unsigned char add , unsigned char x)
{
WriteAddress(0x00);
delay(5);
Write_com(0x80+0x40+add) ;
WriteData(0x30+x);
return 0;
}
LCD1602()//1602初顯示
{
LcdInt();
delay(10);
Write_com(0x01); //清屏
delay(5);
WriteAddress(0x00); //設置顯示地址為第一行第一個字 可以不寫 默認也是第一行第一個字
delay(5);
//第一行顯示 DISTANCE
WriteData('D');
WriteData('i');
WriteData('s');
WriteData('t');
WriteData('a');
WriteData('n');
WriteData('c');
WriteData('e');
WriteData(':');
return 0;
}
//以上1602模塊語句
void FS() // 發送超聲波
{
out=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
out=0;
}
void count(void)// 計算并顯示超聲波測到距離
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
s=(time*1.7)/100; //算出來單位為CM
if ((s>700)||flag==1) //超出測量范圍顯示ERROR
{
flag=0;
Write_com(0x80+0x40+11);
WriteData('E'); delay(5);
WriteData('R'); delay(5);
WriteData('R'); delay(5);
WriteData('O') ; delay(5);
WriteData('R') ; delay(5);
delay(500);
}
else
{
s1=s%1000/100;
s2=s%1000%100/10;
s3=s%1000%10%10;
display(11,s1); //s1 為上面的X 11為上面的Y
WriteData('.');
display(13,s2);
display(14,s3);
WriteData('m');
delay(500);
}
}
void zd0() interrupt 1 //t0中斷用來計數器溢出 超過測量范圍
{
flag=1;
}
int main()
{
LCD1602();
//while (1)
TMOD=0X01; //設置T0為方式1 GATE=0;
TH0=0;
TL0=0;
ET0=1; // 允許T0中斷
EA=1;
while(1)
{
FS();
while(!in);
TR0=1;
while (in);
TR0=0;
count();
}
}
復制代碼
所有資料51hei提供下載:
超聲波測距22.zip
(45.26 KB, 下載次數: 90)
2019-7-20 09:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
嘟嘟胖子
時間:
2019-7-23 12:44
謝謝樓主。
作者:
單片機老司機
時間:
2019-11-29 20:31
好評,看的很清楚,能不能給加個報警器,求程序
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1