avr单片机控制AD5161实验程序

2017-12-15 22:55:00编辑:什么鱼 关键字:avr  单片机控制  AD5161

/******************************************* 
文件: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); //更新电阻 


}  


关键字:avr  单片机控制  AD5161

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2017121536769.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR多机通讯
下一篇:AVR芯片熔丝补救方法

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR定时器的探索

首先先说一下AVR8位的通用定时器寄存器T/C0:有一句不太理解的话:所有中断都可以通过 (定时器中断屏蔽寄存器)TIMSK单独进行屏蔽。解释:TIMSK寄存器是一个定时器/计数器中断屏蔽寄存器,就是说TIMSK可以去单独屏蔽一些中断。适用于内部的定义: BOTTOM 计数器达到0x00时即达到BOTTOM     MAX:计数器计数达到最大值时达到MAX时钟源的配置:可以选择内部时钟配置或者外部时钟配置。计数器的操作:对于计数器来说,计数器计数始终增加,当计数器值超过0xff时,从ox00开始重新计数。当TCNT0计数器置为0时,溢出标志位TOV0置位。TOV0可以通国定时器溢出中断清零
发表于 2018-07-16 20:42:20

AVR单片机ATMEGA8 USART的使用

; Tx        PORTC.1=1;delay_ms(10)    //定义C1作为信号收发线     #define  Rx        PORTC.1=0;delay_ms(10)(2)设定USART各个寄存器,将其初始化,如果使用CVAVR的话可以很方便的自动生成代码。如下。//USART initialization 通用同步和异步串行接收器和转发器(USART)// Communication
发表于 2018-07-16 20:41:43

关于AVR ATmega8 串口数据协议传输的奇偶校验码的一点想法

和两位奇偶校验位 XX XX XX XX XX XX,发送给单片机后,单片机会在收数据的中断函数中进行判断和校验,如果数据无误则可以通过发送信号线将信号发送给PC机。   下面说一下AVR单片机烧写的一些小陷阱,博主在AVR开发的下载软件使用的是AVR_FIGHTER,这个烧写软件有比较有趣的地方,就是在下图中的界面。首先需要装载FLASH 装载EEPROM 然后可以尝试读取FLASH EEPROM等。有没有成功接入硬件设备需要进行读取的操作,在这里我们需要在芯片特征字和熔丝位进行读取,在博主手中的ATmega8中的熔丝低位是BF 熔丝高位是D9然后烧写程序的时候要记得勾选应该选择的选项,像如图中的选项基本要勾选
发表于 2018-07-16 20:40:48

AVR单片机中ATmega8的AD转换探究

AD采集最好要满足的条件:采样频率不小于被采集信号最高频率的两倍,则采样输出信号就可以无失真的重新啊还原输入信号,通常的实际应用中,采样频率为采集最高频率的5-10倍。AD芯片的数据输出方式有串行和并行两种方式,对于AVR单片机来说A/D芯片和AVR单片机接口是需要考虑的一些问题:(1)模拟信号输入的连接:单端输入时,VIN+引脚直接与信号输入连接,VIN-接地。差分输入时,单端输入正信号,VIN+引脚直接与信号连接,VIN-引脚接地。单端输入负信号,VIN-引脚与信号连接,VIN+引脚接地。(2)数据输入线与系统总线的连接:有可控制的三态输出门时候可以直接和系统总线连接,没有输出门的时候要通过I/O口进行连接。(3)启动信号
发表于 2018-07-16 20:40:14

AVR中断引起重启

AVR中打开中断但没有相应的中断服务函数,会引起芯片重启,通过分析编译产生的汇编代码可以清楚的理解问题所在。编译器使用 Atmel Atudio7.0芯片:ATmega128A由于没有找到产生汇编代码的方法,因此使用ReAVR进行反汇编。以下为有ISR的情况C语言#include <avr/io.h>#include "avr/interrupt.h" void initTimer3(); int main(void){ initTimer3(); sei(); while(1) {  }//while(1)}  void initTimer3
发表于 2018-07-16 20:36:39

AVR外部中断INT1检测按键,使用LED作指示

实验内容: 使用AVR的外部中断INT1检测PD3Key,如果有按键按下,则唤醒休眠的MCU,并使它的PB口的LED做加1指示。#include <iom16v.h>#define DISP_DDR DDRB#define DISP_PORT   PORTB#define IN_PD3  cbi(DDRD,3)  //PD3#define SET_PD3  sbi(PORTD,3)#define GET_PD3  gbi(PIND,3)//PORTA|=BIT(5);    就是把把第6位置1;//PORTA=~BIT(5);  
发表于 2018-07-16 20:33:46

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved