发 帖  
原厂入驻New

[经验] DSP原理与应用---GP2D12仿真测距

2020-8-28 16:10:02  344 DSP
分享
3
环境软件
  • UVision V4.02
  • ISIS Professional 7.8
芯片
  • AT89C51
  • ADC0832
  • 74HC595
实现效果
红外传感器感知距离用LCD显示,在小于30cm时,发出报警
20191222161022843.gif
相关代码及资源操作小记ADC0832相关函数#include<reg51.h>           #include<intrins.h>   #include<string.h>     #include<stdio.h>#define INT8U  unsigned char#define INT16U unsigned int#define INT32U unsigned longsbit 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 longsbit 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 2INT8U 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();        }}
xiaoyangyds 2020-9-8 20:15:12
可以,希望多分享
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表