求助单片机iic高手关于iic通信应答位读取问题

时序的重要特点是在时钟为高电平期间作出各种变化来表示起始,终止,应答,非应答,发送数据时是在时钟为高电平期间让稳定,读数据是在为高电平期间采样从设备的数据,所以起始,终止,应答,非应答,发送数据都要先操作,再操作,如果先操作,则会导致起始,终止,应答,非应答,发送数有干扰。
以信号为例:
写成这样是对的
这样是有问题的
接收数据为读线的数据,不会有这个问题。
时序的数据传送从高位开始
从本质上理解,主机给从机发送数据,从机是在时钟的下降沿采集的数据,所以主机给出的个时钟是有讲究的,你要给出有个下降沿的时钟,应当是这样的:
而不是这样的
所以代码这样写是对的:
这样写会少了一个下降沿,丢掉一个数据位
主机从从机读取数据,本质上是从机检测主机发出的时钟信号有个上升沿
所以读数据代码一定要写出有个上升沿
所以,同样是个时钟,发送接收数据对于时钟有不同的要求
连续从读取数据,第一个读出来的是对的,往后读出来的都是,原因是当读取第一个字节时,主机给从机的应答信号将拉低,即线被钳住,从从机读取数据时,给出的高电平无法将线拉高,导致读出来的数据都为,所以在读取一个新的字节时,一定要将拉高,才可以正常接收的数据。
本文已收录于以下专栏:
相关文章推荐
EEPROM种类很多,基本上采用的都是IIC通信协议。具体的接口细节网上资料很多,用到的时候随便去哪个论坛都可以下载到,这里对开发的时候遇到的几个小问题做自问自答式的小总结。
自问自答:
STM32软件模拟IIC总线协议,利用总线协议读取TMP112数字温度传感器的数据,TMP112为12位数字传感器。...
这里将我编写的STC12C5A60S2单片机控制EEPROM芯片AT24C02的程序共享一下,是希望前辈们给予斧正 。...
最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!
在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微...
先简单的说明以下I2C
I2C 总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。
处理器和芯片间的通信可以形象的比喻成两个人讲话:1、你说的别人得能...
IIC器件是一种介于高速和低速之间的嵌入式外围设备,其实总体来说,它的速度算是比较慢的。通常情况下,速度慢的器件意味着更多的等待,这对于精益求精的嵌入式工程师来说,简直就是一个恶梦,低速器件的存取数据...
IIC是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA)。
IIC是总线结构,1个Master,1个或多...
利用51单片机的I/O口来模拟IIC协议,加深对其时序的理解,其次学习AT24c1024b的读写方法.已经通过运行代码如下:
#include//包含_nop_()函数
#include "..\config\c.h"
#include "..\config\const.h"
#include "..\driver\system.h...
关于郭天祥单片机书上第182页IIC工作时序分析
IIC总线通信控制流程:
一.总线初始化
二.启动信号
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)求助关于火花机系统-专业自动化论坛-中国工控网
求助关于火花机系统
给TA发消息
加TA为好友
发表于: 10:16:20
有哪位做过火花机系统研究的,用C语言写的程序,编译写入DOC,现需把它还原成C语言,再在原程序上做修改。可以做的联系QQ
给TA发消息
加TA为好友 发表于: 15:19:52 1楼
是说反编译吗?
这个听说很难,
不是人干的
给TA发消息
加TA为好友 发表于: 16:34:16 2楼
这个工作可以作为两部分
第一部分 读懂反汇编代码
第二部分 用C重写
的确很难也很慢
给TA发消息
加TA为好友 发表于: 14:11:39 3楼
单片机培训视频-ARM培训-dsp-CPLD-FPGA开发视频-嵌入式系统开发视频
◆◆◆◆◆◆◆
单片机视频教程介绍
这是一部学单片机革命性的视频教程,每讲3小时左右,讲座从最基本的预备知识开始讲起,非
常详细的讲解KEIL编译器的使用,包括软件仿真,测定时间,单步
运行,全速运行,设置断点,调试,硬件仿真调试,变量观察等,
整个过程全部用单片机的C语言讲解,从C语言的第一个主函数
MAIN讲起,一步步一条条讲解每一个语法,每条指令的意思,即
使对单片机一巧不能,对C语言一无所知,通过本课程的内
容也可以让你轻松掌握51单片机的C语言编程设计,全新的讲课风
格跳过复杂的单片机内部结构知识,首先从单片机的应用讲起一步
步深入到内部结构,让学生彻底掌握其实际应用方法,把51单片机
的所有应用每个部分都讲解的非常仔细,教师在教室前面用电脑一
条一条写程序,旁边单片机实验板一个实验一个的演示,
给学员解释每条指令的意思及原理,通过十天的时间让学生完全掌
握单片机的C语言编程。全程的屏幕,声音,用屏幕录像,实验板
现象用摄像头拍摄,这部教程算是国内首个如此创新的以教师亲自
实践为主,学员现场写程序,直接下载到实验板看现象,讲单片机
的视频教程,只要你认真看,认真听,保证很快让你学会单片机
------------------------------------------------------
一 ,预备知识
点亮一个发光管 单片机能做什么,基本电子知识,C51知识简介,点亮
一个发光管,如何申请免费芯片样品。
二,流水灯设计蜂鸣器发声
简单延时程序、子程序调用、带参数子程序设计、流
水灯同时蜂鸣器响、如何驱动蜂鸣器,及如何驱动继
电器,集电极开路的概念及应用
三,数码管显示的原理、
数码管的静态显示共阳、共阴数码管显示原理、定时器工作方式介绍、
重点讲述工作方式2、中断概念及中断函数写法、定
时器中断应用
四,数码管的动态显示原理及应用实现
动态扫描概念、定时器、中断加深
五,独立键盘、矩阵键盘的检测原理及实现
键盘检测、消抖、键盘编码、
带返回值函数写法及应用
六,AD、DA的工作原理及实现
模拟电压与数字电压的关系、
为什么要使用AD及DA、ADC0804的操作方法、DAC0832的操作方法
七,串口通讯原理及操作流程
串口通讯工作方式、重点讲述最常用的10位数据通讯、
波特率概念及如何根据波特率计算定时器初值
八,IIC总线AT24C02芯片工作原理,IIC总线工作原理、
目前非常通用的一种通信机制
九,1602液晶显示原理及实现
最简单液晶工作原理、如何开始对一个没有任何概念的芯片开始单片机的操作
十,电路图绘制全过程
最顶级电路板设计软件Altium Designer使用、
元件库、封装库设计、绘制原理图、错误检查、
生成PCB、手动、自动布线、送去加工
----------------------------------------------
◆◆AVR单片机视频内容◆◆:
第一讲:开发板和软件的操作使用
1、介绍配件。
2、安装软件(ICC AVR 和AVR STUDIO)及其使用,括新建工程、程序下载,仿真调试;整板测试;板上资源。
3、着重介绍一下USB接口的仿真器。
第二讲:AVR单片机的概述和C语言的基础知识
1、AVR单片机的概述包括它的优点、片上资源。
2、C语言的基础包括电平特性、2进制与16进制的表示及转换、二进制数的逻辑运算,数据类型,运算符。
3、着重讲一下特有的BIT()操作,C中的各种语句。
4、介绍一下AVR单片机IO口的配置。
第三讲:点亮发光二极管、驱动蜂鸣器、继电器
1、首先讲解一下原理图上开关电路、复位电路、时钟电路;
2、讲解573工作原理,
3、首先点亮一个发光二极管,然后让一个二极管亮灭变化。
4、编写函数证明573的工作原理:锁住后不导通就不能再更新数据。
5、编写延时函数,软件仿真查看延时的精确时间
6 子函数的编写(分带形参和不带形参)。
7、编写流水灯函数。
8、蜂鸣器,继电器的工作原理并编写程序。
第四讲:数码管工作原理
1、共阴共阳数码管内部结构,显示原理。
2、用数字万用表标定数码管的段选和位选
3、编写程序使1个数码管上显示数字
4、编写程序在6个数码管上滚动显示数字
5、重点讲解动态显示,保持时间,以及扫描频率对闪烁和亮暗程度的影响。
第五讲:键盘检测原理(比较复杂)
1、键盘作用,检测原理,如何消抖,独立键盘检测程序编写。
2、矩阵键盘检测程序编写,涉及到返回值函数调用。
第六讲:1602液晶的使用
1、看手册,管脚、写指令和数据、时序图。
2、编写程序,显示光标
3、编写程序显示字,
4、编写程序,滚动显示字符
第七讲:中断、定时器的原理和应用(比较复杂)
1、中断的概念,AVR单片机的中断
2、定时/计数器1几种模式的寄存器配置
3、定时器1普通模式下实现秒表
4、CTC模式输出方波
5、快速PWM模式输出PWM信号
6、相位修正PWM模式输出PWM信号
第八讲:AD、DA简介及其应用
1、AD简介,AVR内部AD寄存器设置
2、编写程序控制AD读写电位器输出的模拟电压
3、SPI串行通信简介
4、DA简介,AD5300时序图
5、编写程序控制DA输出模拟电压使发光二极管亮度变化
第九讲:TWI(IIC)
1、TWI(IIC)协议简介
2、AVR单片机内部TWI寄存器简介,操作流程
3、具有IIC协议的数字电位器芯片AD5161的简介
4、编写程序用独立键盘控制AD5161输出不同的阻值
第十讲:异步串口UART的简介和程序的编写
1、UART简介
2、AVR单片机内部与UART相关的寄存器的配置
3、编写程序控制AVR单片机和电脑进行通信
4、讲解串行通信时数字和字符之间的区别
第十一讲:PS2键盘、DS1302的工作原理和程序的编写
1、AVR单片机外部中断的介绍
2、PS2键盘的工作原理
3、讲解程序,读取PS2键盘的按键值并在1602液晶上显示
4、DS1302的工作原理
5、讲解程序,控制1302工作并在1602液晶上显示时间
--------------------------------------------------
◆◆MSP430单片机视频◆◆:
第一部分 硬件结构
第一讲 概述
第二讲 复位、中断和IO
第三讲 异步通信接口1
第四讲 异步通信接口2
第五讲 定时器
第六讲 FLASH
第七讲 ADC12
第二部分 软件使用
第一讲 软件使用
第三部分 基础程序
第一讲 入门和低功耗
第二讲 时钟和IO
第三讲 比较器和定时器和ADC
第四部分 模块程序
第一讲 控制电路和流水灯
第二讲 键盘
第三讲 蜂鸣器和数码管
第四讲 1602液晶和电平转换
第五讲 EEPROM和18B20和DS1302
第六讲 RS232和RS485接口
第七讲 USB接口
第八讲 ADC和DAC
==============================
◆◆PIC 单片机 视频◆◆
前言:时间:10分。
内容:MPLAB、PICC软件的安装、USB下载驱动安装。
Lesson1:时间:1小时44分。
内容:PIC单片机简介、软件使用方法、新建工程、软件调试、流水灯程序实现。
Lesson2:时间:27分。
内容:数码管的静态显示与动态显示原理及实现。
Lesson3:时间:53分。
内容:PIC单片机独立键盘检测原理及实现。
Lesson4:时间:45分。
内容:PIC单片机矩阵键盘检测原理及实现。
Lesson5:时间:46分。
内容:PIC单片机控制继电器原理及实现。
Lesson6:时间:2小时20分。
内容:PIC单片机控制DS18B20数字温度传感器原理及实现。
Lesson7:时间:53分。
内容:PIC单片机定时器0的使用方法。
Lesson8:时间:34分。
内容:PIC单片机定时器1的使用方法。
Lesson9:时间:32分。
内容:PIC单片机定时器2的使用方法。
Lesson10:时间:1小时01分。
内容:PIC单片机内部模数转换器AD的使用方法。
Lesson11:时间:1小时50分。
内容:PIC单片机内部SPI通信接口的使用方法。
Lesson12:时间:2小时12分。
内容:PIC单片机内部IIC通信接口的使用方法。
Lesson13:时间:53分。
内容:PIC单片机串行口使用。
===============================
【ARM培训视频】课程主要内容
1.概念和基本工具:
嵌入式系统基本概念、嵌入式操作系统介绍
嵌入式系统开发的过程和基本结构
Linux基本操作命令的使用
常用工具使用:vi /gcc/gdb等
编写shell程序 和makefile文件结构
2.硬件结构及原理讲解:
ARM7~ARM9体系结构体系结构介绍
ARM7(9)TDMI处理器内核及指令集介绍
讲解SUMSUNG 44B0X 开发板原理图
讲解SUMSUNG 2410 开发板原理图
ARM开发工具ADS的使用
3.Linux部分:
Uclinux,mizilinux系统引导程序bootloader原理和实现过程:Uboot、vivi等
ARM系统空间划分及系统映射方法
bootloader内核下载模式实现 :tftp、Xmoden
linux操作系统原理及组成
介绍linux系统目录组织结构
linux 运行基理,系统运行过程
配置裁减编译linux内核
4.讲解Linux进程特性:
进程属性和状态转换;进程控制与调度;进程相关系统调用,构建守护进程
进程间通信: 进程通信的基本概念,管道、信号、消息队列、信号量、共享内存。
网络通讯接口,socket通信编程。
串口通讯程序和编程实践
多线程程序设计
5.Linux设备驱动:
uClinux内核模块及设备驱动程序开发
介绍linux驱动程序分类和各自操作系统上下层接口
驱动开发实例:蜂鸣器驱动、按键驱动开发、串口驱动、触摸屏驱动、网络驱动开发、USB驱动、液晶屏驱动等。
ARMlinux移植过程。
引导程序Uboot移植。
最小系统启动开发过程。
嵌入式文件系统移植:ramdisk、JFFS2、yaff
6.综合试验:
实现网络文件传输服务程序;
构建嵌入式WEB服务器;
移植mediaplay播放器
开发嵌入式视频服务器,基于H.264协议
**************************************
=======第一部分单片机相关============
1,【单片机多媒体视频教程】(汇编)非常经典
2,【单片机入门与提高精品视频教程】(汇编),非常适合初学者.
3,【数电/模电精品视频教程】,非常适合初学者.
4,【汇编语言精品视频教程】,非常适合初学者.
5,【protel99se+DXP/2004 视频教程+实例】,非常适合初学者.
6, 【Protel(Altium Desinger)】电路设计视频教程
7, 【PowerPCB入门视频教程】
8,【单片机的C语言编程及电路设计培训视频教程】
9,【高等数学视频】
10, 【标准C语言入门与提高视频教程】非常经典
11,【AVR单片机入门与提高视频】
12,【MSP430单片机经典视频】
13,【PIC单片机经典视频】
14,【电路分析应用技术视频】
================第二部分嵌入式硬件部分====================
1,【ARM linux培训视频】 2.《学ARM和学单片机一样简单》视频教程
3,【ARM嵌入式LPC2200视频教学视频教程《嵌入式系统与结构》 】
4,【ARM7嵌入式S3C44B0视频教学《嵌入式微处理器原理及应用》】
5,【ARM嵌入式视频《嵌入式原理与应用》】
6,【Altera FPGA 视频教程】
7,【EDA(CPLD FPGA)入门与提高视频教程】
8,【dsp入门与提高视频教程】 9,【DSP多媒体教程】
10,【嵌入式系统开发技术视频】 11,【vhdl应用技术视频】
12,【PLC精品视频】 13,【数控应用经典技术视频】
14,【 嵌入式系统 视频】 15,【 台湾嵌入式培训视频】
====================第三部分嵌入式软件部分====================
1,【Windows CE入门与提高视频教程】 2,【Vxworks应用技术】
3,【linux编程入门与提高视频教程】 4 【linux工程师软件开发视频】
5,【eCos、uC/OS-II开发技术】 6,【C++编程入门与提高视频教程】
7,【嵌入式仿真开发】
8,【JAVA开发视频】 9,【.net开发视频】
---------------------------------------------------------
意者请直接QQ联系QQ:
(知心365学习中心-|电子|单片机|嵌入式|linux|通讯|ARM|计算机|编程设计|机械|医学|外语日语英语法语|金融|培训视频资料|职业职称考试|考研|大学教程|升学考试|财务|经营管理|网络|模具设计|成人考试|资格考试|芯片级电脑显示器笔记本数码主板手机硬盘复印机打印机维修|自学考试|研究生入学考试视频教程资料汇总)
周点击排行周回复排行
[0] [0]最新求助
[0] [0] [9] [3] [4] [0] [7] [5] [3] [4]一个关于IIC通信应答验证的问题 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
一个关于IIC通信应答验证的问题
16:12:12  
大家好,下面是我写的一个IIC发送8位数据的函数,请大伙看看其中验证应答位我是怎样写的?
/*************************************
函数名称:senddat
功能描述:带应答位,如果未收到应答位重试几次
**************************************/
void senddat(uchar dat)
uchar i,j=2,
for(i=0;i&8;i++)
if(dat&num==0)sda=0;
else sda=1;
}while(sda&&j--);//当收到应答0时,或超过一段时间后停止发送
if(j==0){报警函数}
这是一个I2C发送8位数据函数,我想验证一下应答位,这样写行吗?因为手头没有板子调试不了,
高级工程师
16:47:09  
17:10:09  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
lovezjf234 发表于
谢谢版主,
17:37:13  
谢谢版主。。。
17:48:49  
17:52:07  
寂寒 发表于
见笑了,呵呵
16:18:15  
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司PIC 硬件IIC通信,从器件应答问题 - 【PIC单片机】 -
电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 3510|回复: 4
PIC 硬件IIC通信,从器件应答问题
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
& & 请教个问题,现在手头上有个板子,主控是18F6520,有一支持协议的,模拟量转换芯片。现在想通过ADS1115来测量模拟电压,采用PIC内部硬件IIC与AD芯片通信,问题是ADS1115没有应答信号,也没收到数据?板子上IIC从器件一共有三个,ADS,pcf8563,这三个器件是接在同一IIC口上的,但是器件地址不同,PIC同24C08通信,发数据,24C08有应答,可就是ADS1115也没有应答。AD芯片是好事的,因为AD芯片在51开发板上用IO口模拟IIC时,能成功与其通信并读出测量值,到了PIC板子上就不能通信了。
& &各位大侠看看,程序到底出了什么问题了,都调试了好几天了,一点进展都没有。。。
#include &pic18.h&
#include &pic18fxx20.h&
#include &math.h&
#include &ADS1115.h&
/********************************引脚分配*******************/
//---lcd控制线
# std RA4& & & & // 串行数据端口
#define cs RA5 // lcd片选
#define s RC1& & & & // 写数据时钟
#define LEDK RB3& & & & //液晶背光控制
#define SCL RC3
#define SDA RC4& & & &
//---ADS1115
#define ADDRESS& & ADDRESS_0& &//ADDR PIN -&GND
#define ADDRESS_W&&ADDRESS|0x00&&//写地址
#define ADDRESS_R&&ADDRESS|0x01& & //读地址
/*************Config Initial*********************/
#define OS& && && &OS_1
#define MUX_A0& &&&MUX_4& && &//AINp=AIN0, AINn=GND
#define MUX_A1& &&&MUX_5& && &//AINp=AIN1, AINn=GND
#define MUX_A2& &&&MUX_6& && &//AINp=AIN2, AINn=GND
#define MUX_A3& &&&MUX_7& && &//AINp=AIN3, AINn=GND
#define PGA& && &&&PGA_0& && &//FS=6.144V
#define MODE& && & MODE_1& &&&//Continuous conversion mode
#define DR& && && &DR_7& && & //Data Rate = 860
#define COMP_QUE& &COMP_QUE_3
void ADS1115Init(unsigned int mux);
unsigned int ADS1115Read(void);
/***********************************自定义变量********************/
#define uint&&unsigned int
#define uchar unsigned char
//----液晶相关
#define x1& & 0x80
#define x2& & 0x88
#define y& &&&0x80
#define comm&&0
#define dat& &1
uchar LcdRam[4][17];//LCD缓冲区4行*16字节
uchar datachar[10];//液晶数值数据缓冲区---
uchar timebuff[6];//时间缓冲区---10:10
uchar date_lcd[16];//日期&&
uchar time_lcd[16];//时间,周&05:05:05 4&
uchar di_lcd[16];//DI&DI=&
uchar do_lcd[16];//Do&Do=&
uchar ai_lcd[4][16];//AI&AI1=XXXXX&
void delay(unsigned int i);//延时
void intdelay(unsigned int i);//中断延时
void low_intdelay(unsigned int i);
//-----中断函数
void interrupt&&_int_ (void);//中断处理函数
void interrupt low_priority LOW_ISR(void);
/******************子函数定义*******************************/
void ADS1115Init(unsigned int MUX)
& & & & unsigned int C
& & & & Config=0x0000;
& & & & Config = OS+MUX+PGA+MODE+DR+COMP_QUE;
& & & & SEN=1;//产生启动信号
& & & & delay(100);
& & & & do{;}while(SSPIF==0);
& & & & SSPIF=0;
& & & & SSPBUF=ADDRESS_W;//从地址
& & & & do{;}while(ACKSTAT==1);//应答信号
& & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & & & SSPBUF=Pointer_1;//寄存器地址
& & & & do{;}while(ACKSTAT==1);//应答信号
& & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & SSPBUF=Config/256;
& & & & do{;}while(ACKSTAT==1);//应答信号
& & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & while(BF);
& & & & SSPBUF=Config%256;
& & & & do{;}while(ACKSTAT==1);//应答信号
& & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & while(BF);
& & & & & & PEN=1;//产生停止信号
& & & & & & do{;}while(SSPIF==0);
& & & & SSPIF=0;
& & & & delay(100);
unsigned int ADS1115Read(void)
& & & & SEN=1;//产生启动信号
& & & & & & //delay(100);
& & & & do{;}while(SSPIF==0);
& & & & SSPIF=0;
& & & & SSPBUF=ADDRESS_W;//从地址
& & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & & & SSPBUF=Pointer_0;//寄存器地址(伪写操作)
& & & & & & do{;}while(SSPIF==0);
& & & & SSPIF=0;
& & & & RSEN=1;//重启& & & &
& & do{;}while(SSPIF==0);
& & & & SSPIF=0;
& & & & SSPBUF=ADDRESS_R;//从地址
& & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & & &
& & & & RCEN=1;//接受使能
& & & & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & & & while(BF==0);
& & & & result=SSPBUF*256;
& & & & ACKDT=0;//应答0& &
& & & & & & ACKEN=1;
& & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & RCEN=1;//接受使能
& & & & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & & & while(BF==0);
& & & & result+=SSPBUF;
& & & & ACKDT=1;//应答1& &
& & & & & & ACKEN=1;
& & & & do{;}while(SSPIF==0);
& & & & & & SSPIF=0;
& & & & PEN=1;//产生停止信号
& & & & & & do{;}while(SSPIF==0);
& & & & SSPIF=0;
void wr_lcd (uchar dat_comm,uchar content)//LCD写命令
&&uchar a,i,j;
&&delay (50);
&&for(i=0;i&5;i++)//5个1
& & sclk=1;
& & sclk=0;
&&std=0;//rw=0写
&&if(dat_comm)
& & std=1;& &//rs=1 data
& & std=0;& &//rs=0 command
&&std=0;//插入0
&&for(j=0;j&2;j++)
& & for(i=0;i&4;i++)
& && &if((a&0x80)==0x00)
& && &std=0;
& && &else
& & & && &std=1;
& && &sclk=1;
& && &sclk=0;
& && &a=a&&1;
& & std=0;
& & for(i=0;i&4;i++)
& && &sclk=1;
& && &sclk=0;
void updatelcd(uchar line,uchar row,uchar count,uchar *p)//Lcd按行、列、字节数更新
& & & & //line0-3;row0-7;
& & & & uchar add,i;
& & & & if(line&3 || row&7)
& & & & if(line==0) add=0x80;
& & & & if(line==1) add=0x90;
& & & & if(line==2) add=0x88;
& & & & if(line==3) add=0x98;
& & & & wr_lcd(comm,0x30);
& & & & wr_lcd(comm,add+row);
& & & & for(i=0;i&i++)
& & & & & & & & wr_lcd(dat,p[i]);
& & & & & & & &
/*--------------清DDRAM------------------*/
void clrram (void)
& & & & int i,j;
&&& & & & wr_lcd (comm,0x30);
&&& & & & wr_lcd (comm,0x01);
&&& & & & delay (180);
&&& & & & for(i=0;i&4;i++)
&&& & & & for(j=0;j&17;j++) LcdRam[i][j]=0x20;
void condisp(int LineNum,char ColNum,char width,uchar data)//行反白控制,row起始行,col起始列,width列宽
& & & & uchar rowadd=0, coladd=0;
& & & & uchar i,j;
& & & & if(LineNum&3)
& & & & if(ColNum+width&8)
& & & & if((LineNum==0) || (LineNum==2)) coladd=0x80;
& & & & if((LineNum==1) || (LineNum==3)) coladd=0x90;
& & & & if(LineNum&1)
& & & & & & & & rowadd=0x88+ColN
& & & & else
& & & & & & & & rowadd=0x80+ColN
& & & & for(j=0;j&16;j++)
& & & & & & & & for(i=0;i&i++)
& & & & & & & & {
& & & & & & & & & & & & wr_lcd(comm,0x34);
& & & & & & & & & & & & wr_lcd(comm,coladd+j);
& & & & & & & & & & & & wr_lcd(comm,rowadd+i);
& & & & & & & & & & & & wr_lcd(comm,0x30);
& & & & & & & & & & & & wr_lcd(dat,data);
& & & & & & & & & & & & wr_lcd(dat,data);
& & & & & & & & }
& & & & wr_lcd(comm,0x36);
void init_lcd()//lcd初始化
&&wr_lcd (comm,0x30);&&/*30---基本指令动作*/& &
&&wr_lcd (comm,0x01);&&/*清屏,地址指针指向00H*/
&&delay (400);
&&wr_lcd (comm,0x06);&&/*光标的移动方向*/
&&wr_lcd (comm,0x0c);&&/*开显示,关游标*/
void init_mcu()//初始化
//输入输出方向控制
& & & & TRISA=0x00;//(RA4=RA5=0)
& & & & TRISB=0x04;//(RB3=0 RB2=1)
& & & & TRISC=0x80;//(RC0=0 RC1=0)
& & & & TRISD=0x00;//(RD0-RD7=0)
& & & & TRISE=0x1c;//(RE5=0 RE4-RE2=1)
& & & & TRISF=0//(RF0-RF7=1)
& & & & TRISG=0x04;//
//输出引脚初始化
& & & & //RA没有初始化;
& & & & RB3=0;//背光关闭
& & & & RC0=0;//关闭
& & & & RC6=0;
& & & & PORTD=0//关闭输出
& & & & RE5=1;//关闭键盘
& & & & //RF没有初始化
& & & & //RG没有初始化
//模拟量直接采集设置& & & &
& & & & ADCON0=0x01;//模拟量输入控制:通道编号=0;ADON=1;GODONE=0;
& & & & ADCON1=0x0f;//模拟量输入端口控制:AN0-AN9,VRef+=AVDD,VRef-=AVSS;
& & & & ADCON2=0x81;//模拟量输入控制:Right justified,F/8
& & & & F=0;//
& & & & ADIP=0;//模拟量采集优先级
//从动并口& & & &
& & & & PSPMODE=0;//与从动并口相关
& & & & CVREN=0;//关比较器
& & & & CVROE=0;
& & & & CMCON=0x07;
& & & & RBPU=0;//开RB端口上拉
//中断优先级
& & & & IPEN=1;//开中断优先级
& & & & RBIP=0;//RB口中断优先级
& & & & TMR1IP=0;//定时器1中断优先级
& & & & RC1IP=1;//串口1接收中断优先级
& & & & RC2IP=1;//串口2接收中断优先级
//中断使能
& & & & INT0IE=0;//IN0中断使能位
& & & & INT1IE=0;//IN1中断使能位
& & & & INT2IE=0;//IN2中断使能位
& & & & INT3IE=0;//IN3中断使能位
& & & & RBIE=1;//RB端口电平变化中断使能位
& & & & INTEDG0=0;//IN0中断触发方式
& & & & TMR1H=0X25;//tmr1始终循环启动,为其他定时器的基数,500ms
& & & & TMR1L=0XC3;
& & & & T1CON=0B;//1:8预分频,内部时钟源
& & & & TMR1ON=1;//启动
& & & & TMR1IE=1;//开TMR1中断
//开启所有中断
& & & & GIE=1;& & & &
& & & & PEIE=1;
void init_i2c(void)//初始化IIC总线
& & & & SSPCON1=0x28;//主控模式,时钟=s/(4*(SSPADD+1))
& & & & SSPSTAT=0x80;//标准模式;不需要更新地址;
& & & & & & SSPADD=0x02;//设置时钟
& & & & SSPCON2=0x00;
& & & & SSPEN=1;//总线使能
& & & & SSPIE=0;//禁止进入中断
void lcd_disall(void)//lcd全部显示
& & & & wr_lcd (comm,0x30);
& & & & wr_lcd (comm,0x80);
& & & & for(i=0;i&16;i++)
& & & & & & & & wr_lcd(dat,LcdRam[0][i]);
& & & & wr_lcd (comm,0x90);
& & & & for(i=0;i&16;i++)
& & & & & & & & wr_lcd(dat,LcdRam[1][i]);
& & & & wr_lcd (comm,0x88);
& & & & for(i=0;i&16;i++)
& & & & & & & & wr_lcd(dat,LcdRam[2][i]);
& & & & wr_lcd (comm,0x98);
& & & & for(i=0;i&16;i++)
& & & & & & & & wr_lcd(dat,LcdRam[3][i]);
//主函数定义
void main(void)
& & & & char i=0,j=0;
& & & & un
& & & & //器件初始化
& & & & init_mcu();//初始化单片机
& & & & init_();//初始化串口
& & & & init_i2c();//初始化IIC总线
& & & & init_lcd();//初始化液晶
& & & & LEDK=1;//打开背光电源
& & & & //初始界面显示公司产品信息
& & & & updatelcd(1,0,16,QidongzhongCode);//启动信息
& & & & //图片清零
& & & & while(1)
& & & & {
& & & & & & & & ADS1115Init(MUX_A0);
& & & & & & & & //i2c_24c08_write(0x00,password,6);
& & & & & & & & //delay(0x800);
& & & & & & & & delay(400);
& & & & & & & &
以下是ADS1115.h同文件
* ADS1115.h
*&&Created on:
*& && &Author: Piao
#ifndef ADS1115_H_
#define ADS1115_H_
/**********ADDR宏定义***************/
#define ADDRESS_0&&0x90& &//ADDR PIN -&GND
#define ADDRESS_1&&0x92& &//ADDR PIN -&VDD
#define ADDRESS_2&&0x94& &//ADDR PIN -&SDA
#define ADDRESS_3&&0x96& &//ADDR PIN -&SCL
/************POINTER ISTER*****************/
#define Pointer_0&&0x00& &//Convertion register
#define Pointer_1&&0x01& &//Config register
#define Pointer_2&&0x02& &//Lo_thresh register
#define Pointer_3&&0x03& &//Hi_thresh register
/************CONFIG REGISTER*****************/
#define OS_0& &0x0000
#define OS_1& &0x8000
#define MUX_0&&0x0000&&//AINp=AIN0, AINn=AIN1
#define MUX_1&&0x1000&&//AINp=AIN0, AINn=AIN3
#define MUX_2&&0x2000&&//AINp=AIN1, AINn=AIN3
#define MUX_3&&0x3000&&//AINp=AIN2, AINn=AIN3
#define MUX_4&&0x4000&&//AINp=AIN0, AINn=GND
#define MUX_5&&0x5000&&//AINp=AIN1, AINn=GND
#define MUX_6&&0x6000&&//AINp=AIN2, AINn=GND
#define MUX_7&&0x7000&&//AINp=AIN3, AINn=GND
#define PGA_0&&0x0000& &//FS=6.144V
#define PGA_1&&0x0200& &//FS=4.096V
#define PGA_2&&0x0400&&//FS=2.048V
#define PGA_3&&0x0600&&//FS=1.024V
#define PGA_4&&0x0800&&//FS=0.512V
#define PGA_5&&0x0A00&&//FS=0.256V
#define PGA_6&&0x0C00&&//FS=0.256V
#define PGA_7&&0x0E00&&//FS=0.256V
#define MODE_0 0x0000
#define MODE_1 0x0100
#define DR_0& &0x0000& &//Data Rate = 8
#define DR_1& &0x0020& &//Data Rate = 16
#define DR_2& &0x0040& &//Data Rate = 32
#define DR_3& &0x0060& &//Data Rate = 64
#define DR_4& &0x0080& &//Data Rate = 128
#define DR_5& &0x00A0& &//Data Rate = 250
#define DR_6& &0x00C0& &//Data Rate = 475
#define DR_7& &0x00E0& &//Data Rate = 860
#define COMP_MODE_0&&0x0000
#define COMP_MODE_1&&0x0010
#define COMP_POL_0& &0x0000
#define COMP_POL_1& &0x0008
#define COMP_LAT_0& &0x0000
#define COMP_LAT_1& &0x0040
#define COMP_QUE_0& &0x0000
#define COMP_QUE_1& &0x0001
#define COMP_QUE_2& &0x0002
#define COMP_QUE_3& &0x0003
/* ADS1115_H_ */
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
做个沙发吧,没有人碰见吗
在线时间37 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 18, 距离下一级还需 182 积分
一粒金砂(中级), 积分 18, 距离下一级还需 182 积分
请问你后来是怎么解决的呢?
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
SDA和SCL加上拉电阻了吗?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
最近也被I2C接口做困扰,期待大神解答
EEWORLD 官方微信
EE福利 唾手可得
Powered by

我要回帖

更多关于 单片机iic通信 的文章

 

随机推荐