⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad.c

📁 模拟和数字转换芯片的驱动 该AD芯片是ADC0832
💻 C
字号:
#include "reg51.h"
#include"intrins.h"
sbit  data595=P0^2;                                                          	/*74hc595的数据输入脚*/
sbit  clk595=P0^0;                                                            	/*74hc595的时钟输入脚*/
sbit  str595=P0^1;                                                             	/*74hc595的时钟状态脚*/
sbit  Q0=P0^4;									/*数码管片选脚Q0*/
sbit  Q1=P0^5;                                                                	/*数码管片选脚Q1*/
sbit  Q2=P0^6;                                                               	/*数码管片选脚Q2*/
sbit  Q3=P0^7;                                                                	/*数码管片选脚Q3*/
sbit  cs=P2^0;                                                              	/*ADC0832片选脚*/
sbit  clk=P2^1;                                                             	/*ADC0832时钟输入脚*/
sbit  data_o=P2^2;                                                           	/*ADC0832数据输入脚*/
#define uchar unsigned char
#define uint  unsigned int
#define nop  _nop_()                                                      	/*定义空操作指令*/
#define XMS 5500                                                       		/*定时中断间隔11.0592MHz*/                                       
uchar disppoint,tx_dat;
uint buf[]={0,0,0,0};
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};              /*显示段表0~9*/
void senddata(uchar date_)   		 /*发送数据*/                                                       
{
        uchar m,i;
        str595=0;
        for(i=0;i<8;i++)                                         
                {
                        clk595=0;
                        m=date_;                         
                        m&=0x80;						   /*保留M的最高位*/
                        data595=(bit)m;						   /*在每个clk周期,同时送出1bit串行数据*/				 
                        date_<<=1; 		                                   /*将date_向左移动一位*/
                        clk595=1;	                                           /*0-->1,clk为上升沿*/	
                }
        str595=1; 								   /*数据送完,锁存到输出端进行显示*/                             
        str595=0;
 }			 
void timer0(void) interrupt 1 using 0                                              /*定时器显示中断程序*/
{
        EA=0;									    /*关中断*/
        TH0=-(XMS/256);								    /*定时器赋值*/ 
        TL0=-(XMS%256);
        disppoint&=3;								    /*显示位赋值*/
        if(disppoint==2){tx_dat=seg[buf[disppoint]];tx_dat&=~0x80;senddata(tx_dat);}/*第三个数码显示小数点*/
        else senddata(seg[buf[disppoint]]);
        switch(disppoint)							    /*显示片选处理*/
                {
                        case 2:Q3=0;Q2=1;Q1=1;Q0=1;break;
                        case 3:Q2=0;Q3=1;Q1=1;Q0=1;break;
                        case 0:Q1=0;Q3=1;Q2=1;Q0=1;break;
                        case 1:Q0=0;Q3=1;Q2=1;Q1=1;break;
                }
        disppoint++;
        EA=1;									    /*开中断*/
}
/***********************************************************/
void BCD(uchar ad_)
{
        uint temp;
        uchar i;
        temp=(uint)(((unsigned long)((unsigned long)ad_*500))/256);		  /*将AD结果转换成BCD码*/
        for(i=0;i<3;i++)
                {
                        buf[i]=temp%10;
                        temp=temp/10;
                }
 }
/**************************************************************/
uchar read_adc(void)			/*读取AD值*/
{  
        uchar i,ch=0;
        cs=0; 
        clk=1;
        nop;
        nop;
        clk=0;
        nop;
        nop;
        for(;data_o==1;) 							/*等待AD转换结束*/
                {
                        clk=1;
                        nop;
                        nop;
                        clk=0;
                        nop;
                        nop;
                }
        for(i=0; i<8; i++)
                {  
                        clk=1;
                        nop;
                        nop;
                        clk=0;
                        nop;
                        nop; 
                        ch=(ch<<1)|data_o;					/*读取串行数据*/
                }
        cs=1;
        return(ch);
}
/***********************************************************************/

void main(void)
{
        uint ad=0;
        uchar j,tmp;
        uchar ad_temp[10]={0};
        P0=0xff;									/*P0初始化*/
        TMOD=0x01;									/*定时器工作方式*/
        TH0=-(XMS/256);									/*定时器赋值*/		
        TL0=-(XMS%256);
        TR0=1;										/*允许T0工作*/
        ET0=1;										/*允许T0中断*/
        EA=1;										/*允许全局中断*/
        while(1)
                {
                        while(tmp!=read_adc())
                                {
                                        tmp=read_adc();
                                        for(j=0;j<10;j++)ad_temp[j]=read_adc();		/*读取10次AD值*/
                                        for(j=0;j<10;j++)ad=ad+ad_temp[j];		/*AD值累加*/
                                        tmp=(uchar)(ad/10);				/*计算平均值*/
                                        BCD(tmp);					/*BCD转换*/
                                        ad=0; 
                                } 
                } 
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -