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

📄 ad5161.c

📁 在AVR单片机开发板上驱动开发板上的数字电位器
💻 C
字号:
/*******************************************
  文件:AD5161.C
  环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
  硬件:ATMEGA16芯片
  日期:2006年12月10日 
  功能:驱动开发板上的数字电位器(AD5161采用IIC接口)
  备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#include <iom16v.h>			//包含型号头文件
#include <macros.h>			//包含"位"操作头文件
#include <stdio.h>			//标准输入输出头文件
#include <AVR_PQ1A.h>		//包含自定义常量头文件
#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);  //更新电阻
  }
 }
}	

⌨️ 快捷键说明

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