×
单片机 > 单片机程序设计 > 详情

单片机+ADC0832差分与单通道程序和注解

发布时间:2020-09-01 发布时间:
|

ADC0832差分仿真原理图如下
 

单片机源程序如下(带详细的注释):

#include

#include

#include<1602.h>


#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

uchar code num[]={"0123456789*#"};

sbit ADC_DI=P1^2;                //通道端CH0,CH1

sbit ADC_DO=P1^2;                //数据端

sbit ADC_CLK=P1^1;                //时钟端

sbit ADC_CS=P1^0;                //片选端


sbit DS=P3^5;

sbit SH_CP=P3^6;

sbit ST_CP=P3^7;


void ADC_init()                   //ADC0832初始化

{

        ADC_CS=1;                   //片选端关闭,低电平有效

        ADC_CLK=1;                   //时钟端

        ADC_DI=1;                   //数据端

        _nop_();_nop_();

}

                                                 

void ADC_start()           //ADC0832启动

{

        ADC_CS=0;                        //打开片选

        _nop_();_nop_();

        ADC_CLK=0;                        //第一个时钟脉冲低电平

        _nop_();_nop_();

        ADC_DI=1;                        //打开通道设置

        _nop_();_nop_();

        ADC_CLK=1;                        //第一个时钟脉冲高电平完成第一个时钟脉冲

        _nop_();_nop_();                                

}


void ADC_select_channel()        //ADC0832通道选择:单通道使用CH0

{

        ADC_CLK=0;                                        //第二个时钟脉冲低电平

        _nop_();_nop_();

        ADC_DI=0;                                //DI为1是选用单端输入(单通道),DI为0是选用单道差分输入(双通道)

        _nop_();_nop_();

        ADC_CLK=1;                                        //第二个时钟脉冲高电平完成第二个时钟脉冲

        _nop_();_nop_();

        

        ADC_CLK=0;                                        //第三个时钟脉冲低电平

        _nop_();_nop_();

        ADC_DI=0;                                //第三个脉冲时DI为0选用CH0输入,DI为1是选用CH1输入

        _nop_();_nop_();

        ADC_CLK=1;                                        //第三个时钟脉冲高电平完成第三个时钟脉冲

        _nop_();_nop_();                

}


uchar ADC0832()

{

        uchar dat1,dat2,i;           //定义二个变量dat1存入前8位dat2存入后8位

        ADC_CLK=0;                                   //增加一个时钟脉冲低电平

        _nop_();_nop_();

        ADC_DI=0;                                   //通道端关闭

        _nop_();_nop_();

        ADC_DO=1;                                   //数据端打开

        _nop_();_nop_();

        ADC_CLK=1;                                   //增加一个时钟脉冲高电平(完成一个时钟脉冲)

        _nop_();_nop_();


        for(i=0;i<8;i++)           //循环8次时钟脉冲第四次到第十一次

        {

                ADC_CLK=0;                           //第四个时钟脉冲低电平

                _nop_();_nop_();

                dat1=dat1<<1;           //变量dat1每次循环左移一位,dat1从高位移到低位7位—0位

                if(ADC_DO==1)                   //判断数据端是否高电平

                {

                        dat1=dat1|0x01;   //如果数据端为高电平,变量dat1最低位变成1

                }

                ADC_CLK=1;                           //第四个时钟脉冲高电平完成第四个时钟脉冲

                _nop_();_nop_();

        }


        for(i=0;i<8;i++)                  //循环8次时钟脉冲第十一次到第十九次

        {

                dat2=dat2>>1;                  //变量dat2每次循环右移一位,因为dat2从低位到高位0位——7位,

                if(ADC_DO==1)                  //判断数据端是否高电平

                {

                        dat2=dat2|0x80;           //如果数据端为高电平,变量dat2最高位置1

                }

                ADC_CLK=0;                           //第十一个时钟脉冲低电平

                _nop_();_nop_();

                ADC_CLK=1;                           //第十一个时钟脉冲高电平完成第十一个时钟脉冲

                _nop_();_nop_();

        }


        ADC_CS=1;                                  //片选端关闭

        _nop_();_nop_();


        if(dat1==dat2)                          //判断二个数是否一样

        {

                return dat1;                   //如果一样就返回uchar ADC0832()=dat1

        }

        else

        {

                return 0;                          //如果不是那就返回0

        }

}


void main()

{

         uint tmp;

         ADC_init();

         lcd_init();

         while(1)

         {

         ADC_start();

         ADC_select_channel();

         tmp=ADC0832();

                wirte_lcd_cmd(0x80);

                wirte_lcd_date(num[tmp/1000]);

                wirte_lcd_date(num[tmp%1000/100]);

                wirte_lcd_date(num[tmp%1000%100/10]);

                wirte_lcd_date(num[tmp%10]);

         }

}


ADC0832单通道

#include

#include

#include<1602.h>


#define uchar unsigned char

#def


关键字:单片机  ADC0832  差分  单通道 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向