基于51单片机红外测距-proteus仿真-源程序
一、系统方案
本设计采用51单片机作为主控器,液晶1602显示,GP2D12采集距离值,按键设置报警阀值,测量值超过阀值,蜂鸣器报警。
二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
//=lcd1602初始化函数===
void lcd_init()
{
lcdrw=0;
lcden=0;
lcd_write_com(0x38); //显示模式设置
lcd_write_com(0x0c); //显示开关,光标关闭
lcd_write_com(0x06); //显示光标移动设置
lcd_write_com(0x01); //清除屏幕
lcd_write_com(0x80); //数据指针移到第一行第一个位置
}
2、液晶显示程序
//=lcd1602写指令函数===
void lcd_write_com(char cmd) //写指令函数
{
lcdrs=0;
lcdrw=0;
LCD_PORT=cmd;
delayms(1);
lcden=1;
delayms(1);
lcden=0;
}
//=lcd1602写数据函数===
void lcd_write_data(uchar dat)
{
lcdrs=1;
LCD_PORT=dat ;
lcdrw=0;
delayms(1);
lcden=1;
delayms(1);
lcden=0;
}
//=定位写字符串函数====
void LCD_DispStr(uchar y,uchar x,uchar *str)
{
if(y0)lcd_write_com(0x80|x);
else if(y1)lcd_write_com(0xc0|x);
while(*str!=‘\0’)
{
lcd_write_data(*str++);
delayms(5);
}
}
3、按键程序
void key()//按键扫描
{
if(key10)
{
delay(10);
if(key10)
{
while(!key1);
lcd_init();
mode++;
if(mode>2) mode=0;
}}
if(key20)
{
delay(10);
if(key20)
{
while(!key2);
if(mode==2)
{
ah++;
if(ah>80) ah=80;
}if(mode==1){al++;if(al>80) al=80;}}}
if(key30)
{
delay(10);
if(key30)
{
while(!key3);
if(mode==2)
{
if(ah>=1) ah--;}if(mode==1){if(al>=1) al--;}}
}
}
4、核心算法程序
//ADC0832函数==
uchar ADC0832()
{
uchar i,dat;
EA=0;
CS=1; //一个转换周期开始
CLK=0; //为第一个脉冲作准备
CS=0; //CS置0,片选有效
DIO=1; //DIO置1,规定的起始信号
CLK=1; //第一个脉冲
CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
DIO=1; //DIO置1, 通道选择信号
CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
CLK=0; //第二个脉冲下降沿
DIO=0; //选择通道0
CLK=1; //第三个脉冲
CLK=0; //第三个脉冲下降沿
DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
CLK=1; //第四个脉冲
for(i=0;i<8;i++) //高位在前
{CLK=1; //第四个脉冲CLK=0;dat<<=1; //将下面储存的低位数据向右移dat|=(unsigned char)DIO; //将输出数据DIO通过或运算储存在dat最低位
}
CS=1; //片选取消
EA=1;
return dat; //将读出的数据返回
}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。