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

📄 mcp3004.c

📁 ADC3004采样程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

void long_delay(void);                    //长延时
void short_delay(void);                   //短延时
void delay500ms(void);           //延时10ms
void write7279(uchar cmd,uchar dta);             //写入7279
uchar read7279(uchar command);                   //读Hb7279
void send_byte(uchar out_byte);                   //发送一字节
uchar receive_byte(void);               //接收一字节

sbit 	cs =P1^1;
sbit 	clk=P1^2;
sbit 	dat=P1^3;
sbit 	key=P3^4;
bit     key_flag;                          //按键标志

sbit pAD_SCS	= P1^7;				//MCP3004
sbit pAD_SCK	= P1^4;
sbit pAD_SDI	= P1^6;
sbit pAD_SDo	= P1^5;


#define  CMD_RESET 0xa4                    //复位
#define  DECODE1 0xc8                      //方式1译码指令
#define  CMD_READ 0x15                     //读键盘指令
#define  UNDECODE 0x90                         // 不译码指令
#define  ACTCTL  0X98          //消隐控制命令

uchar key_number,i;
uint  tmr;
uchar code www[8]={0xBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE,0X7F};



#define  uchar  unsigned char
#define  uint   unsigned int
//unsigned char AD7416_SystemError;
//unsigned int Temperature; //温度


sbit  ADC_CLOCK =P1^4;  //   启动一次转换,并在转换进行时对转换的每一位进行时钟输出
sbit  ADC_IN    =P1^6;     //  将通道配置数据装入器件
sbit  ADC_OUT   =P1^5;  //    将ADC转换的结果输出,在转换进行时,数据将总是在每个时钟的下降沿变化
sbit  ADC_CS    =P1^7;  //为低启动器件,为高终止器件。在转换与转换之间引脚必须拉高。

uint data ADC_data[4]={600,700,800,900};    //假设4个通道的报警点
uint read3004(uchar port);
void Delay(uchar k);
uint Read3004(uchar ChNum);
/**	
用采样点电阻分压值计算需要的报警点ADC值于读取采样值比较
**/
void main(void)
{
uchar i;
uint  j;
delay500ms();
while(1)
{
for(i=0;i<4;i++)
{
    j=Read3004(i);
    write7279(DECODE1+3,j/1000);                //将编辑的数据发送出去
	write7279(DECODE1+2,j%1000/100);
	write7279(DECODE1+1,j%1000%100/10);
	write7279(DECODE1+0,j%1000%100%10);
  j=0;
  delay500ms();
delay500ms();
delay500ms();
delay500ms();
}
}
}

void write7279(uchar cmd,uchar dta)
 {
   send_byte  (cmd);
   send_byte  (dta);
  }

unsigned char read7279(uchar command)
 {
   send_byte (command);
   return(receive_byte());
  }

void send_byte( uchar out_byte)
 {
  uchar j;
  cs=0;
  long_delay();
  for (j=0;j<8;j++)
   {
     if (out_byte&0X80)
	   {
	     dat=1;
	   }
	   else
	   {
	     dat=0;
		}
		clk=1;
		short_delay();
		clk=0;
		short_delay();
		out_byte=out_byte*2;
		}
		dat=0;
	 }

uchar receive_byte(void)
 {
  uchar j,in_byte;
  dat=1;
  long_delay();
  for(j=0;j<8;j++)
   {
    clk=1;
	short_delay();
	in_byte=in_byte*2;
	if(dat)
	{
	 in_byte=in_byte|0x01;
	 }
	clk=0;
	short_delay();
   }
    dat=1;
	return(in_byte);
  }

void long_delay(void)
 {
   uchar j;
   for(j=0;j<0x30;j++);
   }

void short_delay(void)
 {
   uchar j;
   for(j=0;j<8;j++);
   }

void delay500ms(void)
 {
   uchar j,k,t;
   for(j=15;j>0;j--)
    for(k=202;k>0;k--)    
      for(t=81;t>0;t--);
   }


//CS拉高再拉低启动器件
uint read3004(uchar port) //从3004读取采样值,形参port是采样的通道号
{
uint  data ad=0;
uchar data i;
//uchar data al=0,ah=0;
if(port>3)        //3004 为4通道10位ADC
{
 port=3;
}
ADC_CS=0;
ADC_CLOCK=0;  Delay(3);//Start
ADC_IN=1;
ADC_CLOCK=1;  Delay(3); 
ADC_CLOCK=0;  Delay(3);
ADC_IN=1;    //决定采用单端还是差分输入模式
ADC_CLOCK=1;    Delay(3);   

port<<=5;
for (i=0;i<3;i++) //把通道号打入3004,D1和D0译码通道号
{
ADC_CLOCK=0; Delay(3);
ADC_IN=(bit)(port&0x80);
ADC_CLOCK=1; Delay(3);
port<<=1;
}


ADC_CLOCK=0;   Delay(3);//采样与保持周期
ADC_CLOCK=1;   Delay(3);     //输出一个低空位
ADC_CLOCK=0;   Delay(3);
ADC_CLOCK=1;   Delay(3);
for (i=0;i<10;i++) //ADC转换取B9,B8,
{
ADC_CLOCK=0; Delay(3);
if (ADC_OUT) 
{
 ad|=0x0001;
}
ADC_CLOCK=1; Delay(3);
if(i<9)
ad<<=1;
} 
ADC_CLOCK=0; Delay(3);
ADC_CLOCK=1; Delay(3);
ADC_CLOCK=0; Delay(3);
ADC_CS=1;
return (ad);
}
/*
for (i=0;i<8;i++) //取B7---B0位
{

ADC_CLOCK=0; Delay(3);
if (ADC_OUT) 
{
 al|=0x01;
}

ADC_CLOCK=1; Delay(3);
al<<=1;
}
ADC_CLOCK=0; Delay(3);
ADC_CS=1;
ad=(uint)ah;
ad<<=8;
ad|=al;     //得到ADC值
return (ad);
}
*/
void Delay(uchar k)         	//延时
{
  	uchar i;
  	for(i=0;i<k;i++);
}
/*
uint Read3004(uchar ChNum)
{
	uchar i; uint ADResult=0;

	pAD_SCS=0;
	for(i=0; i<5; i++)
	{
		pAD_SCK=0;
		if((ChNum<<i)&0x80)
			pAD_SDI=1;
		else
			pAD_SDI=0;
		Delay(4); pAD_SCK=1;
		Delay(4);
	}

	pAD_SCK=0; Delay(4);
	pAD_SCK=1; Delay(4);
	pAD_SCK=0; Delay(4);
	pAD_SCK=1; Delay(4);
 
	for(i=0; i<10; i++)						//10位分辩率
	{
		pAD_SCK=0; Delay(4);
		if(pAD_SDo)
			ADResult=(ADResult<<1)|0x0001;
		else
			ADResult=(ADResult<<1)&0x03fe;
		pAD_SCK=1; Delay(4);
	}
	pAD_SCK=0; Delay(4);
	pAD_SCK=1; Delay(4);
	pAD_SCK=0; pAD_SCS=1;
	return(ADResult);
}
*/

⌨️ 快捷键说明

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