学校举行的设计大赛已经结束,虽然在这次比赛中并没有获得比较好的成绩,但总算是基本完成了设计的样品,在这里想分享下我的设计过程,希望能对一些人有所帮助,也希望能学到更多东西。
首先是这次设计的主题,设计的是手持式超声测距仪,用到的主要硬件有51单片机、1.44寸的TFT彩屏、蜂鸣器、US-100超声波头。然后想法是想把测到的距离通过彩屏来显示。
实物部分:
代码部分:
第一部分是启用超声波头的函数:
这里的之所以要这么多个_nop_();是因为US-100超声波头发射超声波时,Trig管脚需要接收到一个10us以上的高电平才会发射超声波,这里一个_nop_();延迟1us。
第二部分则是对返回来的数据进行处理:
代码里面的注释写的比较清楚,这里就不详细讲。这里提一下我写的代码这个是显示两位小数,单位是M,根据超声波头的精度,是可以写到3位小数,根据资料,误差是在0.003m左右,然后这里是不用对温度进行处理,因为这个超声波头里面就自带温度检测,测出来的时间已经修正了,是按照波速340m/s来算的。
第三部分就是TFT彩屏的初始化、写数据、写命令、读数据等函数,这里就不介绍了。
第四部分就是TFT彩屏上显示文字和字符的函数,文字通过字模转化来显示,这里采用16*16的点阵,而字符是通过ASCII码的顺序来显示,是8*16点阵,这里显示文字和字符分开用了两种方法,详细说明在代码注释中有。
第五部分就是加了蜂鸣器,这部分的代码也比较简单,只是让蜂鸣器在测量完成时响一声提示测距完成,所以这里也不做过多介绍。
最后给大家提供改进的几个思路,可以考虑增加蓝牙测距的模式,通过手机打开蓝牙,写一个APP,在手机这个APP上控制测距并将数据返回到手机中,这个想法是在比赛中见到的,当然也还有很多很好的想法(这就是在比赛中被完爆的原因),像外壳加了磁体等吸附装置可以吸附在任意位置测距,超声波头装在舵机上可以旋转等,这里就不一一举出了。有问题或建议的可以提出来交流,最后希望我整理的这些能对大家有所帮助。
单片机源程序:
- #include<reg51.h>
- #include<absacc.h>
- #include<intrins.h>
- #include<string.h>
- #include<tft.h>
- sbit Trig = P3^1; //定义超声波引脚
- sbit Echo = P3^0;
-
- unsigned int time=0;
- unsigned long S=0;
- bit flag =0;
- unsigned char disbuff[4] ={ 0,0,0,0,};
- void fengmingqi() //蜂鸣器加启用超声波函数
- {
- u8 i,j=100;
- while(j)
- {
- for (i=0;i<80;i++)
- {
- beep=1;
- delay(1);
- beep=0;
- delay(1);
- }
- for (i=0;i<100;i++)
- {
- beep=1;
- delay(2);
- beep=0;
- delay(2);
- }
- j--;
- }
- StartModule();
- while(!Echo);
- TR0=1;
- while(Echo);
- TR0=0;
- Conut();
- while(1){ //让蜂鸣器响一下
- beep=1;
- }
-
- }
- void Conut(void) //计算距离
- { //通过计时器计算,计时器的单位是1us,所以下面S是=(time*340)/2/10000(单位是cm)
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
- S=(time*1.7)/100; //算出来是CM
- if((S>=450)||(S<2)||flag==1) //超出测量范围显示“-”
- {
- flag=0;
-
- Fast_DrawFont_GBK16(40,70,RED,WHITE,"超出范围");
- }
- else
- {
- disbuff[0]=S%1000/100;
- disbuff[1]=S%1000%100/10;
- disbuff[2]=S%1000%10 %10; //这里可以通过fmod函数计算第三位小数,然后自行添加就好
- switch (disbuff[0]) //通过switch给出数值
- {
- case (0): Display_ASCII8X16(40, 70,"0"); break;
- case (1): Display_ASCII8X16(40, 70,"1"); break;
- case (2): Display_ASCII8X16(40, 70,"2"); break;
- case (3): Display_ASCII8X16(40, 70,"3"); break;
- case (4): Display_ASCII8X16(40, 70,"4"); break;
- };
- Display_ASCII8X16(50, 70,".");
- switch (disbuff[1])
- {
- case (0): Display_ASCII8X16(60, 70,"0"); break;
- case (1): Display_ASCII8X16(60, 70,"1"); break;
- case (2): Display_ASCII8X16(60, 70,"2"); break;
- case (3): Display_ASCII8X16(60, 70,"3"); break;
- case (4): Display_ASCII8X16(60, 70,"4"); break;
- case (5): Display_ASCII8X16(60, 70,"5"); break;
- case (6): Display_ASCII8X16(60, 70,"6"); break;
- case (7): Display_ASCII8X16(60, 70,"7"); break;
- case (8): Display_ASCII8X16(60, 70,"8"); break;
- case (9): Display_ASCII8X16(60, 70,"9"); break;
- };
- switch (disbuff[2])
- {
- case (0): Display_ASCII8X16(70, 70,"0"); break;
- case (1): Display_ASCII8X16(70, 70,"1"); break;
- case (2): Display_ASCII8X16(70, 70,"2"); break;
- case (3): Display_ASCII8X16(70, 70,"3"); break;
- case (4): Display_ASCII8X16(70, 70,"4"); break;
- case (5): Display_ASCII8X16(70, 70,"5"); break;
- case (6): Display_ASCII8X16(70, 70,"6"); break;
- case (7): Display_ASCII8X16(70, 70,"7"); break;
- case (8): Display_ASCII8X16(70, 70,"8"); break;
- case (9): Display_ASCII8X16(70, 70,"9"); break;
- };
- Display_ASCII8X16(80, 70,"M");
- }
- }
- void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
- {
- flag=1; //中断溢出标志
- }
- void StartModule() //启动模块
- {
- Trig=1; //启动一次模块
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- Trig=0;
- }
- void Font_Test(void) //显示文字
- {
- LCD_Clear(WHITE);
- Fast_DrawFont_GBK16(24,20,BLACK,WHITE, "洞穴测距仪");
- delay(1000);
- }
- void main() //主函数
- {
- #ifdef MCU_STC12
- P3M1 &= ~(1<<2), P3M0 |= (1<<2); //P3.2 set as push-pull output mode
- #endif
- lcd_initial();
- LCD_Clear(WHITE);
- bl=1;
- TMOD=0x01;
- TH0=0;
- TL0=0;
- ET0=1;
- EA=1;
- Font_Test();
- daoshu3s();
- fengmingqi();
- }
- uchar code Zk_ASCII8X16[]=
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,// .
- 0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,// /
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料51hei下载地址:
手持式超声测距仪.zip
(678.51 KB, 下载次数: 28)
|