历史上的今天
今天是:2024年09月08日(星期日)
2020年09月08日 | 简易同位升降系统的单片机源码(用超声波测距实现)
2020-09-08 来源:51hei
/*******************************************************************/
/*******************超声波测距仪************************************/
/*******************(液晶屏显示)************************************/
/*******************晶振 11.0592MHz********************************/
#include #include "12864.h" #include typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */ typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */ typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */ //typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */ //typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */ //typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */ //定时器0的定时值为1mS,即11059/12=922个时钟脉冲,其补为65536-922=64614 #define SYSTEMCLK 921600 //11059200/12 #define T0CLK 921600 //11059200/12 #define T1CLK 921600 //11059200/12 #define T1PERIOD 1000000/921600 //T1周期时间,以微秒为单位,约为1.085uS #define TIMER0H 0xFC //64614/256=252 #define TIMER0L 0x66 //54447%256=102 //管脚定义 sbit Trig = P1^3; sbit Echo = P3^2; //回波必须接在外部中断引脚上 sbit Beep = P2^6; //报警蜂鸣器 sbit k1=P3^0; sbit k2=P3^1; sbit k3=P3^3; sbit k4=P3^4; sbit k5=P3^5; sbit k6=P2^5; sbit k7=P2^7; sbit hy=P1^1; unsigned char code tab[]="0123456789 :.%"; uint h=0,v=0; uint V1=0,s=0; uchar time1,puk1=100,k=1,w=0,m=0,puk=0; //定义标志 volatile bit FlagSucceed = 0; //测量成功标志 volatile bit FlagDisplay = 0; //显示标志 //定义全局变量 U16 DisplayCount=0; U32 time=0; U32 distance=0; //函数声明 void delay_20us(); void Start_Module(); void INT0_Init(void); void Data_Init(); void Timer0_Init(); void Timer1_Init(); //20us延时程序,不一定很准 void delay_20us() { U16 bt ; for(bt=0;bt<190;bt++); //8M晶振是100 } void delayms(uchar t) { uchar a,b; for(a=t;a>0;a--) for(b=110;b>0;b--); } void speak() { Beep=0; delayms(200); Beep=1; } //数据初始化 void Data_Init() { Trig = 0; distance = 0; DisplayCount = 0; } //外部中断初始化函数 void INT0_Init(void) { IT0 = 0; //负边沿触发中断 EX0=0; //关闭外部中断 } //外部中断处理用做判断回波电平 void INT0_ISR (void) interrupt 0 { time =TH1*256+TL1; //取出定时器的值 FlagSucceed = 1; //置成功测量的标志 if(s==1) V1=3*puk1; else V1=0; co_display (3,5,V1/100,V1%100/10,tab); EX0=0; //关闭外部中断 } /////////////初始化定时器/////////////////// void InitTimer0(void) { TMOD = 0x11; TH0=0xff; TL0=0xfe; EA = 1; ET0 = 1; TR0 = 1; } //////////////////PWM产生函数////////////////////////////// void Timer0Interrupt(void) interrupt 1 { TH0=0xff; TL0=0xfe; //从新赋值 time1++; if(time1 if((time1>=puk1)&&(time1<=100))pwm1=0; // 如果puk1到100的就是低电平 else if(time1>=100)time1=0; //time大于100就清0 } //定时器1初始化,16位计数模式,时钟为11059200/12=921600Hz //60ms计数为55296,即0xD800 void Timer1_Init() { TMOD = 0x11; //定时器0和1工作在16位方式 TH1 =0; TL1= 0; ET1 = 1; } //启动模块,Trig管脚20us正脉冲 void Start_Module() //启动模块 { Trig=1; //启动一次模块 delay_20us(); Trig=0; } /******************************************************************** * 名称 : Main() * 功能 : 主函数 ***********************************************************************/ void key() { if(k1==0||hy==0) { pwm(w); // puk1=puk; cn_display(1,6,0,"启"); s=1; } if(k2==0) { delay_20us(); delay_20us(); pwm(2); s=0; { if(k==1) cn_display(1,4,0,"伸"),w=1,k=0; else if(k==0) cn_display(1,4,0,"缩"),w=0,k=1; // else // cn_display(1,4,0,"停"),pwm(w),k=1; } } if(k3==0) { h++; if(h>=30) h=30; } if(k4==0) { h--; if(h==0) h=30; } if(k5==0) { v++; if(v>=30) v=30; } if(k6==0) { v--; if(v==0) v=30; } if(k7==0) { m++; if(m>6) m=0; } } void chaosheng() { EA= 0; //以下为一次检测过程:先发出Trig电平,打开外部中断,清零T1, //最后在外部中断下降沿触发时取出T1当前值,计算出Trig脉冲宽度。 while (Echo == 1) ; Start_Module(); while(Echo==0) ;//等待Echo回波引脚变高电平 FlagSucceed = 0; EX0=1; TH1= 0; TL1= 0; TF1= 0; TR1=1; //启动定时器1开始计数 EA = 1; while (TH1<83) ; //盲区 TR1 = 0 ; //关闭定时器1 EX0 = 0; //关闭外部中断 if(FlagSucceed==1) //一次测试成功,则计算距离,单位为厘米 { distance = time * 1.085 ; //计算得到脉冲时间(以微秒为单位) //将微秒时间转变成厘米距离的算法: Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 distance /=58; //如果距离小于20cm,则声光报警 distance*=10;
史海拾趣
|
在三星原驱动的基础上修改摄像头驱动(应用程序几乎没改,应用BSP原来所带的demo),修改了相应的设置后,图像出来后结果是花屏,好像是把屏幕分成4块(从左往右),颜色也对。 将摄像头设置为斑马线测试格式输出时,出现的也不对,相差很多。 有 ...… 查看全部问答> |
|
EBOOT下载到SDRAM DNW可以正常输出调试信息 用STEPLDR引导就出现乱码 麻烦帮忙看看 EBOOT下载到SDRAM DNW可以正常输出调试信息 用STEPLDR引导就出现乱码 附STEPLDR。NB1引导时DNW信息 Step ldr run to here //加的DEBUG 22222222 //加的DEBUG Microsoft Windows CE Bootloader Common ...… 查看全部问答> |
|
我还是个学生,超级菜鸟,因为老师的项目,刚接触到这个开发板,现在遇到这样问题:我在VS2005里面做WIN CE6.0的一个模拟器,我从论坛里下了个WINCE6.0_CHS_SDK.msi,我单独做一个模拟器的时候就能能够运行,可是在华恒给的BSP上面调用的时候就一直 ...… 查看全部问答> |
|
使用evc4.2开发的程序,原来是x86在,现在想直接使用在arm下如何移植? Creating library emulatorRel/Draw2DGraph.lib and object emulatorRel/Draw2DGraph.exp… 查看全部问答> |
|
网上很多网友都反映altium designer在某些方面还是优于10年经典版protel99se ,所以在空闲之余也下载了一个免安装绿化版的altium designer折腾了下。希望altium designer不要追究我使用了盗版的altium designer,只因个人财力有限。折腾不起正版。 ...… 查看全部问答> |
|
时间与地点 日期地点课程地址8月9日北京MSP430 LaunchPad北京市中关村科学院南路2号融科资讯中心A座518室8月16日深圳C2000 LaunchPad深圳市南山区华侨城兴隆街汉唐大厦19楼上海C2000 Concerto上海市浦东新区世纪大道1568号中建大厦32楼北京C2000 L ...… 查看全部问答> |
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; //设置为EXTI0 但是编译的时候却说“EXTI0_IRQChannel”没有定义,之后我吧其他的在固件库使用手册中给的中断的定义试了一下,都不行 ...… 查看全部问答> |
|
熬了一个做出来的作品,把女朋友的照片刻到覆铜板上 先用PS把照片处理成黑白的,存成bmp格式,在用protel dxp的插件把bmp图像转成Pcb文件,输出CAM文件,再用雕刻机刻到覆铜板上 正面刻上照片,背面的铜全部刻掉,用灯一照,光线就能透过来 不加 ...… 查看全部问答> |




