51单片机控制ADN2850的阻值
时间:10-02
整理:3721RD
点击:
ADN2850为一个数字电位器,我用STC89C52来控制,用串口发送它的阻值,我编写了一个C语言的程序,可是无法起到改变阻值的作用。下面是我自己写的程序,只写了发送数据控制1的阻值发生变化,可是无论串口发送何值,W1引脚和B1引脚间的电阻都不发生变化,求大神指点迷津,万分感谢!
//以十六进制的形式输入2850的电阻值
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
sbit cs=P1^4; // 将p1.4口模拟片选
sbit sclk=P1^5;// 将p1.5口模拟时钟输出
sbit sdo=P1^7;// 将p1.7口模拟主机输出
sbit tec_en=P2^5;
sbit sdi=P2^6;// 将p2.6口模拟主机输入
ulint b,c,d,h;
uchar e;
uchar buffer[2];
/**********简单的延时函数***************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**********adn2850初始化函数***************/
void adn_init()
{
sclk=0;
sdi=1;
sdo=1;
}
/**********串口发送数据函数***************/
char comsenf()
{
uint a;
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;//给T1赋初值
TR1=1;//打开定时器1
REN=1;//启动串行口接受数据
SM0=0;
SM1=1;//设定串行口为工作方式1
EA=1;
ES=1;
if(RI==1)//判断是否接受到停止位
{
a++;
for(a=0;a<2;a++)
{
RI=0;//取消接受中断申请
buffer[a]=SBUF;
}
return buffer[a];
}
}
/**********从机接收数据函数************/
void spi_write(ulint dat)//上升沿输入sdi,下降沿输出sdo
{
uchar i;
adn_init();
while(cs==0) //检测是否有数据的传输
{
for(i=0;i<24;i++) // 循环24次
{
sdi=(dat&0x800000); // dat最高位输出到sdi
dat<<=1; // 低一位移位到最高位
sclk=1;//上升沿写入数据
delay(5); //等待数据的稳定
sclk=0; // sclk置低
delay(5);
}
}
}
/***********主程序**************/
void main()
{
tec_en=1;
cs=0;
comsenf();
b=0xb0;//将数据写入RDAC1
c=(b<<14)|buffer[0];//将b作高8位和buffer[0]作低8位合成22位
e=buffer[1]<<6;//将buffer[1]的低2位移到高2位
d=(c<<8)|e;//将c作高22位和buffer[1]作低2位合成24位
h=d<<2;//将合成的24位放于32位的前24位
spi_write(h);
spi_write(0x200000);// 将RDAC1寄存器数据存储到EEMEM1中。
}
//以十六进制的形式输入2850的电阻值
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
sbit cs=P1^4; // 将p1.4口模拟片选
sbit sclk=P1^5;// 将p1.5口模拟时钟输出
sbit sdo=P1^7;// 将p1.7口模拟主机输出
sbit tec_en=P2^5;
sbit sdi=P2^6;// 将p2.6口模拟主机输入
ulint b,c,d,h;
uchar e;
uchar buffer[2];
/**********简单的延时函数***************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**********adn2850初始化函数***************/
void adn_init()
{
sclk=0;
sdi=1;
sdo=1;
}
/**********串口发送数据函数***************/
char comsenf()
{
uint a;
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;//给T1赋初值
TR1=1;//打开定时器1
REN=1;//启动串行口接受数据
SM0=0;
SM1=1;//设定串行口为工作方式1
EA=1;
ES=1;
if(RI==1)//判断是否接受到停止位
{
a++;
for(a=0;a<2;a++)
{
RI=0;//取消接受中断申请
buffer[a]=SBUF;
}
return buffer[a];
}
}
/**********从机接收数据函数************/
void spi_write(ulint dat)//上升沿输入sdi,下降沿输出sdo
{
uchar i;
adn_init();
while(cs==0) //检测是否有数据的传输
{
for(i=0;i<24;i++) // 循环24次
{
sdi=(dat&0x800000); // dat最高位输出到sdi
dat<<=1; // 低一位移位到最高位
sclk=1;//上升沿写入数据
delay(5); //等待数据的稳定
sclk=0; // sclk置低
delay(5);
}
}
}
/***********主程序**************/
void main()
{
tec_en=1;
cs=0;
comsenf();
b=0xb0;//将数据写入RDAC1
c=(b<<14)|buffer[0];//将b作高8位和buffer[0]作低8位合成22位
e=buffer[1]<<6;//将buffer[1]的低2位移到高2位
d=(c<<8)|e;//将c作高22位和buffer[1]作低2位合成24位
h=d<<2;//将合成的24位放于32位的前24位
spi_write(h);
spi_write(0x200000);// 将RDAC1寄存器数据存储到EEMEM1中。
}
已退回2积分