完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
程序如下,烦请高人指点:
#include #include #include /************************************* 作用:12864宏定义 **************************************/ #define CS_ON (PORTC|=_BV(PC0)) #define CS_OFF (PORTC&=~_BV(PC0)) #define SID_ON (PORTC|=_BV(PC1)) #define SID_OFF (PORTC&=~_BV(PC1)) #define CLK_ON (PORTC|=_BV(PC2)) #define CLK_OFF (PORTC&=~_BV(PC2)) //定义IIC常用函数 #define Start() (TWCR=_BV(TWINT)|_BV(TWSTA)|_BV(TWEN)) // 启动IIC #define Stop() (TWCR=_BV(TWINT)|_BV(TWEN)|_BV(TWSTO)) //停止IIC #define Wait() {while(!(TWCR&_BV(TWINT)));} //等待中断发生 #define TestACK() (TWSR & 0XF8) //测试返回状态 #define SetACK() (TWCR |=_BV(TWEA)) //设置应答 #define SetNOACK() (TWCR &=~_BV(TWEA)) //设置NOTACK #define TWI() (TWCR=_BV(TWINT)|_BV(TWEN)) //启动IIC操作 #define WriteByte(x) {TWDR=(x); TWCR=_BV(TWINT)|_BV(TWEN);} //向TWDR写数据*/ #define START 0X08 #define RE_START 0X10 #define MT_SLA_ACK 0X18 #define MT_SLA_NOACK 0X20 #define MT_DATA_ACK 0X28 #define MT_DATA_NOACK 0X30 #define MR_SLA_ACK 0X40 #define MR_SLA_NOACK 0X48 #define MR_DATA_ACK 0X50 #define MR_DATA_NOACK 0X58 /******************************* 功能:IO口初始化 ********************************/ void init_io (void) { DDRC=0X2F; //0,1,2 口配置为输出为12864的控制端口,3为输出为RS485通信协议的控制端,5口为SCL输出 DDRB=0XEF; //MISO为输入其余的为输出 DDRD=0X02; } /******************************* 功能:Nms延时函数 ********************************/ void delay (unsigned int i) { int x=0,y=0; for (x=0;x for (y=0;y<900;y++); } /******************************* 功能:传送一个字节的数据 ********************************/ void Writebyte_12864 (uint8_t data) { uint8_t i; CS_OFF; delay(1); CS_ON; for (i=0;i<8;i++) { CLK_OFF; if (data&0x80) SID_ON; else SID_OFF; data<<=1; CLK_ON; CLK_OFF; } } /******************************* 功能:位12864写入命令 ********************************/ void WriteCom_12864 (uint8_t com) { CS_ON; delay(1); Writebyte_12864(0xF8); Writebyte_12864(com&0xF0); Writebyte_12864((com<<4)&0xF0); CS_OFF; } /******************************* 功能:12864写入命令 ********************************/ void WriteData_12864 (uint8_t data) { CS_ON; delay(1); Writebyte_12864(0xFA); Writebyte_12864(data&0xF0); Writebyte_12864((data<<4)&0xF0); CS_OFF; } /******************************* 功能:配置12864 ********************************/ void LCD_12864_config (void) { WriteCom_12864 (0x30); delay (1); WriteCom_12864 (0x06); delay (1); WriteCom_12864 (0x0C); delay (1); } /******************************* 功能:显示8位长度的数字 ********************************/ void display_diangding8 (int32_t i) { int32_t a[8]; uint8_t j; a[0]=i/10000000; a[1]=i%10000000/1000000; a[2]=i%1000000/100000; a[3]=i%100000/10000; a[4]=i%10000/1000; a[5]=i%1000/100; a[6]=i%100/10; a[7]=i%10; for(j=0;j<8;j++) { WriteData_12864(0x30+a[j]); delay(1); } } /**************************/ #define SDA_OUT DDRC|=_BV(PC4); //SDA输出 #define SDA_IN DDRC&=~_BV(PC4); //SDA输入 #define SCL_OUT DDRC|=_BV(PC5); //SDA输出 #define SCL_IN DDRC&=~_BV(PC5); //SDA输入 #define SDA_ON PORTC|=_BV(PC4); //SDA输出 #define SDA_OFF PORTC&=~_BV(PC4); //SDA输入 #define SCL_ON PORTC|=_BV(PC5); //SDA输出 #define SCL_OFF PORTC&=~_BV(PC5); //SDA输入 void IIC_init () { TWBR=0X20; //禁止中断,使能应答, TWCR=(1< } uint8_t I2C_read(uint8_t ack) { if(ack) //ack置1,将返回应答信号(ack) TWCR=(1< TWCR=(1< return TWDR; } uint8_t ADS1114_init () { Start(); //起始信号 Wait(); if (TestACK()!=START ) return 0; WriteByte(0x90); SetACK(); Wait(); if (TestACK()!= MT_SLA_ACK) return 0; WriteByte(0x01); SetACK(); Wait(); if (TestACK()!= MT_DATA_ACK) return 0; WriteByte(0x42); SetACK(); Wait(); if (TestACK()!= MT_DATA_ACK) return 0; WriteByte(0xe3); SetACK(); Wait(); if (TestACK()!= MT_DATA_ACK) return 0; Stop(); } uint8_t ADS1114_init_pointer () { Start(); //起始信号 Wait(); if (TestACK()!=START ) return 0; WriteByte(0x90); SetACK(); Wait(); if (TestACK()!= MT_SLA_ACK) return 0; WriteByte(0x00); SetACK(); Wait(); if (TestACK()!= MT_DATA_ACK) return 0; Stop(); } uint16_t ADS1114_read () { uint16_t AD_H,AD_L; uint16_t vlue; ADS1114_init (); delay(5); ADS1114_init_pointer (); delay(5); Start(); //起始信号 Wait(); if (TestACK()!=START ) return 0; WriteByte(0x91); SetACK(); Wait(); if (TestACK()!= MR_SLA_ACK) return 0; /*AD_H=TWDR; display_diangding8 (AD_H); delay(10); AD_L=TWDR; display_diangding8 (AD_L);*/ AD_H=I2C_read(0); display_diangding8 (AD_H); //delay(10); AD_L=I2C_read(0); display_diangding8 (AD_L); Stop(); vlue=AD_H*256+AD_L; return vlue; } int main () { uint16_t i; init_io (); IIC_init (); LCD_12864_config (); ADS1114_init (); ADS1114_init_pointer (); i=ADS1114_read (); //display_diangding8 (i); //display_diangding8 (77777777); while (1) { delay(300); } } 出来的现象是,在AD0口不输入电压,得到的数据是29439,电路是这样接的,接上电源和地线还有SDA,SCL接单片机的SDA和SCL引脚,其他的悬空。 |
|
相关推荐
3 个讨论
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5130 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7772 浏览 0 评论
3033 浏览 2 评论
3107 浏览 1 评论
10061 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 23:25 , Processed in 0.694231 second(s), Total 64, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号