环境
软件
- 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();
}
}