|
0.png (9.45 KB, 下載次數(shù): 100)
下載附件
2018-11-13 00:28 上傳
0.png (56.63 KB, 下載次數(shù): 115)
下載附件
2018-11-13 00:28 上傳
單片機(jī)源程序如下:
- /***********************************************************************************************************/
- //hc-sr04 超聲波測(cè)距模塊DEMO程序
- //晶振:11。0592
- //接線:模塊TRIG接 P0.2 ECH0 接P0.1
- //數(shù)碼管:共陽(yáng)數(shù)碼管P1接數(shù)據(jù)口,P2.5 P2.4 P2.3接選通數(shù)碼管
- /***********************************************************************************************************/
- #include <reg51.h> //器件配置文件
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- unsigned int time=0;
- unsigned int timer=0;
- unsigned char posit=0;
- unsigned long S=0,S1,S2;
- bit flag =0;
- sbit TX123=P3^4; //T
- sbit RX123=P3^5; //E
- sbit KJA=P3^6; //近距離存儲(chǔ)按鈕
- sbit KJAN=P3^7; //遠(yuǎn)距離存儲(chǔ)按鈕
- sbit S1J=P3^3; //近距離動(dòng)作繼電器
- sbit S2J=P3^2; //遠(yuǎn)距離動(dòng)作繼電器
-
- unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
- unsigned char const positon[3]={ 0xdf,0xef,0xf7};
- unsigned char disbuff[4]={ 0,0,0,0,};
- /******************定義命令字節(jié)******************/
- #define Read_COM 0x01 //字節(jié)讀數(shù)據(jù)命令
- #define Prog_COM 0x02 //字節(jié)編程數(shù)據(jù)命令
- #define Erase_COM 0x03 //扇區(qū)擦除數(shù)據(jù)命令
- #define En_Wait_TIME 0x81 //設(shè)置等待時(shí)間 ,并使能ISP/IAP
- #define Start_ADDRH 0x20 //扇區(qū)地址高位
- #define Start_ADDRL 0x00 //扇區(qū)地址低位
- /****************特殊功能寄存器聲明****************/
- sfr ISP_DATA = 0xe2;
- sfr ISP_ADDRH = 0xe3;
- sfr ISP_ADDRL = 0xe4;
- sfr ISP_CMD = 0xe5;
- sfr ISP_TRIG = 0xe6;
- sfr ISP_CONTR = 0xe7;
- /*****************關(guān)閉ISP&IAP功能*****************/
- void ISP_IAP_disable(void)
- {
- ISP_CONTR = 0x00;
- ISP_CMD = 0x00;
- ISP_TRIG = 0x00;
- }
- /*********************字節(jié)讀**********************/
- uchar Byte_read(uint byte_addr)
- {
- EA = 0; //關(guān)中斷
- ISP_CONTR = En_Wait_TIME; //開(kāi)啟ISP&IAP,并送等待時(shí)間
- ISP_CMD = Read_COM; //送字節(jié)讀命令字
- ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字節(jié)
- ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字節(jié)
- ISP_TRIG = 0x46; //送觸發(fā)命令字0x46
- ISP_TRIG = 0xB9; //送觸發(fā)命令字0xB9
- _nop_();
- ISP_IAP_disable(); //關(guān)閉ISP&IAP功能
- EA = 1; //開(kāi)中斷
- return (ISP_DATA);
- }
- /*********************字節(jié)編程*********************/
- void Byte_program(uint byte_addr,uchar isp_iap_data)
- {
- EA = 0; //關(guān)中斷
- ISP_CONTR = En_Wait_TIME; //開(kāi)啟ISP&IAP,并送等待時(shí)間
- ISP_CMD = Prog_COM; //送字節(jié)編程命令字
- ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字節(jié)
- ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字節(jié)
- ISP_DATA = isp_iap_data; //送數(shù)據(jù)進(jìn)ISP_DATA
- ISP_TRIG = 0x46; //送觸發(fā)命令字0x46
- ISP_TRIG = 0xB9; //送觸發(fā)命令字0xB9
- _nop_();
- ISP_IAP_disable(); //關(guān)閉ISP&IAP功能
- EA = 1; //開(kāi)中斷
- }
-
- /*********************扇區(qū)擦除*********************/
- void Sector_erase(uint sector_addr)
- {
- EA = 0; //關(guān)中斷
- ISP_CONTR = En_Wait_TIME; //開(kāi)啟ISP&IAP;并送等待時(shí)間
- ISP_CMD = Erase_COM; //送扇區(qū)擦除命令字
- ISP_ADDRH = (uchar)(sector_addr >> 8); //送地址高字節(jié)
- ISP_ADDRL = (uchar)(sector_addr & 0X00FF); //送地址低字節(jié)
- ISP_TRIG = 0X46; //送觸發(fā)命令字0x46
- ISP_TRIG = 0XB9; //送觸發(fā)命令字0xB9
- _nop_();
- ISP_IAP_disable(); //關(guān)閉ISP&IAP功能
- EA = 1;
- }
- /********************************************************/
- void Display(void) //掃描數(shù)碼管
- {
- if(posit==0)
- {P1=(discode[disbuff[posit]])&0x7f;}
- else
- {P2=discode[disbuff[2]];
- P0=discode[disbuff[1]];}
- if(++posit>=3)
- posit=0;
- }
- /********************************************************/
- void Conut(void)
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
-
- S=(time*1.7)/100; //算出來(lái)是CM
- if((S>=250)||flag==1) //超出測(cè)量范圍顯示“-”
- {
- flag=0;
- S=250;
- }
- else
- {
- disbuff[0]=S%1000/100;
- disbuff[1]=S%1000%100/10;
- disbuff[2]=S%1000%10 %10;
- }
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
- {
- flag=1; //中斷溢出標(biāo)志
- }
- /********************************************************/
- void zd3() interrupt 3 //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
- {
- TH1=0xfc;
- TL1=0x30;
- Display();
- timer++;
- if(timer>=400) //調(diào)節(jié)測(cè)速頻率
- {
- timer=0;
- TX123=1; //800MS 啟動(dòng)一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- TX123=0;
- }
- }
- /*****************************************************************************
- * 延時(shí)子程序 *
- * *
- ******************************************************************************/
- void delay(unsigned int ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i < 120; i++);
- }
- }
- /*********************************************************/
- void main( void )
- {
- S1J=0;
- delay(1000);
- S1J=1;
- TMOD=0x11; //設(shè)T0為方式1,GATE=1;
- TH0=0;
- TL0=0;
- TH1=0xf8; //2MS定時(shí)
- TL1=0x30;
- ET0=1; //允許T0中斷
- ET1=1; //允許T1中斷
- TR1=1; //開(kāi)啟定時(shí)器
- EA=1; //開(kāi)啟總中斷
-
- S1=Byte_read(0x2000);
- S2=Byte_read(0x2200); //讀EEPROM
- disbuff[0]=S1%1000/100;
- disbuff[1]=S1%1000%100/10;
- disbuff[2]=S1%1000%10 %10;
- Display();
- delay(1000);
- disbuff[0]=S2%1000/100;
- disbuff[1]=S2%1000%100/10;
- disbuff[2]=S2%1000%10 %10;
- Display();
- delay(1000);
- while(1)
- {
- while(!RX123); //當(dāng)RX為零時(shí)等待
- TR0=1; //開(kāi)啟計(jì)數(shù)
- while(RX123); //當(dāng)RX為1計(jì)數(shù)并等待
- TR0=0; //關(guān)閉計(jì)數(shù)
- Conut(); //計(jì)算
- if(!KJA){Sector_erase(0x2000); //扇區(qū)擦除
- Byte_program(0x2000,S); //寫(xiě)EEPROM
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- S1=Byte_read(0x2000); }
- if(!KJAN){Sector_erase(0x2200); //扇區(qū)擦除
- Byte_program(0x2200,S); //寫(xiě)EEPROM
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- S2=Byte_read(0x2200); }
- if(S>=S1)S1J=0;
- else S1J=1;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
|
-
-
超聲波測(cè)距工程用.rar
2018-11-12 15:38 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
131.29 KB, 下載次數(shù): , 下載積分: 黑幣 -5
|