![]() |
發布時間: 2017-11-23 19:36
正文摘要:軟件功能可以實現了,板子也可以實現,但用555仿真時出現問題,有人能解決一下555產生延時信號硬件設計問題么,我圖片中的電容,電阻值肯定有問題,誰可以解決一下么 |
by64214 發表于 2017-11-28 22:23 那個L1是什么東西啊?? |
怎么樣。成功了么?我設計了沒用啊 |
網上程序 編譯成功 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit rs=P2^0; //1602的數據/指令選擇控制線 sbit rw=P2^1; //1602的讀寫控制線 sbit en=P2^2; //1602的使能控制線 sbit trig=P2^5; //超聲波測距模塊Trig sbit echo=P3^2; //超聲波測距模塊Echo bit flag1; //觸發信號標志位// uchar count; //中斷累加變量 long int distance; //測量所得距離 unsigned char code table[ ]={"0123456789"}; //定義字符數組顯示數字 /*------------------------------------------------ 延時函數 ------------------------------------------------*/ void delay(uint n) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } /*------------------------------------------------ 延時函數 ------------------------------------------------*/ void delayt(uint x) { uchar j; while(x-- > 0) { for(j = 0;j < 125;j++) { ; } } } /*------------------------------------------------ 1602寫命令函數 ------------------------------------------------*/ void lcd_wcom(uchar com) { rs=0; //選擇指令寄存器 rw=0; //選擇寫 P0=com; //把命令字送入P0 delay(5); //延時一小會兒,讓1602準備接收數據 en=1; //使能線電平變化,命令送入1602的8位數據口,這點非常重要 en=0; } /*------------------------------------------------ 1602寫數據函數 ------------------------------------------------*/ void lcd_wdat(uchar dat) { rs=1; //選擇數據寄存器 rw=0; //選擇寫 P0=dat; //把要顯示的數據送入P0 delay(5); //延時一小會兒,讓1602準備接收數據,也就是檢測忙信號,這點非常重要。 en=1; //使能線電平變化,數據送入1602的8位數據口 en=0; } /*------------------------------------------------ 1602初始化函數 ------------------------------------------------*/ void lcd_init() { lcd_wcom(0x38); //8位數據,雙列,5*7字形 ,用到功能設定指令 lcd_wcom(0x0c); //開啟顯示屏,關光標,光標不閃爍,用到顯示開關控制指令 lcd_wcom(0x06); //顯示地址遞增,即寫一個數據后,顯示位置右移一位,用到了寫入模式設置指令 lcd_wcom(0x01); //清屏,用到了清屏指令 } /*------------------------------------------------ 1602顯示固定字符函數 ------------------------------------------------*/ void lcd_xianshi() { lcd_wcom(0x80+0x40); lcd_wdat('D'); lcd_wdat('i'); lcd_wdat('s'); lcd_wdat('t'); lcd_wdat('a'); lcd_wdat('n'); lcd_wdat('c'); lcd_wdat('e'); lcd_wdat(':'); lcd_wcom(0x80+0x4c); lcd_wdat('.'); lcd_wcom(0x80+0x4e);//單位是厘米// lcd_wdat('c'); lcd_wdat('m'); } /*------------------------------------------------ 定時器0初始化,用于計算響應信號時間 ------------------------------------------------*/ void init_t0() { TMOD=0x01; TL0=0x66; TH0=0xfc; //1ms ET0=1; EA=1; } /*------------------------------------------------ 超聲波模塊觸發信號 ------------------------------------------------*/ void trigger() { trig=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); trig=1; } /*------------------------------------------------ 超聲波模塊相應端口初始化函數 ------------------------------------------------*/ void init_measuring() { trig=1; echo=1; count=0; } /*------------------------------------------------ 超聲波模塊距離測試函數 ------------------------------------------------*/ void measuring() { uchar l; uint h,y; TR0 = 1; while(echo==1) { ; } TR0 = 0; l = TL0; h = TH0; y = (h << 8) + l; y = y - 0xfc66;//us部分 distance = y + 1000 * count;//計算總時間,單位是微秒 TL0 = 0x66; TH0 = 0xfc; delayt(30); distance = 3400* distance / 20000;//原始為:(0.34毫米/us)*時間/2// } /*------------------------------------------------ 超聲波模塊測量結果顯示函數 ------------------------------------------------*/ void display(uint x) { uchar qian,bai,shi,ge; qian=x/1000; bai=(x/100)%10; shi=(x/10)%10; ge=x%10; lcd_wcom(0x80+0x49);//單位是厘米// lcd_wdat(table[qian]); lcd_wdat(table[bai]); lcd_wdat(table[shi]); lcd_wcom(0x80+0x4d); lcd_wdat(table[ge]); } /*------------------------------------------------ 主函數 ------------------------------------------------*/ void main() { lcd_init(); //液晶初始化 init_t0(); //定時器0初始化 init_measuring(); //超聲波相應端口初始化 while(1) { lcd_xianshi(); //液晶顯示特定字符 trigger(); //觸發超聲波啟動 while(echo==0) //等待回聲 { ; } measuring(); //進行距離測量 display(distance); //對測量結果進行顯示 init_measuring(); //超聲波相應端口初始化 delayt(600); //每次測量間隔60ms } } //……………………………………………中斷服務函數…………………………………………………// void T_0()interrupt 1 { TF0 = 0; TL0 = 0x66; TH0 = 0xfc; count++; if(count==18) { TR0 =0; TL0 = 0x66; TH0 = 0xfc; count = 0; } } |
![]() |
![]() |
Dushu 發表于 2017-11-23 21:19 沒,還在做,你有好的建議么 |
老鐵這個代替sr04成功了嗎 |