📄 mcp3004.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 + -