完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
写了段超声波测距的程序,大概想实现的功能就是将测得的数据用数码管显示,并且在每次测量的时候将0xdd通过串口发送给电脑。以下是是程序
#include #include #define uint unsigned int //宏定义,意思为用uint代替unsigned int,这样编写方便,在以后宏定义的作用还有可以方便调用等 #define uchar unsigned char //同上 ***it dula=P2^6; ***it wela=P2^7; ***it beep=P2^3; ***it RX=P3^2; ***it TX=P3^3; uchar code table[]={ //共阴极数码管编码定义 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uint time=0; // float s=0; unsigned long s=0; bit start_measure=0; uint num,num1,distance,bai,shi,ge; /********************1ms延时函数********************/ void delayms(uint z) { uint i,j; for(i=0;i }/**********************显示函数******************************/ void display(uchar bai,uchar shi,uchar ge) { dula=1; //送段选数据 P0=table[bai]; dula=0; P0=0xff; //送位选数据前关闭搜有显示,防止打开位选锁存时 wela=1; //原来的段选数据通过位选锁存器造成混乱 P0=0xfd; //送位选数据 wela=0; delayms(1); dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delayms(1); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delayms(1); } void T0_time() interrupt 1 { TH0=(65536-1000)/256; //重装初值 TL0=(65536-1000)%256; num1++; if(num1>=200) //如果到了60次,说明60毫秒到 { num1=0; //把num1清零,重新计数 start_measure=1; } } void init() { TMOD=0x21; //设T0为方式1,GATE=1; TH1=0xfd; TL1=0xfd; TH0=(65536-1000)/256; //装初值 TL0=(65536-1000)%256; EA=1; //开启总中断 ET0=1; TR1=1; TR0=1; SM0=0; SM1=1; T2CON=0x00; TH2=0; TL2=0; } /****************启动超声波模块*************************/ void StartModule() { TX=1; //启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; } /***********************计算距离*****************************/ void Conut(void) { time=TH2*256+TL2; TH2=0; TL2=0; s=(time*1.7)/100; //算出来是CM if(s>=700) //超出测量范围显示“FFF” { bai=15; shi=15; ge=15; } else { bai=s/100; //距离处理函数 shi=(s%100)/10; ge=s%10; } } /*********************主函数**************************/ void main(void) { init(); while(1) { display(bai,shi,ge); //调用显示函数 if(start_measure==1) { start_measure=0; StartModule(); while(!RX); //当RX为零时等待 TR2=1; //开启计数 while(RX); //当RX为1计数并等待 TR2=0; //关闭计数 Conut(); //计算 TI=1; SBUF=0xdd; while(!TI); TI=0; } } } 这段程序下载后,在串口处能接收到0xdd,但是数码管显示000.请高人指点。 |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11790 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 19:09 , Processed in 0.473183 second(s), Total 69, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号