这个单片机怎么操作 求高手赐教

单片机的停电数据保存 论文开题报告!求高手赐教!高分求救!!_百度知道
单片机的停电数据保存 论文开题报告!求高手赐教!高分求救!!
快了,25之前,兄弟写过?帮个忙哦。
我有更好的答案
使用一个纽扣电池可以解决问题啊。
采纳率:21%
为您推荐:
其他类似问题
开题报告的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。跪求单片机高手帮助我解决一个问题!_百度知道
跪求单片机高手帮助我解决一个问题!
10K的都不行,我打开器件属性也没有说明,请高手赐教该用多少欧姆的排阻,2K,5K,所以我不知道这个电路图中的respack-08到底是多少欧姆的排阻我正在做一个温度报警器,用Proteus仿真的时候这是电路图(从网上下载的)但是电路图中有个respack-08的排阻,但是没有标阻值,我想利用电阻来代替,但是用100R,1K
我有更好的答案
1K的,分别接8个IO口。如果这样做,建议先试试5,一端接IO。8个都要这么接你是用8个电阻来做的吗?电阻的一个端接正电源
采纳率:37%
机械工业出版社有本新书《单片机接口技术实用宝典》,很不错的,你会很有参考价值。
不知道你是怎么加,那个排阻是用来做上拉用的,增强I/O口的驱动能力及抗干扰.一般是5.1K,在模拟的时候你可以不用接电阻,如果一定要接的话一共是8个5.1k电阻一头接5VCC一头接I/O口就好了,我以前接过,那个排阻旁那条粗线是总线的意思,一共有11条线
那个是P0口的上拉电阻,一般取值为10K的
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。求高手赐教stc89C51 超声波测距 P0.0口输出高电平 悬赏100M|我爱单片机 - 数码之家
查看完整版本: [--
赞助商链接
[attachment=2028640] 手里有个这东西,想用它和51做个测距的开闭点变化,手里有5v继电器,想的是这货测控距离是2cm-200cm初步方案预想是 测距大于1.5米 p0.0输出高电平&&持续 直到测距小于0.7cm p0.0口恢复低电平,等待再次测距大于1.5m
应该很简单,吧,有点c基础&&预想是#include&52.h&main(){float a=超声波测距距离;if a&1.5 &a&0.7,p0.0==1;else p0.0==0}不知大概是这意思么,想要无限循环程序,求高手指点厚颜当当伸手党呢,高手搞定 下载ok奖励100M&&银行到帐&&信誉保障
赞助商链接
#include&52.h&float 超声波测距距离();main(){while(1){float a=超声波测距距离();if ((a&1.5) && (a&0.7))&&&&p0.0==1;else &&&&p0.0==0}}float 超声波测距距离(){&&&&//这里面应该写测距子程序}大致写了一下结构,难点应该在测距子程序上。不知道你有没有现成的程序。
赞助商链接
可以改改用来检测水位,控制水泵
模块工作原理(1)采用IO触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;模块使用方法一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了下面是这在网上找的程序,希望对你有助帮,因为这个我也没有用过。 //晶振=8M//MCU=STC10F04XE//P0.0-P0.6共阳数码管引脚//Trig = P1^0//Echo = P3^2#include &reg52.h&&&&& //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint&&unsigned int#define ulong unsigned long//***********************************************sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频&&&&&&&&&&&&&&&&&&&& //为STC单片机的IO口设置地址定义sfr&&P0M1&& = 0X93;sfr&&P0M0&& = 0X94;sfr&&P1M1&& = 0X91;sfr&&P1M0&& = 0X92;sfr&&&&P2M1&& = 0X95;sfr&&&&P2M0&& = 0X96;//***********************************************sbit Trig = P1^0; //产生脉冲引脚sbit Echo = P3^2; //回波引脚sbit test = P1^1; //测试用引脚 uchar codeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9uint distance[4];&&//测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i;&&//自定义寄存器bit succeed_&&//测量成功标志//********函数声明void conversion(uint temp_data);void delay_20us();//void pai_xu(); void main(void)&& // 主程序{ uint distance_data,a,b;&&uchar CONT_1;&& &&CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)&&&&P0M1 = 0;&& //将io口设置为推挽输出&&&&P1M1 = 0;&&&&P2M1 = 0;&&&&P0M0 = 0XFF;&&&&P1M0 = 0XFF;&&&&P2M0 = 0XFF;&&i=0;&&flag=0;&&&&&&&& test=0;&&&&&&&& Trig=0;&&&&&& //首先拉低脉冲输入引脚&&&&&&&& TMOD=0x11;&&&&//定时器0,定时器1,16位工作方式&&&&&&&& TR0=1;&&&&&&&& //启动定时器0&&IT0=0;&&&&&&&&//由高电平变低电平,触发外部中断&&&&&&&& ET0=1;&&&&&&&&//打开定时器0中断 //ET1=1;&&&&&& //打开定时器1中断&&&&&&&& EX0=0;&&&&&&&&//关闭外部中断&&&&&&&& EA=1;&&&&&&&& //打开总中断0&& &&&&&&&&&& while(1)&&&&&&&& //程序循环&&&&&&&& { EA=0;&&&&&&&&&&&&&&Trig=1;&&&&&& delay_20us();&&&&&& Trig=0;&&&&&&&& //产生一个20us的脉冲,在Trig引脚&&&&&&&& while(Echo==0); //等待Echo回波引脚变高电平&&&&&&&&&&&&&&succeed_flag=0; //清测量成功标志&&&&&&&&&&&&&&EX0=1;&&&&&&&&&&//打开外部中断&&&&&&&&&&&&&&&&&& TH1=0;&&&&&&&&&&//定时器1清零&&&&&& TL1=0;&&&&&&&&&&//定时器1清零&&&&&&&&&&&&&&TF1=0;&&&&&&&&&&//&&&&&& TR1=1;&&&&&&&&&&//启动定时器1&&EA=1; &&&& while(TH1 & 30);//等待测量的结果,周期65.535毫秒(可用中断实现)&&&&&&&&&&&&&&&&&&&&&& TR1=0;&&&&&&&&&&//关闭定时器1&&&&&& EX0=0;&&&&&&&&&&//关闭外部中断 && if(succeed_flag==1)&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&distance_data=outcomeH;&&&&&&&&&&&&&&&&//测量结果的高8位&&&&&&&&&&distance_data&&=8;&&&&&&&&&&&&&&&&&& //放入16位的高8位&&&&&&&&&&&&&&&&&&&&&&&&distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据&&&&&&&&&& distance_data*=12;&&&&&&&&&&&&&&&& //因为定时器默认为12分频&&&&&&&&&&distance_data/=58;&&&&&&&&&&&&&&&&&&//微秒的单位除以58等于厘米&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //为什么除以58等于厘米,&&Y米=(X秒*344)/2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 && if(succeed_flag==0)&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&& distance_data=0;&&&&&&&&&&&&&&&&&& //没有回波则清零&&&&&&&&&&&&&&&&&&&&&&&&test= !&&&&&&&&&&&&&&&&&&&&&& //测试灯变化&&&&&&&&&&} &&&&///&&&&&&distance=distance_ //将测量结果的数据放入缓冲区&&&&///&&&&&&&&i++;&&&&&&&& ///&&&&&&&&&&if(i==3)&&&&&&&&&& ///&&&&&&&&&&&&&&{&&&&&&&&&& ///&&&&&&&&&&&&&& distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;&&&&///&&&&&&&&pai_xu();&&&&///&&&&&&&&distance_data=distance[1]; &&&& &&&&&&&&&&&&a=distance_&&&&&&if(b==a) CONT_1=0;&&&&&&if(b!=a) CONT_1++;&&&&&&if(CONT_1&=3)&&&&&&&&&&&&&&&&&&&&&&{ CONT_1=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&b=a;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&conversion(b);&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&& &&&&&&&&&& ///&&&&&&&&&&&&&&&& i=0;&&&&&&&& ///&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&}}//***************************************************************//外部中断0,用做判断回波电平INTO_() interrupt 0&& // 外部中断是0号 {&&&&&&&&outcomeH =TH1;&&&&//取出定时器的值&&&&outcomeL =TL1;&&&&//取出定时器的值&&&&succeed_flag=1;&& //至成功测量的标志&&&&EX0=0;&&&&&&&&&&&&//关闭外部中断&&}//****************************************************************//定时器0中断,用做显示timer0() interrupt 1&&// 定时器0中断是1号&& {&&&&&&&& TH0=0 //写入定时器0初始值&&&&&&&&&&TL0=0x77;&&&&&&&&&&&&&&&&&&&&&&switch(flag)&&&&&& {case 0x00:P0= P2=0flag++;&&&&&&&&&&&& case 0x01:P0=P2=0flag++;&&&&&&&&&&&& case 0x02:P0=P2=0flag=0;&&&& }&& }//*****************************************************************/*//定时器1中断,用做超声波测距计时timer1() interrupt 3&&// 定时器0中断是1号&&&&{TH1=0;TL1=0;&&&&}*///******************************************************************//显示数据转换程序void conversion(uint temp_data)&& {&&&& uchar ge_data,shi_data,bai_&& bai_data=temp_data/100 ;&& temp_data=temp_data%100;&& //取余运算&& shi_data=temp_data/10 ;&& temp_data=temp_data%10;&& //取余运算&& ge_data=temp_ && bai_data=SEG7[bai_data];&& shi_data=SEG7[shi_data];&& ge_data =SEG7[ge_data]; && EA=0;&& bai = bai_&& shi = shi_&& ge&&= ge_ &&&&&&&&&&EA=1; }//******************************************************************void delay_20us() {&&&& for(bt=0;bt&100;bt++); }/*void pai_xu() {&&&&if(distance[0]&distance[1])&& {t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值 if(distance[0]&distance[2])&& {t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值 if(distance[1]&distance[2])&& {t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值&&&&&&}*/
这个程序卖家给发过,没看懂
这都被你猜到了
这种不带温度补偿的模块就是便宜,但精度不好,用那种带温度补偿的,可以串口接收简单了很多
要求 精度不要太高,硬件方面基本完成了,卡在程序上啊
下面的程序是我刚改过的,keil编译通过,但没有实际跑过,可能会有点问题,你自己试一下吧。还有不知道你用哪个单片机,如果不是这个型号你需要改一下硬件。distance为最终结果变量,单位是米。程序是一直循环的。//晶振=8M//MCU=STC10F04XE//P0.0-P0.6共阳数码管引脚//Trig&&= P1^0//Echo&&= P3^2 (外部中断0)#include &reg52.h&&&&& //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint&&unsigned int#define ulong unsigned long//***********************************************sfr&&CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频//***********************************************sbit Trig&&= P1^0; //产生脉冲引脚sbit Echo&&= P3^2; //回波引脚sbit test&&= P0^0; //测试用引脚&&//距离结果(米)uchar outcomeH,outcomeL;&&//自定义寄存器bit succeed_&&//测量成功标志//********函数声明void delay_20us();void main(void)&& // 主程序{&&&& ulong distance_&& CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)&&&&&& &&&&Trig=0;&&&&&& //首先拉低脉冲输入引脚&&&&TMOD=0x11;&&&&//定时器0,定时器1,16位工作方式&&&& IT0=0;&&&&&&&&//由高电平变低电平,触发外部中断&&&&ET0=1;&&&&&&&&//打开定时器0中断&&&&//ET1=1;&&&&&&&&//打开定时器1中断&&&&EX0=0;&&&&&&&&//关闭外部中断&&&&EA=1;&&&&&&&& //打开总中断0&&&&&&&&&&while(1)&&&&&&&& //程序循环&&&&{&&&&&&&&&&EA=0;&&&&&&&&Trig=1;&&&&&&&&delay_20us();&&&&&&&&Trig=0;&&&&&&&& //产生一个20us的脉冲,在Trig引脚&&&&&&&&&&while(Echo==0); //等待Echo回波引脚变高电平(跳出后等待变为低电平)&&&&&&&&succeed_flag=0; //清测量成功标志&&&&&&&&EX0=1;&&&&&&&&&&//打开外部中断(Echo为低电平时外部中断被触发)&&&&&&&& TH1=0;&&&&&&&&&&//定时器1清零&&&&&&&&TL1=0;&&&&&&&&&&//定时器1清零&&&&&&&&TF1=0;&&&&&&&&&&//&&&&&&&&TR1=1;&&&&&&&&&&//启动定时器1&&&&&&&&&& EA=1;&&&&&&while(TH1 & 30);//等待测量的结果,周期65.535毫秒(可用中断实现)&&&&&&&&&&TR1=0;&&&&&&&&&&//关闭定时器1&&&&&&&&EX0=0;&&&&&&&&&&//关闭外部中断&&&&if(succeed_flag==1)&&&&&&&& {&&&& &&&&&&&&&& distance_data=outcomeH;&&&&&&&&&&&&&&&&//测量结果的高8位&&&&&&&&&& distance_data&&=8;&&&&&&&&&&&&&&&&&&&& //放入16位的高8位&&&&&&&&&& distance_data=distance_data|outcomeL;&&//与低8位合并成为16位结果数据&&&&&&&&&& distance_data*=12;&&&&&&&&&&&&&&&&&&&& //因为定时器默认为12分频&&&&&&&&&& distance_data/=58;&&&&&&&&&&&&&&&&&&&& //微秒的单位除以58等于厘米&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//为什么除以58等于厘米,&&Y米=(X秒*344)/2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58&&&&&&&&&& distance=distance_data/100;&&&&&&&&&&&&&&//除100将结果转为米&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&//@@@@@@@@@@@@@@@@@@@@@@@你的判断@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&//下面是1.5米~0.7米,你贴上写的是0.7厘米,可能是写错了。&&&&//因为你上面又写量程是2厘米~2米&&&&//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&if ((distance&1.5) && (distance&0.7))&&&&test=1;&&&&else &&&&test=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&& &&&& }}//***************************************************************//外部中断0,用做判断回波电平INTO_()&&interrupt 0&& // 外部中断是0号 {&&&&&&&& outcomeH =TH1;&&&&//取出定时器的值&&&& outcomeL =TL1;&&&&//取出定时器的值&&&& succeed_flag=1;&& //至成功测量的标志&&&& EX0=0;&&&&&&&&&&&&//关闭外部中断&&}//*****************************************************************/*//定时器1中断,用做超声波测距计时timer1() interrupt 3&&// 定时器0中断是1号&&&&{TH1=0;TL1=0;&&&& }*///******************************************************************//******************************************************************void delay_20us() {&&&&&&for(bt=0;bt&100;bt++); }
终于等到高手了,大神我的单片机是stc89c51救世主啊!!!!!!!!看着程序貌似没啥问题,M币已到帐
呵呵。你先试一下,有什么问题提出来,看我能不能帮你。这个东西我也没用过,共同学习吧。呵呵
看了下程序 发现逻辑上有点问题 测距&1.5 && 测距&0.7 很矛盾啊,预想是大于1.5米后变高电平直到小于0.7米后变低电平,为了设置个缓冲量防止接触器频繁启动的,发现我这么写很矛盾,刚才试了一下去掉&0.7这句,保留了&1.5这句,测距后p0.0口的测试灯有变化了,不过怎么看怎么像是&15cm。大神有什么高招么,还有我的mcu是stc89c51晶振是12m的,要改下哪里啊。
还有就是明显 p0.0口的测试灯 在p0.0==0的时候还是会闪烁,是不是采样率太低了&&还是什么啊
赋值时不这么写 “p0.0==0” ,一个等号 “p0.0=0”你的晶振12M,程序是8M的晶振,明显不符。把这句“CLK_DIV=0X03;”去掉 ,因为89c51没有分频功能。时间计算那还要改,我要下班了,明天帮你改吧。你得把定时器1的中断打开,因为可能要计满两个字节的数。
if ((a&1.5) && (a&0.7))&&&&p0.0=1;else &&&&p0.0=0}
&测距大于1.5米 p0.0输出高电平&&持续 直到测距小于0.7米 p0.0口恢复低电平,等待再次测距大于1.5m&if(a&1.5)&& p0.0=1;if(a&0.7)&& p0.0=0;应该是这样吧,还真没注意这里.就是大于1.5就为1,小于0.7就为0.
不知道你调的怎么样了?早上来又重新改了一遍,试下这个:/*模块工作原理(1)采用IO触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;模块使用方法一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了*///晶振=12M//MCU=STC89c51 //Trig&&= P1^0//Echo&&= P3^2 (外部中断0)#include &reg52.h&&&&& //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint&&unsigned int#define ulong unsigned long//***********************************************sfr&&CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频//***********************************************sbit Trig&&= P1^0; //产生脉冲引脚sbit Echo&&= P3^2; //回波引脚sbit test&&= P0^0; //测试用引脚&&//距离结果(米)uchar outcomeH,outcomeL,turn=0;&&//自定义寄存器bit succeed_&&//测量成功标志//********函数声明void delay_20us();void main(void)&& // 主程序{&&&& float distance_&& //CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)&&&&&& &&&&Trig=0;&&&&&& //首先拉低脉冲输入引脚&&&&TMOD=0x91;&&&&//定时器1,16位工作方式,INT0高电平开始计数&&&&TR1=0;&&&&&&&&//关闭定时器1&&&& IT0=0;&&&&&&&&//由高电平变低电平,触发外部中断&&&&//ET0=1;&&&&&&&&//打开定时器0中断&&&&ET1=1;&&&&&&&&//打开定时器1中断&&&&EX0=0;&&&&&&&&//关闭外部中断&&&&EA=1;&&&&&&&& //打开总中断 &&&&&&while(1)&&&&&&&& //程序循环&&&&{&&&&&&&&&&EA=0;&&&&&&&&&&&&//关闭总中断&&&&&&&&turn=0;&&&&&&&& //定时器1溢出次数&&&&&&&&Trig=1;&&&&&&&&delay_20us();&&&&&&&&Trig=0;&&&&&&&& //产生一个20us的脉冲,在Trig引脚 &&&&&&&&TF1=0;&&&&&&&&&&//清定时器中断标志 &&&&&&&&TH1=0;&&&&&&&&&&//定时器1清零&&&&&&&&TL1=0;&&&&&&&&&&//定时器1清零&&&&&&&&TR1=1;&&&&&&&&&&//启动定时器1&&&&&&&&while(Echo==0); //等待Echo回波引脚变高电平(跳出后等待变为低电平)&&&&&&&&succeed_flag=0; //清测量成功标志&&&&&&&&EX0=1;&&&&&&&&&&//打开外部中断(Echo为低电平时外部中断被触发)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& EA=1;&&&&&&&&&&&&//打开总中断&&&&&&&&while(Echo==1); //等待变为低电平&&&&&&&&TR1=0;&&&&&&&&&&//关闭定时器1&&&&&&&&EX0=0;&&&&&&&&&&//关闭外部中断&&&&if(succeed_flag==1)&&&&&&&& {&&&& &&&&&&&&&& distance_data=outcomeH*256+outcomeL;&& //&&&&&&&&&&&&&&&& distance_data+=turn*0&&&&&&&&&&&&&&//测量结果US&&&&&&&&&& distance_data/=1000000;&&&&&&&&&&&&&&&&&&//测量结果S&&&&&&&&&& distance=(distance_data*340)/2;&&&&&&&&&&//实际距离&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&//@@@@@@@@@@@@@@@@@@@@@@@你的判断@@@@@@@@@@@@@@@@@@@@@@@@@@@ &&&&//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&if (distance&1.5) &&&&test=1;&&&&if (distance&0.7) &&&&test=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&& &&&& }} //***************************************************************//外部中断0,用做判断回波电平INTO_()&&interrupt 0&& // 外部中断是0号 {&&&&&&&& outcomeH =TH1;&&&&//取出定时器的值&&&& outcomeL =TL1;&&&&//取出定时器的值&&&& succeed_flag=1;&& //至成功测量的标志&&&& EX0=0;&&&&&&&&&&&&//关闭外部中断&&&& TR1=0;&&}//***************************************************************** //定时器1中断,用做超声波测距计时timer1() interrupt 3&& &&&&{&&&&TH1=0;&&&&TL1=0;&&&&turn++;&&&& } //******************************************************************//******************************************************************void delay_20us() {&&&&&&for(bt=0;bt&100;bt++); }
今天白班&&看到程序了 非常感谢&&调试中
调试结果如下,p0.0口测试灯在0-70cm范围内亮 70-无穷&&不亮,&&p0口被我上拉了,所以改了这里&&&&if (distance&1.5) &&&&test=1;&&&&if (distance&0.7) &&&&test=0;&&&&&& 改成&&&&if (distance&1.5) &&&&test=0;&&&&if (distance&0.7) &&&&test=1;本以为结果会反过来结果在0-70cm范围内闪烁,70cm-无穷 常量看来&&&&if (distance&1.5) &&&&test=1;&&&&if (distance&0.7) &&&&test=0;&&&&&&&&表达式本身 对原来的设计预想不符啊,设计是个水位计 把超声波探头放在水池边,检测水面高度,大于1.5m后,接触器吸合,小于0.7m后断开,但是预想是在一个周期内水位上升至小于1.5m后但是不小于0.7m是不断开的,但是在小于过0.7m后水位下降的过程中,直到大于1.5,m前是不吸合的,很蛋疼啊&&&&&&
这种情况还是先确定测距程序是不是正确的,先把测距弄好,判断这是小问题。我看你说的意思说是控制水池的水位吧?“但是预想是在一个周期内水位上升至小于1.5m后但是不小于0.7m是不断开的,但是在小于过0.7m后水位下降的过程中,直到大于1.5,m前是不吸合的,”这句有点晕没看懂,呵呵。
我们这循环水池的水是被循环泵抽走的,需要另一个污水泵补充进来,人工看着的,平均1小时补一次,因为上测有溢流口,不能补满需要人看着,做这个自动是为了无人坚守,并且让泵不频繁启动,所以设定了水位低于水平面1.5m后抽水,直到距离水平面0.7m结束,但是补水结束后水位继续下降又会低于水平面0.7m,但是还没有低于水平面1.5m,这时候的测量值会与补水过程中(低于水平面1.5m后抽水,直到距离水平面0.7m结束)的重复,水位下降过程中这时接触器应该不吸合,水位上升过程中接触器还要吸合,测量的距离值是重复的(0.7&test&1.5),但是要求输出却是截然相反地,需要程序判断是补水中的(0.7&test&1.5)还是被抽水中的(0.7&test&1.5)。
我的理解:1、测距探头是安在水平面的。2、是这个”接触器“是控制“污水泵(补水)”的。而你P0.0要控制这个“接触器”。3、水位降到水平面1.5M以下“接触器”吸合,“污水泵”开始补水,等到水位在水平面0.7M以下时停止。如果我的理解是正确的话://****************************************************&&&&if (distance&1.5)&&//这句是判断是否到1.5M以下 && “接触器” 吸合;&&&&if (distance&=0.7) //这句是判断是否到0.7M&&&&“接触器”断开;//****************************************************所以这个判断当水位在0.7~1.5之间时是不符合条件的,不会有任合动作。也就是说:吸合后水位在1.5M以上,大于0.7,不会进入第二个条件,所以会继续吸合。当到达0.7或0.7以上(小于等于判断更准确些)进入第二个条件,断开,这时水位开始下降,可是不会进入到第一个判断,所以会继续断开。和你说的正好相符。不知道你的“接触器”是低电平吸合还是高电平吸合,你弄清楚。高电平吸合的话说是:&&if (distance&1.5) &&&&test=1;&&&&if (distance&=0.7) &&&&test=0;&&&&否则相反!如果还是不对的话,那就是测距程序还有问题,不能单单看这里。
弱弱的问一句,p0.0赋值为1后,如果不再次赋值,会一直保持么,我以为只会保持一个机器周期,若是等待再次赋值才会改变,就太好了,直接符合控制需求啊
[attachment=2033683]硬件部分完成
当然是一直保持了。。要是总是跳变的话那就是程序有问题。板子焊的不错!
感谢楼主和xuexjf ,学习一下,我挖坟了。
查看完整版本: [--
Powered by
Time 0.132497 second(s),query:5 Gzip enabled51单片机如何实现按键的长按与短按功能,尝试过很多方法都不行,请高手多赐教,多谢了(想是简单,做是难)_百度知道
51单片机如何实现按键的长按与短按功能,尝试过很多方法都不行,请高手多赐教,多谢了(想是简单,做是难)
我有更好的答案
就是简单的c语言判定就行了;延时一段时间,写过循环就行了 if(!ReadKey())&#47,《C程序设计语言》;//读取按键,判断有无按键按下去,没按键按下,这里返回0值是不进入这个函数的{
delay(x),实在看不了就看谭总写的那本c语言。给你写过伪代码,if(key=ReadKey())/&#47这个真心不难
采纳率:53%
给你个思路,按下以后进入一个循环,再定一个变量短按的时候是1如果按的时间久了就让变0这样判断这个变量就能判断它的1和0就知道是长按还是段按
设置一定时器,比如定时0.5s加一,再设置一个标志位,当加数达到一个标准值时,定时器定时改为更短时间。关键是设置定时器,标志位,在中端程序检验按键的电位。试过没
其他1条回答
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 单片机高手之路 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信