AVR PCF8591 AD&DA数码管显示

2019-11-11来源: 51hei关键字:AVR  PCF8591  AD&DA  数码管显示

#include "iom16v.h"

#include "macros.h"

#define uchar unsigned char

#define uint unsigned int

/*******************************************

TWSR中数据的各种状态,#include"iom16v.h"

#include "macros.h"

#define uchar unsigned char

#define uint unsigned int

/*******************************************

TWSR中数据的各种状态,参照mega 16手册172页

*******************************************/

//主模式启动状态

#define START 0X08//启动总线

#define RESTART 0X10//再启动总线

//主机发送模式各种状态

#define MT_SLA_ACK 0X18//SLA_W写地址已发送,收到应答位

#define MT_SLA_NACK 0X20//SLA_W写地址已发送,收到非应答位

#define MT_DATA_ACK 0X28//写数据已发送,收到应答位

#define MT_DATA_NACK 0X30//写数据已发送,收到非应答位

#define MT_ARB_LOST 0X38//SLA_W或者数据仲裁失败

//主接收模式各种状态

#define MR_ARB_LOST 0X38//SLA_W或者数据仲裁失败

#define MR_SLA_ACK 0X40//SLA_R已发送,收到应答位

#define MR_SLA_NACK 0X48//SLA_R已发送,收到非应答位

#define MR_DATA_ACK 0X50//收到数据,返回应答位

#define MR_DATA_NACK 0X58//收到数据,返回非应答位

//IIC操作

#define Start()(TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN))

#define Stop()(TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN))

#define TestACK() (TWSR&0Xf8)//TWSR前五位状态

#define Send() (TWCR=BIT(TWINT)|BIT(TWEN))

#define SendAck() (TWCR|=BIT(TWEA))

#define SendNoAck() (TWCR&=~BIT(TWEA))

#define ReadNoAck()   (TWCR=BIT(TWEN)|BIT(TWINT))

#define ReadAck()(TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA))

#define Wait() while(!(TWCR&BIT(TWINT)))//等待TWINT置1

uint i;

////////////////////////////////////

void twi_init()

{

   TWBR=0X12;

         TWSR=0;

         TWCR=0X44;

}

////////////////////////////////////////////////////////////////写函数

uchar write_data(uchar add, uchardata,uchar data1)

{

   Start();

         Wait();

         if(TestACK()!=START)

         {

           PORTA=0x01;

         }

         TWDR=add;

         Send();

         Wait();

         if(TestACK()!=MT_SLA_ACK)

         {

            PORTA=0x04;

         }

         TWDR=data;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {

            PORTA=0x10;

         }

         TWDR=data1;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {

            PORTA=0x20;

         }

         Stop();

         delay(1);

         

         

}

//////////////////////读函数//////////////////////////////////////////////////

uchar Read(uchar data)

{

uchar team;

Start();

Wait();

if(TestACK()!=START)

         {show(8,1);

           PORTA=0xfe;

         }

         TWDR=0x90;

         Send();

         Wait();

         if(TestACK()!=MT_SLA_ACK)

         {show(8,1);

            PORTA=0xfb;

         }

         TWDR=data;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {show(8,1);

            PORTA=0xff;

         }

         Start();

         Wait();

         if(TestACK()!=RESTART)

         {show(8,1);

           PORTA=0xff;

         }

         TWDR=0x91;

         Send();

         Wait();

         if(TestACK()!=MR_SLA_ACK)

         {show(8,1);

            PORTA=0xff;

         }

         ReadNoAck();

         Wait();

         delay(1);

         if(TestACK()!=MR_DATA_NACK)

         {show(0,1);

            PORTA=0xff;

         }

         team=TWDR;

          Stop();

          return team;show(8,0);

         

}

///////////////////////////////////////////////////////////////////////

const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,

                             0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

