请选择 进入手机版 | 继续访问电脑版
搜索
查看: 208|回复: 0

avr单片机控制AD5161实验程序

[复制链接]
发表于 2018-4-18 17:17:58 | 显示全部楼层 |阅读模式
/*******************************************
文件:AD5161.C
环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10  
硬件:ATMEGA16芯片
功能:驱动开发板上的数字电位器(AD5161采用IIC接口)


/******************************************/
#include     //包含型号头文件
#include     //包含"位"操作头文件
#include     //标准输入输出头文件
#include    //包含自定义常量头文件
#include "Skey.C"    //包含数码管显示函数


/*******************************************
函数名称: Twi_init
功    能: 初始化TWI
参    数: MS--延时的毫秒数
返回值 : 无
/********************************************/
void Twi_init(void)
{
TWBR= 0x20; //设置波特率
TWSR= 0x00; //设置预分频比
TWCR= 0x44; //使能应答,使能TWI
}
/*******************************************
函数名称: AD5161_writeB
功    能: 向AD5161写入电阻值数据
参    数: devadd--器件地址
      cmd--控制命令
    rdata--电阻数据
返回值 : success--数据成功标志(为TRUE时写入成功,为FALSE时失败)
/********************************************/
uchar AD5161_writeB(uchar devadd,uchar cmd,uchar rdata)
{
uchar success=FALSE;   //默认返回是写入失败
Start();      //产生START信号
Wait();      //等待START信号发送完毕
if(TestACK()!=START)   //检查是否是START信号发送完毕状态
{
success=FALSE;     //如果不是,则返回写入失败
return success;
}
Writebyte(devadd);    //发送从器件地址
Wait();      //等待发送完毕
if(TestACK()!=MT_SLA_ACK)//检查是否是从器件地址发送完毕状态
{
success=FALSE;    //如果不是,则返回写入失败
return success;
}
Writebyte(cmd);     //发送AD5161的命令字节(具体含义请参看AD5161的数据手册)
Wait();      //等待发送完毕
if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
{
success=FALSE;    //如果不是,则返回写入失败
return success;
}
Writebyte(rdata);    //发送电阻值数据
Wait();      //等待发送完毕
if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
{
success=FALSE;    //如果不是,则返回写入失败
return success;
}
Stop();        //对AD5161的一次操作完毕,发送STOP信号
Delayms(10);     //等待发送完毕
success=TRUE;     //本次写入成功
return success;    //返回写入成功状态
}
/*******************************************
函数名称: main
功    能: 按键更新数字电位器的阻值(电阻是A和W端的阻值,默认B端是开路的)
参    数: 无
返回值 : 无
/********************************************/
void main(void)
{
uchar i,data=0; //初始电阻是满量程
Board_init( );   //初始化开发板
Twi_init( );   //初始化TWI  
AD5161_writeB(0x58,0x00,data); //设置初始电阻
while(1)
{
if(Skey_press())      //是否有按键按下
{
   i=Skey_sCAN();      //扫描并反回翻译后的键码
   switch(i)
   {
   case 0:      //S1键按下,减少电阻的数字量(AD5161的特性是减少电阻的数字量,阻值增加)
   data-=16;
   break;
case 1:           //S2键按下,增加电阻的数字量
   data+=16;
   break;
case 2:           //S3键按下,使电阻的数字量为零(阻值满量程)
   data=0;
   break;
case 3:         //S3键按下,使电阻的数字量为满(阻值清零,只剩下接触电阻)
   data=255;
   break;
   }
   AD5161_writeB(0x58,0x00,data); //更新电阻
}
}
}  

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /5 下一条

facebook google plus twitter linkedin youku weibo rss
©2018 Microchip Corporation

小黑屋|手机版|Archiver|Microchip技术社区

GMT+8, 2018-8-20 23:22 , Processed in 0.045544 second(s), 6 queries , MemCache On.

快速回复 返回顶部 返回列表