本帖最后由 caijie001 于 2017-2-1 11:47 编辑
在学校做的超声波测距,刚刚接触一年的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");
//
// }
|