const table1[]={0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void delay(uint ms)

{

       uint i,j;

         for(i=0;i

            {

            for(j=0;j<1141;j++);

      }

}

void show(uchar j,uchar k)

{

         DDRB=0XFF;

         DDRD=0X03;

         PORTD=0X02;   

         PORTB=table[j];

         PORTD=0X01;

         PORTB=table1[k];

   delay(1);

}

///////////////////////////////////////////////////////////

main()

{

uint a=0,temp;

twi_init();

DDRA=0XFF;

while(1){

a++;

write_data(0x90,0x44,a);

if(a>200) {a=0;}

temp=Read(0x42);

show(temp/100,1);

show(temp%100/10,2);

show(temp%100%10,3);

}

}参照mega 16手册172页

*******************************************/

//主模式启动状态

#define START 0X08//启动总线

#define RESTART 0X10//再启动总线

//主机发送模式各种状态

#define MT_SLA_ACK 0X18//SLA_W写地址已发送,收到应答位

#define MT_SLA_NACK 0X20//SLA_W写地址已发送,收到非应答位

#define MT_DATA_ACK 0X28//写数据已发送,收到应答位

#define MT_DATA_NACK 0X30//写数据已发送,收到非应答位

#define MT_ARB_LOST 0X38//SLA_W或者数据仲裁失败

//主接收模式各种状态

#define MR_ARB_LOST 0X38//SLA_W或者数据仲裁失败

#define MR_SLA_ACK 0X40//SLA_R已发送,收到应答位

#define MR_SLA_NACK 0X48//SLA_R已发送,收到非应答位

#define MR_DATA_ACK 0X50//收到数据,返回应答位

#define MR_DATA_NACK 0X58//收到数据,返回非应答位

//IIC操作

#define Start()(TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN))

#define Stop()(TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN))

#define TestACK() (TWSR&0Xf8)//TWSR前五位状态

#define Send() (TWCR=BIT(TWINT)|BIT(TWEN))

#define SendAck() (TWCR|=BIT(TWEA))

#define SendNoAck() (TWCR&=~BIT(TWEA))

#define ReadNoAck()   (TWCR=BIT(TWEN)|BIT(TWINT))

#define ReadAck()(TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA))

#define Wait()while(!(TWCR&BIT(TWINT)))//等待TWINT置1

uint i;

////////////////////////////////////

void twi_init()

{

   TWBR=0X12;

         TWSR=0;

         TWCR=0X44;

}

////////////////////////////////////////////////////////////////写函数

uchar write_data(uchar add, uchardata,uchar data1)

{

   Start();

         Wait();

         if(TestACK()!=START)

         {

           PORTA=0x01;

         }

         TWDR=add;

         Send();

         Wait();

         if(TestACK()!=MT_SLA_ACK)

         {

            PORTA=0x04;

         }

         TWDR=data;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {

            PORTA=0x10;

         }

         TWDR=data1;

         Send();

         Wait();

         if(TestACK()!=MT_DATA_ACK)

         {

            PORTA=0x20;

         }

         Stop();

         delay(1);

         

         

}

//////////////////////读函数//////////////////////////////////////////////////

uchar Read(uchar data)

{

uchar team;

Start();

Wait();

if(TestACK()!=START)

         {show(8,1);

           PORTA=0xfe;

         }

         TWDR=0x90;

         Send();

         Wait();

         if(TestACK()!=MT_SLA_ACK)

         {show(8,1);

            PORTA=0xfb;

         }

         TWDR=data;

         Send();

[1] [2]
关键字:AVR  PCF8591  AD&DA  数码管显示 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479600.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机红外遥控键值解码实验
下一篇:Atmega32A驱动LCD1602显示屏

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

推荐阅读

avr单片机汇编参考程序
该AVR的汇编程序选自《M128》,程序中体现了AVR汇编的基本特点,仅供大家参考。该应用系统为一个带1/100秒的简易24小时制时钟,它在上电后能够自动从11时59分55秒00开始计时和显示时间。下图为简易时钟系统硬件电路图。                           图  简易24小时时钟硬件原理图系统使用8个LED数码管显示时、分、秒、1/100秒4个时段的数字,每个时段占用2个LED。显示方式采用动态扫描方式
发表于 2019-11-14
avr单片机汇编参考程序
AVR单片机一些学习笔记
下面是自己在学习AVR单片机时的学习经验,分享出来给大家,一起学习。1、AVR单片机采用RISC架构,8051单片机采用CISC架构。 前者速度为后者的2~4倍,为流水线操作指令。2、 AVR单片机有32个通用寄存器(地址在RAM区从$0000开始到$001F),其中有6个(最后6个)合并为3个16位的X,Y,Z寄存器,用来存放地址指针,Z寄存器还可以寻址程序存储器。3、 哈佛结构,131条机器指令。4、 延迟开机功能。5、 内部自带RC振荡器,可提供1/2/4/8MHZ的工作时钟。6、 FLASH+EEPROM+SRAM+SPI+USART+TWI+PWM+RTC+10位ADC+模拟比较器+JTAG。7、 堆栈指针向下增长,51
发表于 2019-11-14
avr单片机mega32之ADC程序
查手册,写程序,有问题再讨论*****************************************************************//CPU:mega32//编译器:iar#include <ioavr.h>#include "adc.h"int main(void){        int m;adc_init();             m = adc_get(0);     &n
发表于 2019-11-14
AVR I2C通信程序
uchar SDA_Return(void)//0-low level  1-hign level{          uchar flag;          uchar oldSREG=SREG;          SREG&=~(_BV(7));       DDRC&=0xfd;   PORTC|=_BV(PC1);   i
发表于 2019-11-14
ICC-AVR DS1821S温度报警程序
用DS1821的测温报警输出功能,已经过实测,可以用的,已批量用于产品。//ICC-AVR application builder : 2015-10-8 14:15:46// Target : M8// Crystal: 8.0000Mhz/*新片烧录程序,电容加热温度高低设置成0x14,0x13;化雪板设置成0X02,0X00*/#include <iom8v.h>#include <macros.h>#define uchar         unsigned char #define uint        
发表于 2019-11-14
基于LabVIEW和AVR单片机的镇痛仪系统实现
摘要:通过对穴位施加低频的脉冲电压刺激穴位神经释放内源性物质,从而达到减轻疼痛的作用已经被证实。基于此医学原理,本系统使用LabVIEW编写上位机控制界面,通过NIVISA模块驱动USB进行实时通信,采用高性能AVR主控芯片设计下位机,从而实现宽范围数字升压(12~100V)的高质量互补对称脉冲波稳定输出特性。在疼痛疾病的治疗以及医疗保健治未病等领域将有广泛的应用。疼痛治疗一向是临床医学深感棘手的问题之一,在疼痛治疗领域,穴位刺激镇痛一直备受推崇,即通过对穴位施加低频的脉冲电压实现对神经系统的刺激,使其释放阿片肽,达到减轻疼痛的目的。上世纪80年代以来,电子技术在疾病诊疗领域的取得广泛应用,穴位刺激镇痛治疗仪器成为其中的一个研究
发表于 2019-11-14
基于LabVIEW和AVR单片机的镇痛仪系统实现
小广播
何立民专栏 单片机及嵌入式宝典

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

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