仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h> //包括一个52标准内核的头文件
- #include<intrins.h> //包含_nop_()函数定义的头文件
- #define uchar unsigned char //定义一下方便使用
- #define uint unsigned int
- #define ulong unsigned long
- #define RdCommand 0x01 //定义ISP的操作命令
- #define PrgCommand 0x02
- #define EraseCommand 0x03
- #define Error 1
- #define Ok 0
- #define WaitTime 0x01 //定义CPU的等待时间
- sfr ISP_DATA=0xe2; //寄存器申明
- sfr ISP_ADDRH=0xe3;
- sfr ISP_ADDRL=0xe4;
- sfr ISP_CMD=0xe5;
- sfr ISP_TRIG=0xe6;
- sfr ISP_CONTR=0xe7;
- char a_a;
- sbit key1=P1^1;//参数加
- sbit key3=P1^2;//参数减
- sbit key2=P1^0;//参数设置按键
- sbit DQ=P3^3;
- sbit LED=P2^7;
- sbit alarm=P3^4;//蜂鸣器管脚定义
- sbit TX=P3^5; //超声波模块管脚定义(发射脉冲引脚定义)
- sbit RX=P3^6; //超声波模块管脚定义 (回波引脚定义)
- sbit RS=P2^0; //液晶寄存器选择位,将RS位定义为P2.0引脚
- sbit RW=P2^1; //液晶读写选择位,将RW位定义为P2.1引脚
- sbit E=P2^2; //液晶使能信号位,将E位定义为P2.2引脚
- sbit BF=P0^7; //液晶忙碌标志位,,将BF位定义为P0.7引脚
- unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
- uint time=0,timer=0,S=0;
- uchar menu;//参数调整液晶显示参数
- uchar ge,shi,bai,qian,flag; //距离数据转换
- uchar num1,num2;//上下限参数定义
- uchar H_bai,H_shi,H_ge;//上限参数值分解显示定义
- uchar L_bai,L_shi,L_ge;//下限参数值分解显示定义
- uint temp1,temp2;//上下限参数转换,用于报警值比较判断
- uchar time0; //设置全局变量,专门用于严格延时
- uchar TL; //储存暂存器的温度低位
- uchar TH; //储存暂存器的温度高位
- uchar TN; //储存温度的整数部分
- uchar TD; //储存温度的小数部分
- uchar WD_temp;
- /* ================ 打开 ISP,IAP 功能 ================= */
- void ISP_IAP_enable(void)
- {
- EA = 0; /* 关中断 */
- ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
- ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
- ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */
- }
- /* =============== 关闭 ISP,IAP 功能 ================== */
- void ISP_IAP_disable(void)
- {
- ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
- ISP_TRIG = 0x00;
- EA = 1; /* 开中断 */
- }
- /* ================ 公用的触发代码 ==================== */
- void ISPgoon(void)
- {
- ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */
- ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */
- ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */
- _nop_();
- }
- /* ==================== 字节读 ======================== */
- unsigned char byte_read(unsigned int byte_addr)
- {
- EA = 0;
- ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */
- ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
- ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */
- ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */
- ISPgoon(); /* 触发执行 */
- ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
- EA = 1;
- return (ISP_DATA); /* 返回读到的数据 */
- }
- /* ================== 扇区擦除 ======================== */
- void SectorErase(unsigned int sector_addr)
- {
- unsigned int iSectorAddr;
- iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
- ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
- ISP_ADDRL = 0x00;
- ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */
- ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */
- ISPgoon(); /* 触发执行 */
- ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
- }
- /* ==================== 字节写 ======================== */
- void byte_write(unsigned int byte_addr, unsigned char original_data)
- {
- EA = 0;
- ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */
- ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
- ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
- ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */
- ISP_DATA = original_data; /* 写入数据准备 */
- ISPgoon(); /* 触发执行 */
- ISP_IAP_disable(); /* 关闭IAP功能 */
- EA =1;
- }
- void write_eeprom() //内部eeprom写函数
- {
- SectorErase(0x2000); //清空
- SectorErase(0x2c00);
- SectorErase(0x2e00);
- byte_write(0x2c00,num1);
- byte_write(0x2c01,num2);
- byte_write(0x2060,0x01);
- }
- /******************把数据从单片机内部eeprom中读出来*****************/
- void read_eeprom()
- {
- num1=byte_read(0x2c00);
- num2=byte_read(0x2c01);
- a_a=byte_read(0x2060);
- }
- /**************开机自检eeprom初始化*****************/
- void init_eeprom()
- {
- a_a=byte_read(0x2060);
- if(a_a!=1) //新的单片机初始单片机内问eeprom
- {
- a_a=1;
- write_eeprom(); //保存数据
- }
- }
- //*****************I2C函数设置**********************//
- /*****************************************************
- 函数功能:将DS18B20传感器初始化,读取应答信号
- 出口参数:flag
- ***************************************************/
- bit Init_DS18B20(void)
- {
- bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
- DQ = 1; //先将数据线拉高
- for(time0=0;time0<2;time0++);//略微延时约6微秒
- DQ = 0; //再将数据线从高拉低,要求保持480~960us
- for(time0=0;time0<200;time0++) //略微延时约600微秒
- ; //以向DS18B20发出一持续480~960us的低电平复位脉冲
- DQ = 1; //释放数据线(将数据线拉高)
- for(time0=0;time0<10;time0++)
- ; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
- flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
- for(time0=0;time0<200;time0++) //延时足够长时间,等待存在脉冲输出完毕
- ;
- return (flag); //返回检测成功标志
- }
- /*****************************************************
- 函数功能:从DS18B20读取一个字节数据
- 出口参数:dat
- ***************************************************/
- unsigned char ReadOneChar(void)
- {
- unsigned char i=0;
- unsigned char dat; //储存读出的一个字节数据
- for (i=0;i<8;i++)
- {
- DQ =1; // 先将数据线拉高
- _nop_(); //等待一个机器周期
- DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
- dat>>=1;
- _nop_(); //等待一个机器周期
- DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
- for(time0=0;time0<2;time0++); //延时约6us,使主机在15us内采样
- if(DQ==1)
- dat|=0x80; //如果读到的数据是1,则将1存入dat
- else
- dat|=0x00;//如果读到的数据是0,则将0存入dat
- //将单片机检测到的电平信号DQ存入r[i]
- for(time0=0;time0<8;time0++); //延时3us,两个读时序之间必须有大于1us的恢复期
- }
- return(dat); //返回读出的十进制数据
- }
- /*****************************************************
- 函数功能:向DS18B20写入一个字节数据
- 入口参数:dat
- ***************************************************/
- WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=0; i<8; i++)
- {
- DQ =1; // 先将数据线拉高
- _nop_(); //等待一个机器周期
- DQ=0; //将数据线从高拉低时即启动写时序
- DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,
- //并将其送到数据线上等待DS18B20采样
- for(time0=0;time0<10;time0++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
- DQ=1; //释放数据线
- for(time0=0;time0<1;time0++);//延时3us,两个写时序间至少需要1us的恢复期
- dat>>=1; //将dat中的各二进制位数据右移1位
- }
- for(time0=0;time0<4;time0++); //稍作延时,给硬件一点反应时间
- }
- //液晶函数设置************************************/
- /*****************************************************
- 函数功能:延时1ms
- (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
- ***************************************************/
- void delay1ms()
- {
- unsigned char i,j;
- for(i=0;i<10;i++)
- for(j=0;j<33;j++)
- ;
- }
- /*****************************************************
- 函数功能:延时若干毫秒
- 入口参数:n
- ***************************************************/
- void delay(unsigned char n)
- {
- unsigned char i;
- for(i=0;i<n;i++)
- delay1ms();
- }
- /*****************************************************
- 函数功能:判断液晶模块的忙碌状态
- 返回值:result。result=1,忙碌;result=0,不忙
- ***************************************************/
- unsigned char BusyTest(void)
- {
- bit result;
- RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
- RW=1;
- E=1; //E=1,才允许读写
- _nop_(); //空操作
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- result=BF; //将忙碌标志电平赋给result
- E=0; //将E恢复低电平
- return result;
- }
- /*****************************************************
- 函数功能:将模式设置指令或显示地址写入液晶模块
- 入口参数:dictate
- ***************************************************/
- void WriteInstruction (unsigned char dictate)
- {
- while(BusyTest()==1); //如果忙就等待
- RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
- RW=0;
- E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
- // 就是让E从0到1发生正跳变,所以应先置"0"
- _nop_();
- _nop_(); //空操作两个机器周期,给硬件反应时间
- P0=dictate; //将数据送入P0口,即写入指令或地址
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=1; //E置高电平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
- }
- /*****************************************************
- 函数功能:指定字符显示的实际地址
- 入口参数:x
- ***************************************************/
- void WriteAddress(unsigned char x)
- {
- WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
- }
- /*****************************************************
- 函数功能:将数据(字符的标准ASCII码)写入液晶模块
- 入口参数:y(为字符常量)
- ***************************************************/
- void WriteData(unsigned char y)
- {
- while(BusyTest()==1);
- RS=1; //RS为高电平,RW为低电平时,可以写入数据
- RW=0;
- E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
- // 就是让E从0到1发生正跳变,所以应先置"0"
- P0=y; //将数据送入P0口,即将数据写入液晶模块
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=1; //E置高电平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
- }
- /*****************************************************
- 函数功能:对LCD的显示模式进行初始化设置
- ***************************************************/
- void LcdInitiate(void)
- {
- delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
- WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
- delay(5); //延时5ms ,给硬件一点反应时间
- WriteInstruction(0x38);
- delay(5);
- WriteInstruction(0x38); //连续三次,确保初始化成功
- delay(5);
- WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
- delay(5);
- WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
- delay(5);
- WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
- delay(5);
- WriteAddress(0);//从第一行开始显示
- WriteData('J'); //将万位数字的字符常量写入LCD
- WriteData('L'); //将万位数字的字符常量写入LCD
- WriteData(':'); //将万位数字的字符常量写入LCD
- WriteAddress(7);//从第一行开始显示
- WriteData('C'); //将万位数字的字符常量写入LCD
- WriteData('M'); //将万位数字的字符常量写入LCD
- WriteAddress(0x40);
- WriteData('H');
- WriteData(':');
- WriteAddress(0x40+5);
- WriteData('C');
- WriteData('M');
- WriteAddress(0x40+9);
- WriteData('L');
- WriteData(':');
- WriteAddress(0x40+14);
- WriteData('C');
- WriteData('M');
- WriteAddress(15);
- WriteData(0xdf);
- }
- //假如温度25摄氏度时,声速位346m/s
- //时钟周期为T0=1/11.0592M,则机器周期为1/11.0592*12us=1.08us,定时器计时为time0(定时的数量就是时钟周期数)
- //实际时间t=time0*1.08
- //距离S=vt/2=v*time0*1.08/2/1000000=算出来的值是米
- void Conut(void)
- {
- float vv;
- time=TH0*256+TL0; //TH0左移8位后与TL0相加
- TH0=0;
- TL0=0;
- vv=(331.5+0.607*TN);//声速VV和声速TN的关系
- S=((time*vv*1/200)/10); //注意除以10相当于算出来的值单位毫米,*1.08是因为晶振11.0592,如果是12MHZ就是*1
- /*time=TH0*256+TL0; //TH0左移8位后与TL0相加
- TH0=0;
- TL0=0;
- S=((time*1.87)/10); //注意除以10相当于算出来的值单位毫米 */
- if((S>=4000)||(flag==1)) //超出测量范围(4米)
- {
- flag=0;
- qian=0;
- bai=0;
- shi=0;
- ge=0;
- delay(10);
- }
- else
- {
- qian=S/1000;
- bai=S%1000/100;
- shi=S%1000%100/10;
- ge=S%1000%10 %10;
- }
- }
- /*****************************************************
- 函数功能:显示温度的整数部分
- 入口参数:x
- ***************************************************/
- void display_temp1(unsigned char x)
- {
- unsigned char j,k,l; //j,k,l分别储存温度的百位、十位和个位
- j=x/100; //取百位
- k=(x%100)/10; //取十位
- l=x%10; //取个位
- WriteAddress(11); //写显示地址,将在第2行第7列开始显示
- //WriteData(digit[j]); //将百位数字的字符常量写入LCD
- WriteData(digit[k]); //将十位数字的字符常量写入LCD
- WriteData(digit[l]); //将个位数字的字符常量写入LCD
- delay(50); //延时1ms给硬件一点反应时间
- }
- /*****************************************************
- 函数功能:显示温度的小数数部分
- 入口参数:x
- ***************************************************/
- void display_temp2(unsigned char x)
- {
- WriteAddress(14); //写显示地址,将在第2行第11列开始显示
- WriteData(digit[x]); //将小数部分的第一位数字字符常量写入LCD
- delay(50); //延时1ms给硬件一点反应时间
- }
- /*****************************************************
- 函数功能:做好读温度的准备
- ***************************************************/
- void ReadyReadTemp(void)
- {
- Init_DS18B20(); //将DS18B20初始化
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- for(time=0;time<150;time++)
- ; //温度转换需要一点时间
- Init_DS18B20(); //将DS18B20初始化
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
- }
- void alarming()//蜂鸣器报警子函数
- {
- alarm=0;
- LED=0;
- delay(50);
- alarm=1;
- LED=1;
- delay(100);
- }
- /***************按键设置****************************/
- void key_shezhi()
- {
- if(key2==0)//如果上下限参数调整按键按下
- {
- delay(30);
- if(key2==0)
- {
- menu++;//设置页面调整
- if(menu>2)//如果设置完下限值后,液晶回归正常显示
- {
- menu=0;
- LcdInitiate();//更新初始化显示
- delay(20);//适当延时
- }
- }
- while(!key2);
- }
- if(menu==0)
- {
- ET0=1; //打开定时中断
- ET1=1;
- WriteAddress(3);
- WriteData(digit[qian]);//更新显示实时测距的距离
- delay(20);
- WriteData(digit[bai]);//更新显示实时测距的距离
- delay(20);
- WriteData(digit[shi]);//更新显示实时测距的距离
- delay(20);
- //WriteData('.');//增加一个小数点,用于毫米和厘米的切换指示
- //delay(20);
- //WriteData(digit[ge]); //更新显示实时测距的距离
- //delay(20);
- ET0=0; //关闭定时中断,执行温度读取
- ET1=0;
- ReadyReadTemp(); //读温度准备
- TL=ReadOneChar(); //先读的是温度值低位
- TH=ReadOneChar(); //接着读的是温度值高位
- TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
- //这样得出的是温度的整数部分,小数部分被丢弃了
- TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
- //这样得到的是温度小数部分的第一位数字(保留1位小数)
- if((TN==85)&&(WD_temp==0))//18B20芯片开电首次读取的温度是85,本程序避开85的问题
- {
- TN=0;
- }
- else if(TN!=85)
- {
- WD_temp=1;//开电首次85避开
- }
- ET0=1; //温度处理完后打开定时中断
- ET1=1;
- display_temp1(TN); //显示温度的整数部分
- display_temp2(TD); //显示温度的小数部分
- WriteAddress(13);
- WriteData('.');
- H_bai=num1/100;//更新显示调整后的上限值
- H_shi=num1%100/10;//更新显示调整后的上限值
- H_ge=num1%100%10; //更新显示调整后的上限值
- WriteAddress(0x40+2);//更新显示调整后的上限值
- WriteData(digit[H_bai]);//更新显示调整后的上限值
- WriteData(digit[H_shi]);//更新显示调整后的上限值
- WriteData(digit[H_ge]);//更新显示调整后的上限值
- L_bai=num2/100; //更新显示调整后的下限值
- L_shi=num2%100/10;//更新显示调整后的下限值
- L_ge=num2%100%10;//更新显示调整后的下限值
- WriteAddress(0x40+11);//更新显示调整后的下限值
- WriteData(digit[L_bai]); //更新显示调整后的下限值
- WriteData(digit[L_shi]);//更新显示调整后的下限值
- WriteData(digit[L_ge]); //更新显示调整后的下限值
- if(S>=temp1)//报警设置
- {
- alarming();//如果距离大于上限值报警
- }
- else if(S<temp2)
- {
- alarming();//如果距离小于下限值报警
- }
- else
- {
- alarm=1;//关闭报警
- }
- }
- if(menu==1)//切换液晶上限设置
- {
- ET0=0;//把定时中断暂时关闭
- ET1=0;
- if(key1==0)//加按键
- {
- delay(30);
- if(key1==0)
- {
- num1++;
- if(num1==400)//上限4米
- {
- num1=0;
- }
- if(num1<num2)//调整上限值得时候,上限值不能小于下限值
- {
- num1=num2;//否则等于下限值
- }
- }
- while(!key1);//等待按键释放
- }
- if(key3==0)//减按键
- {
- delay(30);
- if(key3==0)
- {
- if((num1>0)&&(num1>num2))//如果同时满足num1大于零和上限值大于下限值,可以减减
- {
- num1--;
- }
- }
- while(!key3);//等待按键释放
- }
- write_eeprom();
- delay(2);
- delay(2);
- H_bai=num1/100;//上限值转换用于液晶显示
- H_shi=num1%100/10;//上限值转换用于液晶显示
- H_ge=num1%100%10;//上限值转换用于液晶显示
-
- delay(20);//延时消除光标重影
- WriteAddress(0x40+2);//定位位置用于显示更新上限值
- WriteData(digit[H_bai]);//上限值更新显示
- WriteData(digit[H_shi]);//上限值更新显示
- WriteData(digit[H_ge]);//上限值更新显示
- WriteAddress(0x40+4);//移到上限值得个位数,用于光标显示
- WriteInstruction(0x0e);//光标显示,不闪烁
- }
- if(menu==2)//下限值调整设置
- {
- ET0=0;
- ET1=0;
- if(key1==0)
- {
- delay(30);
- if(key1==0)
- {
- if(num2<num1)
- {
- num2++;
- }
- }
- while(!key1);
- }
- if(key3==0)
- {
- delay(30);
- if(key3==0)
- {
- if((num1>=num2)&&(num2>0))
- {
- num2--;
- }
- }
- while(!key3);
-
- }
- write_eeprom();
- delay(2);
- L_bai=num2/100;
- L_shi=num2%100/10;
- L_ge=num2%100%10;
- delay(20);//延时消除光标重影
- WriteAddress(0x40+11);
- WriteData(digit[L_bai]);
- WriteData(digit[L_shi]);
- WriteData(digit[L_ge]);
- WriteAddress(0x40+13);//移到个位,光标闪烁
- WriteInstruction(0x0e);
- }
- }
- void main(void) // 主程序
- {
- LED=1;
- key1=1;//按键初始化
- key2=1;//按键初始化
- key3=1;//按键初始化
- TMOD=0x11; //设置定时器0和1工作方式为1(0001 0001)
- TH0=0; //装初值
- TL0=0; //装初值
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- ET1=1; //开定时器1中断
- TR1=1; //启动定时器1
- TX=0;
- RX=0;
- LcdInitiate(); //调用LCD初始化函数
- delay(10); //延时10ms,给硬件一点反应时间
- init_eeprom(); //初始化eeprom
- delay(10);
- read_eeprom(); //读取eeprom数据
- delay(10);
- while(1) //程序循环
- {
- key_shezhi(); //循环调用按键设置函数
- temp1=num1*10;//由于num1单位是厘米,S单位是毫米,要*10转换成统一单位进行比较,用于报警设置
- temp2=num2*10;
- }
- }
- void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
- {
- flag=1; //中断溢出标志
- }
- void zd3() interrupt 3 //T1中断
- {
- TH1=(65536-50000)/256; //重新装初值高8位 约0.05s
- TL1=(65536-50000)%256;//重新装初值低8位
- timer++;//
- if(timer>=5)//中断5次约0.25s
- {
- TR1=0; //关闭定时器1
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- timer=0;
- TX=1;//先吧TX拉高//给个高位脉冲
- _nop_();//延时
- _nop_();//延时
- _nop_();//延时
- _nop_();//延时
- _nop_();//延时
- _nop_();//延时
- _nop_();//延时
- _nop_();//延时
- _nop_();//延时
- _nop_();//延时
- TX=0; //拉低
- while(!RX); //当RX为零时等待
- TR0=1; //启动定时器0,开启计数
- while(RX); //当RX为1计数并等待
- TR0=0; //关闭定时器0 关闭计数//计时完毕
- Conut(); //调用距离计算函数,计算距离
- TR1=1; //启动定时器1
- }
- }
复制代码
所有资料51hei提供下载:
211 超声波测距仿真(温度补偿).zip
(420.11 KB, 下载次数: 74)
|