【正文】
RS = 0。 } } /*********檢查 LCD 忙狀態(tài) ***********/ bit LCD_BUSY() { bit BS。(b29)) { d=numcode[num[b]]。 28if((b24)amp。b33。 } Write_Comm(0xc0)。 } if(14==a) { d=0xdf。amp。a++) { d=dispBUF[a]。 for(a=0。 Write_Comm(0x01)。 } /**************************LCD 顯示函數(shù) *******************/ void LCD_DISP() { uchar a,b,d。 } } /*******************數(shù)據(jù)轉(zhuǎn)換函數(shù) **************************/ void BUMA() { temp=~temp。 DQ = 1。0x01。 i) { DQ = 0。 for (i = 8。 } return (dat)。 if(DQ) dat |= 0x80。 dat = 1。 i 0。 uchar dat = 0。 Delay(20)。 if(DQ) flag=0。 DQ = 1。 DQ = 0。 } /***************18B20 復位函數(shù) ***********************/ void Init_18B20() 26{ DQ = 1。 t = t | a。 ) t = b。 a = B20_RDAT()。 B20_WDAT(0xCC)。 } } /***********讀取溫度函數(shù) **************/ uint GET_WD(void) { uint a = 0, b = 0, t = 0。 if(flag) { B20_WDAT(0xCC)。 num[28]=tmp/1。 num[27]=tmp/10。 num[26]=tmp/100。 num[25]=tmp/1000。 num[13]=tmp/10(tmp/100)*10。 num[12]=tmp/100。 } tp*=10。 tp=temp*。 if(temp0x8000) tp=temp*。 unsigned long int tmp。 distance=sqrt(s)。 d*=d。 t=jsh*256+jsl120。 if(temp0x8000) c=+*temp*。 } /******************距離計算 ***************************/ void JULIJS() { float c,d,s。 CSBIN=1。 P0 =0。 TH0 =0x15。i++) { num[i]=0。 for(i=0。 delay15(50)。_nop_()。_nop_()。 CNT=0。_nop_()。_nop_()。 _nop_()。_nop_()。_nop_()。 _nop_()。_nop_()。 _nop_()。 count++。 TL1=0。 TL0=0xA0。 /******************定時器 1溢出 ***************************/ void timer1(void)interrupt 2 using 1 {TR1=0。 //發(fā)射超聲波 sbit CSBIN =P2^6。 //溫度的符號位 23sbit START =P1^0。 sbit sta_flag =flag^0。 //寫入 LCD命令 void Write_Data(uchar)。 void Init_18B20(void)。 void B20_WDAT(uchar dat)。 void delay15(uchar us)。 void delay1ms(uint ms)。 //DS18B20 數(shù)字端口 sbit Busy = P0^7。 //LCD RW sbit E =P2^2。 //DS18B20 存在標準 sbit RS=P2^0。 //距離 uint temp。 //計數(shù)器的高低位 uchar count=0。 uint num[29]={0}。939。839。739。639。539。439。339。239。139。039。 } 系統(tǒng)原理圖 22 源程序 include include include define uchar unsigned char define uint unsigned int uchar code dispBUF[33]={Temperature: Distance: mm }。 cm/=20200。 cm=7610。 } 實現(xiàn)距離計算 float Dis_count() { float cm。 } }else speed=。 21 if(tu==0)speed=332+T_C*。 y=Read_Temperature()。 } else{return r。} c=4。 if(c0x1000){c=c+1。 write(0xCC)。 c=read()。 if(r) { write(0xCC)。 reset()。 //開放總中斷 Init_LCD()。 //超聲波發(fā)送關(guān)閉 CSBIN=1。 P0=0。 TH0=0x15。i++) //顯示清零 { num[i]=0。 for(i=0。 sta_flag=0。 } puter()。 19testtemp()。 if(15==count) { temp=wd()。 jsh=TH1。 while(1) { if(sta_flag) { while(0==CSBIN)。 ET0=1。 while(i)。 BUZZER=1。 i=100000。 if(START) 18goto waitforstarting。i20。 waitforstarting: while(START)。 display()。j++)。i++) for(j=0。 for(i=0。 (3)按鍵 S 為測量啟動鍵; (4)系統(tǒng)采用 AT89S52的內(nèi)時鐘: 12MHz; (5)沒有使用看門狗功能; (6)超聲波發(fā)送一定時間后才開始啟動檢測,避免直達信號造成誤判。 主程序,分為系統(tǒng)初始化、按鍵處理以及各個子程序的調(diào)度管理等部分。這里要注意的是,為了布線方便,單片機端的 D0~ D7 是接到 LCD/ 602 的 D1~ D0,正好相反,因此在編寫軟件時需要做處理,使讀取正確。 其中, TC1602 第 4 腳 RS 為寄存器選擇,第 5 腳 RW 為讀寫信號線,第 6 腳 E 為使能端。液晶顯示屏有微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧、使用方便等諸多優(yōu)點,與數(shù)碼管相比,顯得更專業(yè)、美觀。 15 LCD 顯示部分 本設(shè)計顯示部分采用字符型 TC1602 液晶顯示所測距離值。這里采用的主要元器件是是美國 Dallas 半導體公司生產(chǎn)的單總線數(shù)字溫度傳感器DS18B20,其具有精度高、智能化、體積小、線路簡單等特點。本課題讓單片機 經(jīng)此芯片提升驅(qū)動能力從而控制數(shù)碼管的位選,實現(xiàn)數(shù)據(jù)動態(tài)掃描輸出。其引腳如圖 37 所示,其內(nèi)部含七對達林頓放大管,其主要功能 :當輸入為高電平時,輸出為低電平 。其功能表,如表 31 所示。 13P 1. 0/ T 21P 1. 1/ T 2E X2P 1. 2/ E C I3P 1. 3/ C E X 04P 1. 4/ C E X 15P 1. 5/ C E X 26P 1. 6/ C E X 37P 1. 7/ C E X 48R S T9P 3. 0/ R xD10P 3. 1/ T xD11P 3. 2/ I N T 012P 3. 3/ I N T 113P 3. 4/ T 014P 3. 5/ T 115P 3. 6/ W R16P 3. 7/ R D17X T A L 218X T A L 119V S S20P 2. 0/ A 8P 2. 1/ A 9P 2. 2/ A 10P 2. 3/ A 11P 2. 4/ A 12P 2. 5/ A 13P 2. 6/ A 14P 2. 7/ A 15P S E N29A L E / P R O G30E A / V P P31P 0. 7/ A D 732P 0. 6/ A D 633P 0. 5/ A D 534P 0. 4/ A D 435P 0. 3/ A D 336P 0. 2/ A D 237P 0. 1/ A D 138P 0. 0/ A D 039V C C40A T 89 S 51I N 11I N 22I N 33I N 44I N 55I N 66I N 77O U T 116O U T 314O U T 413O U T 512O U T 611O U T 710O U T 215C O M9GND8U L N 20 03 AOE1C L K11D02O019D13O118D24O217D35O316D46O415D57O514D68O613D79O712V C C20GND1074 A C Q 57 4P C12X T A LC3C21KR1C1V C CV C CKfgedKcDPbaD py R e d C CKfgedKcDPbaD py R e d C CKfgedKcDPbaD py R e d C CV C CV C C12345678161514131211109R e s P a c k 4V C CY1Y2Y3Y1 Y2 Y3X2X3X4X5X6X7X8X1X2X3X4X5X6X7X8X1X2X3X4X5X6X7X8X1X2X3X4X5X6X7X8X1 圖 35 顯示部分電路圖 針對以上 3 個問題,實際考慮節(jié)約單片機的接口資源以及減少硬件芯片成本投入,本單元電路設(shè)計如圖 35 所示, 采用 3 位共陰極數(shù)碼顯示管,顯示字符由單片機 P2 口送 14至鎖存器 74HC574 鎖存,再經(jīng)顯示驅(qū)動芯片 ULN2O03 驅(qū)動數(shù)碼管顯示, 分別控制每一位的動態(tài)顯示。但要求占用很多 I/O接