数码管显示的GP2D12仿真测距警报器

环境

软件

  • uVision V4.02
  • ISIS Professional 7.8

芯片

  • AT89C51
  • ADC0832
  • 74HC595

实现效果

将红外传感器感知距离用LCD显示,在小于30cm时,发出报警
在这里插入图片描述

相关代码及资源

操作小记

ADC0832相关函数

#include<reg51.h>	   
#include<intrins.h>   
#include<string.h>     
#include<stdio.h>

#define INT8U  unsigned char
#define INT16U unsigned int
#define INT32U unsigned long

sbit CS=P0^2;	  
sbit CLK=P0^1;	     
sbit DIO=P0^0;

INT8U Get_AD_Result()
{	 
	INT8U i=0,dat1=0x00,dat2=0x00;
	CS=0;//片选
	CLK=0;_nop_();_nop_();
	DIO=1;//启动0832
	CLK=1;_nop_();_nop_();	


	CLK=0;_nop_();_nop_();
	DIO=1;//选择单通道还是双通道
	CLK=1;_nop_();_nop_();

	CLK=0;_nop_();_nop_();
	DIO=0;//选择0还是1通道
	CLK=1;_nop_();_nop_();

	CLK=0; DIO=1;_nop_();_nop_(); //释放总线,准备采集
	for(i=0;i<8;i++)//下降沿采集数据,从高位到低位
	{
		CLK=1;_nop_();_nop_(); 
		CLK=0; _nop_();_nop_();
		dat1=(dat1<<1)|((INT8U)DIO);
	}	
	for(i=0;i<8;i++)//下降沿采集数据,从低位到高位
	{
		dat2=(dat2)|(((INT8U)DIO)<<i);	
		CLK=1;_nop_();_nop_(); 
		CLK=0; _nop_();_nop_();
	}
	_nop_();_nop_();
	CS=1;//0832片选结束
	if(dat2==dat1)	//如果两个数据相等,就输出
		return dat1;
	else
		return 0;
}//5v 255	126 3.24 324

/*
INT16U Digit_Convert_Analog(INT8U dat)
{
	INT16U AnalogValue=0x0000;//   x*500/256=y
	AnalogValue=(INT16U)((dat*500.0)/256.0);
	return AnalogValue;
}
*/

ADC0382相关函数

#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include<stdio.h>

#define INT8U unsigned char
#define INT16U unsigned int
#define INT32U unsigned long

sbit DS = P3^5; //数据串行输入端
sbit SH_CP = P3^6; //数据串行输入移位时钟信号,上升沿有效
sbit ST_CP = P3^7; //数据并行输出时钟信号,上升沿有效

void serialInputData(INT8U dat)
{
	INT8U i = 0;
	for(i=0; i<8; i++)
	{
		if(dat&0x80) //1000_0000
			DS=1;
		else
			DS=0;
		
		dat=dat<<1;
		SH_CP=0; _nop_();_nop_();
		SH_CP=1; _nop_();_nop_();
	}
	SH_CP=0; _nop_();_nop_();
}

void paralledOutputData()
{
	ST_CP=0; _nop_();_nop_();
	ST_CP=1; _nop_();_nop_();
	ST_CP=0; _nop_();_nop_();	
}

主函数

#include<reg51.h>	   
#include<intrins.h>   
#include<string.h>     
#include<stdio.h>

#define INT8U  unsigned char
#define INT16U unsigned int
#define INT32U unsigned long
#define MC 1388
#define BC -5
#define KC 2

INT8U code segment7[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
INT8U numstr[4];
sbit beeppin = P1^0;

extern INT8U Get_AD_Result();
extern void serialInputData(INT8U dat);
extern void paralledOutputData();

//凤鸣
void beep()
{
	INT8U i=0, j=150;
	beeppin = 1;
	for(i=0; i<60; i++)
	{
		beeppin = !beeppin;
		j=150;
		while(j--);
	}
}

//获取距离
float getDistance()
{
	float d=0.00, sum=0, avg=0;
	INT8U i=0;
	
	for(i=0; i<10; i++)
	{
		sum = sum + Get_AD_Result();
	}
	avg = (INT8U)(sum/10.0);
	d = ( (MC*1.0) / ((avg+BC)*1.0) ) - (KC*1.0);
	return d;
}

void distance2numstr(float d)
{
	INT16U dis = (INT16U)(d*10); 
	numstr[0] = dis/100+'0';
	numstr[1] = ((dis/10)%10)+'0';
	numstr[2] = dis%10+'0';
}

void main()
{
	float dis = 0;
	while(1)
	{
		dis = getDistance();
		if(dis<30)
			beep();
		distance2numstr(dis);
		serialInputData(~segment7[numstr[2]-'0']);
		serialInputData((~segment7[numstr[1]-'0'])&0x7F);
		serialInputData(~segment7[numstr[0]-'0']);
		paralledOutputData();
	}
}
  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值