在学校做的超声波测距,刚刚接触一年的51,起码得做点什么东西出来,所以自行设计了超声波测距系统/倒车系统测距系统,也来分享一下给大家,本系统以STC12C5A60S2作为核心板,以某宝上买的超声波模块作为检测模块,以oled屏幕作为显示文字、数字、英文、等等、用有源蜂鸣器作为报警器,红色直插LED顺便作为提示,兼容5——12V供电,引出io口,方便以后当做最小系统使用,方便兼容多个其他模块,(自行脑补)。。。。带复位,下载口,,正常工作时候oled显示:“xxx超声波测距,距离xxxCM”,蜂鸣器不响,绿色LED亮,红色灭,当距离小于xxxCM时,蜂鸣器象棋警报,红色LED亮起,绿色灭,大致就是这样。系统为本人亲自制作,单层板,上图。还有PCB,原理图等,代码等;代码有点乱,提供一部分看看,源代码在附件--------杰杰制作。
下载请回复下,祝大家身体健康学习进步,么么哒
- 主函数部分
- void main()
- {
-
- gg=0;
- Uartinit();
- OLED_Init();
- TMOD=0x11; //设T0为方式1,GATE=1;
- TH0=0;
- TL0=0;
- TH1=0xf8; //2MS定时
- TL1=0x30;
- ET0=1; //允许T0中断
- ET1=1; //允许T1中断
- TR1=1; //开启定时器
- EA=1; //开启总中断
- while(1)
- {
- while(!RX); //当RX为零时等待
- TR0=1; //开启计数
- while(RX); //当RX为1计数并等待
- TR0=0; //关闭计数
- Conut();
- display(); //计算
- }
- }
- void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
- {
- flag=1; //中断溢出标志
- }
- /********************************************************/
- void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
- {
- TH1=0xf8;
- TL1=0x30;
- // display();
- timer++;
- if(timer>=400)
- {
- timer=0;
- TX=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- TX=0;
- }
- }
- /*****************************************************************************
- 函 数 名 : LED_Init
- 功能描述 : OLED初始化
- 输入参数 : VOID
- 输出参数 : NONE
- 返 回 值 : NONE
- 备 注 :详细请参考0.96inch_LDR128064B2B201 9.5 Recommanded Software Initialization
- *****************************************************************************/
- void OLED_Init(void)
- {
- unsigned char i;
- SCL_OLED = 1;
- RST = 0;
- for(i = 0; i < 100; i++)
- {
- ; //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕
- }
- RST = 1;
- SetDisplayOnOff(0); // 关显示 (0:关显示/1:开显示)
- SetDisplayClock(0x80); // 设置时钟为100Frames/Sec ,0x80为缺省值
- SetMultiplexRatio(0x3F); // 1/64 Duty (0x0F~0x3F)
- SetDisplayOffset(0x00); // 垂直显示无偏移 (0x00~0x3F)
- SetStartLine(0x00); // 设置映射内容显示的起始行(0x00~0x3F)
- SetChargePump(1); // 使能内部DC/DC转换(0x00/0x04)
- SetAddressMode(0x02); // 设置为页地址模式 (0x00/0x01/0x02)
- SetSegmentRemap(0x01); // Segment重映射; 0x00左右反置 0x01正常
- SetCommonRemap(0x01); // 设置COM扫描方向 0x00上下反置 0x08正常
- SetCommonConfig(0x10); // 设置com序列的配置 (0x00/0x10)
- SetContrast(0x7F); // 设置对比度
- SetPrechargePeriod(0xF1); // 设置预充电周期为15个时钟,放电周期为1个时钟周期
- SetVCOMH(0x40); // 设置COM端电平等级
- SetEntireDisplay(0); // 正常显示(0:正常显示/1:忽略显示)
- SetInverseDisplay(0); // 反白设置 (0:正常显示/1:反白显示)
- SetDisplayOnOff(1); // 开显示 (0:关显示/1:开显示)
- FillScreen(0x00); // 初始清屏,填充空白
- /// SetPos(0,0); //并将位置设置在0页,0列
- }
-
- /*oled显示*/
- void display()
- {
-
- WriteChinese16x16(0,0,"杰杰号超声波测距");
- PrintNum_8x16(2,60,qian);
- PrintNum_8x16(2,70,bai);
- PrintNum_8x16(2,80,shi);
- // PrintNum_8x16(2,90,ge);
- WriteMixStrXx16(2,10,"距离:");
- WriteMixStrXx16(2,97,"CM");
- bee=1;
- d1=0;
- d2=1;
- if(S<5)
- {
- delay(5);
- if(S<5)
- {
- d1=1;
- bee=0;//蜂鸣器暴警红灯亮
- d2=0;
- }
- }
- //if(S>50)
- //{
- // bee=1;
- // d1=0;
- // d2=1;
- //}
- // if((S>700)||flag==1) //超出测量范围显示“-”
- // {
- // flag=0;
- // bee=0;
- // WriteMixStrXx16(2,60,"xxxx");
- //
- // }
复制代码
2
|
|
|
|
感觉看上去 不错的样子 ,不知道测试的结果怎么样?
|
|
|
|
|
非常好。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
|
|
|
|
|