PIC单片机读
I2C24LC02C读写例程(PIC单片机)
I2C24LC02C读写例程(PIC单片机)I2C 24LC02 C读写例程(PIC单片机)[单片机]发布时间:2008-04-22 10:11:001 I2C总线特点I2C总线最主要的优点是其简单性和有效性。
由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。
总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。
一个主控能够控制信号的传输和时钟频率。
当然,在任何时间点上只能有一个主控。
2 I2C总线工作原理I2C总线上的数据稳定规则,SCL为高电平时SDA上的数据保持稳定,SCL为低电平时允许SDA变化。
如果SCL处于高电平时,SDA 上产生下降沿,则认为是起始位,SDA上的上升沿认为是停止位。
通信速率分为常规模式(时钟频率100kHz)和快速模式(时钟频率400kHz)。
同一总线上可以连接多个带有I2C接口的器件,每个器件都有一个唯一的地址,既可以是单接收的器件,也可以是能够接收发送的器件。
每次数据传输都是以一个起始位开始,而以停止位结束。
传输的字节数没有限制。
最高有效位将首先被传输,接收方收到第8位数据后会发出应答位。
数据传输通常分为两种:主设备发送从设备接收和从设备发送主设备接收。
这两种模式都需要主机发送起始位和停止位,应答位由接收方产生。
从设备地址一般是1或2个字节,用于区分连接在同一I2C上的不同器件。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC 发出特定的低电平脉冲,表示已收到数据。
mplab ipe 读单片机程序
MPLAB IPE 读单片机程序在嵌入式系统的开发过程中,单片机程序的编写和调试是非常重要的一环。
而MPLAB IPE作为Microchip官方的一款集成开发环境,能够提供给开发者一个方便快捷的调试工具。
今天,我们就来探讨一下MPLAB IPE在读取单片机程序方面的应用。
1. MPLAB IPE是什么MPLAB IPE全称Microchip PIC32MX Integrated Programming Environment,是Microchip官方提供的一款适用于PIC单片机的集成开发环境。
作为Microchip的一款强大且易用的工具,MPLAB IPE 主要用于单片机程序的编程、调试和测试。
它支持多种编程工具和单片机芯片,可以满足不同开发需求。
2. MPLAB IPE的功能MPLAB IPE作为一款集成的编程工具,其功能十分强大。
它可以实现程序的下载、调试和检测,并能够与MPLAB X IDE等开发环境进行无缝连接。
MPLAB IPE还支持多种编程方式,包括ICSP、ISP、JTAG 等,能够满足各种不同的单片机编程需求。
MPLAB IPE还支持自动识别连接的编程工具和目标芯片,使得整个编程过程更加便捷和高效。
3. 如何使用MPLAB IPE读取单片机程序在使用MPLAB IPE读取单片机程序时,首先需要将单片机与编程工具(如MPLAB Real ICE、PICkit)连接到计算机上,然后打开MPLAB IPE软件。
选择目标芯片和编程工具,并加载需要读取的程序。
在设置好编程工具和目标芯片之后,点击“Read”按钮,MPLAB IPE将会自动读取目标芯片中的程序,并在界面上显示出读取的结果。
通过这种简单而直观的操作,开发者可以轻松地读取单片机程序,并进行后续的调试和测试。
4. 我对MPLAB IPE的个人观点和理解作为一名嵌入式系统的开发者,我对MPLAB IPE有着较为深刻的理解和实际应用经验。
一文读懂PIC单片机的技术特性和优势
一文读懂PIC单片机的技术特性和优势对于电子工程师而言,PIC单片机是非常重要的一个产品。
PIC单片机是一种用来开发的去控制外围设备的集成电路,一种具有分散作用(多任务)功能的CPU,与人类相比,大脑就是CPU,PIC共享的部分相当于人的神经系统。
PIC单片机的特点PIC 单片机是一个小的计算机,PIC单片机有计算功能和记忆内存像CPU并由软件控制运行。
然而,处理能力—般,存储器容量也很有限,这取决于PIC的类型。
但是它们的最高操作频率大约都在20MHz 左右,存储器容量用做写程序的大约1K—4K字节。
时钟频率与扫描程序的时间和执行程序指令的时间有关系。
但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变。
如果是同样的体系结构,时钟频率较高的处理能力会较强。
因为PIC单片机可以把计算部分、内存、输入和输出等都做在一个芯片内。
所以它工作起来效率很高、功能也自由定义还可以灵活的适应不同的控制要求,而不必去更换不同的IC。
这样电路才有可能做的很小巧。
PIC单片机的优势PIC最大的特点是不搞单纯的功能堆积,而是从实际出发,重视产品的性能与价格比,靠发展多种型号来满足不同层次的应用要求。
就实际而言,不同的应用对单片机功能和资源的需求也是不同的。
比如一个摩托车的点火器需要一个I/O较少、RAM及程序存储空间不大、可靠性较高的小型单片机,若采用40脚且功能强大的单片机,投资大不说,使用起来也不方便。
PIC系列从低到高有几十个型号,可以满足各种需要。
其中,PIC12C508单片机仅有8个引脚,是世界上最小的单片机。
该型号有512字节ROM、25字节RAM、一个8位定时器、一根输入线、5根I/O线,市面售价在3-6元人人民币。
这样一款单片机在象摩托车点火器这样的应用无疑是非常适合。
PIC的高档型号,如PIC16C74(尚不是最高档型号)有40个引脚,其内部资源为ROM共4K、192字节RAM、8路A/D、3个8位定时器、2个CCP模块、三个串行口、1个并行口、11个中断源、33个I/O脚。
pic控制原理
pic控制原理
PIC控制原理是指基于PIC单片机的控制系统的工作原理。
PIC单片机是一种非常常用的单片机芯片,具有较小的封装体积、较低的功耗和较高的性能,在嵌入式系统中广泛应用。
PIC单片机通过接收外部输入信号,例如传感器的反馈信号,
经过控制算法处理后,输出相应的控制信号,驱动执行机构完成特定的控制任务。
PIC单片机的工作流程可以简单概括为以
下几个步骤:
1. 读取输入信号:PIC单片机通过输入引脚读取传感器等外部
设备提供的输入信号,例如温度传感器的温度值、光敏电阻的光强值等。
2. 信号处理:PIC单片机对输入信号进行数字化处理,例如进
行模数转换、滤波、数据运算等,以便后续的控制算法分析。
3. 控制算法运算:根据系统要求设计相应的控制算法,通过PIC单片机的运算能力,在控制程序中进行算法的实现和运算。
控制算法可以是简单的比例控制、PID控制,也可以是更复杂
的模糊控制、神经网络控制等。
4. 生成控制信号:根据控制算法的计算结果,PIC单片机输出
相应的控制信号,例如PWM信号、模拟电压信号或数字信号等。
5. 驱动执行机构:控制信号通过输出引脚驱动执行机构,例如
电机、继电器、运动装置等,完成对被控对象的控制。
通过不断地循环执行以上步骤,PIC控制系统能够实时监测、处理输入信号,并输出相应的控制信号,从而实现对被控对象的精确控制。
在实际应用中,PIC单片机的控制原理还可以根据具体的控制需求进行进一步的扩展和优化。
什么是PIC单片机
一、单片机应用基础什么是PIC单片机?PIC单片机(Peripheral Interface Controller)是一种用来开发的去控制外围设备的集成电路(IC)。
一种具有分散作用(多任务)功能的CPU。
与人类相比,大脑就是CPU,PIC 共享的部分相当于人的神经系统。
PIC 单片机是一个小的计算机PIC单片机有计算功能和记忆内存像CPU并由软件控制允行。
然而,处理能力—存储器容量却很有限,这取决于PIC的类型。
但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。
时钟频率与扫描程序的时间和执行程序指令的时间有关系。
但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变(1*)。
如果是同样的体系结构,时钟频率较高的处理能力会较强。
这里用字来解释程序容量。
用一个指令(2*)表示一个字。
通常用字节(3*)来表示存储器(4*)容量。
一个字节有8位,每位由1或0组成。
PIC16F84A单片机的指令由14位构成。
当把1K个子转换成位为:1 x 1,024 x 14 = 14,336位。
再转换为字节为:14,336/(8 x 1,024) = 1.75K。
在计算存储器的容量时,我们规定1G 字节= 1,024M 字节, 1M 字节= 1,024K 字节, 1K 字节= 1,024 字节. 它们不是以1000为倍数,因为这是用二进制计算的缘故。
1. 计算机的物理结构,包括组织结构、容量、该计算机的CPU、存储器以及输入输出设备间的互连。
经常特指CPU的组织结构,包括它的寄存器、标志、总线、算术逻辑部件、指令译码与执行机制以及定时和控制部件。
2. 指出某种操作并标识其操作数(如果有操作数的话)的一种语言构造3. 作为一个单位来操作(运算)的一个二进制字符串,通常比计算机的一个字短。
4. 处理机内的所有可寻址存储空间以及用于执行指令的其它内存储器。
在计算存储器的容量时,我们规定1G 字节= 1,024M 字节, 1M 字节= 1,024K 字节, 1K 字节= 1,024 字节. 它们不是以1000为倍数,因为这是用二进制计算的缘故。
PIC单片机EEPROM的读写程序
。TEEHSATAD 考参 �似类 MORPEE 写读与程过体具写读的 HSALF �3 。)个这考参要前序程编(TEEHSATAD 见可序程编汇体具 。零清被否是 RW�置设被否是 FIEE 查检须必件软则�成完有没 1 骤步果如。 �零清件软由须 必 FIEE�置设被 FIEE 而零清被位 RW�时束结期周写在 �01 。NERW 除清 。 �断中到用要需果如�断中放开 。位 RW 置设 �3� 。 �2NOCEE 入写后 然�W 入写先首�步两含包� 。2NOCEE 入写 AAX0 将 �2� 。 �2NOCEE 入写后 然�W 入写先首�步两含包� 。2NOCEE 入写 55X0 将 �1� �序顺的骤步个 5 面下行执格严 。断中 elbasiD 。NERW 置设 。位 DGPEE 清 .ATADEE 入写据数位 8 将 。制限的件硬于大会不度长址地保确�RDAEE 入写址地将 �7 �6 �5 �4 �3 �2 CIP
。程 过写于处正是不是看位 RW 查检�成完有没 01 骤步果如 �1
�骤步的 MORPEE 写 。行进在正作操写有没证保要前程过作操写个 一始开在。零清 NERW 对须必件软后完写。RW 置设能才后置设被 NERW 在有只 。零持保须必间时它其 �据数写在正了除位 NERW 据数 MORPEE 写 。TEEHSATAD 见可序程编汇体具 。数读 ATADEE 从 。位 DR 置设 。位 DGPEE 除清 。制限的件硬于大会不度长址地保确 �ATADEE 入写址地将 �4 �3 �2 �1 �3
的中 ATADEE:HTADEE 而�除擦被会将据数的中 RDAEE:HRDAEE 。 令 指 行 执 止 停 会 将 机 片 单 � 置 设 被 R W 和 N E RW 旦 一 �HSALF 于对 。1 置被 FIEE �零清被会将址地的 RDAEE 后然 �入写据 数的中 ATADEE 将会就 RW 和 NERW 了置设旦一�据数 MORPEE 于 对 。 零 清 位 识 标 该 对 先 首 须 必 前 之 RW 置 设 在 � 置 设 被 后 束 结 程过写当 FIEE 志标断中。零清动自被会后束结作操写�位始初作操 写是位 RW。作操写行进以可则 1=�位能使作操写是 NERW。FIEE 和 RRERW 位志标个两�NERW 和 RW 位制控个两有作操写 。据数到读器 存寄 ATADEE:HTADEE 从以可令指条两后置设被在 �据数的 HSALF 于 对 而 。 据 数 到 读 器 存 寄 ATADEE 从 以 可 上 马 会 就 后 置 设 被位 该 �作操读的 MORPEE 于对。零清动自会后束结作操读。据数到读器 存寄据数从能就 1 成置设被旦一�DR 位加附个一到用要作操读 。作操行进 HSALF 对是则 1= �作操行进 MORPEE 对 �0=DGPEE 。断中外意的中程过写止防来用被是而�器存 寄的上义意正真个一是不 2NOCEE�化始初置配来用 1NOCEE 器存寄 2NOCEE 和 1NOCEE �1 。写读的节字/字行进�行执常正的序程响影 会不 MORPEE 。 �列系 X78F61�据数位 41 储存 ATADEE:HTADEE � 址 地 位 31 存 保 RDAEE:HRDAEE � 断 中 和 令 指 条 一 下 行 执会才束结作操写到直�行运的令指停暂会作操写的 HSALF 对
PIC8位单片机汇编语言常用指令的识读
PIC8位单片机汇编语言常用指令的识读各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。
PIC 8位单片机共有三个级别,有相对应的指令集。
基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。
一、PIC汇编语言指令格式PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:标号操作码助记符操作数1,操作数2;注释指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1 标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。
再有标号不能用操作码助记符和寄存器的代号表示。
标号也可以单独占一行。
2 操作码助记符该字段是指令的必选项。
该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3 操作数由操作数的数据值或以符号表示的数据或地址值组成。
浅谈“读—修改—写”操作
下面以51和PIC两种单片机为例阐述二者“读—修改—写”操作的差异以及对硬件设计产生的影响。
PIC单片机的I/O口为完全的双向口,读写方向由端口方向寄存器控制。PIC单片机操作指令读I/O口寄存器时,读的是I/O口引脚上电平的实际状态。当用BSF、BCF、BTFSS、BTFSC四条指令对I/O口进行按位修改或测试之前,单片机首先要将端口寄存器的值读回。设想如下情况:用I/O口第0位驱动晶体管的基极,当输出为1时晶体管导通。然而一旦晶体管导通,I/O口的电平将会被钳位在晶体管BE结导通压降上(0.7伏左右)。若此时想用BSF或BCF给同一个I/O口的其他位进行操作,则会出现“读—修改—写”造成的问题——由于读端口寄存器实际上读的是引脚上的电平,ALU中读回的端口寄存器值第0位实际上为0(而不是原来写的1),这样在修改完毕再写回去时,第0位就真的变成了0,于是原来导通的晶体管将意外关断。解决此问题的方法是在I/O口和基极之间串联一个电阻,用电阻上的压降抬高I/O口电平至TTL阈值以上,这样读回的就是1了。
浅谈“读—修改—写”操作
在做“读—修改—写”操作时,单片机首先将欲修改的寄存器的内容读回ALU,对相应位进行修改,然后再整个写回原来的寄存器地址。通常在对寄存器的某一位进行置位、清零、检测、传送或逻辑运算时指令的实际执行过程为“读—修改—写”。熟悉指令的“读—修改—写”实质对于硬件和软件设计都至关重要,尤其在对单片机的I/O口进行上述操作时,忽略这个问题可能会出现意想不到的情况。因为不像内部寄存器,I/O口是与外围电路相连的,“读—修改—写”操作读回的值可能并不是原来写入的值。
�
51单片机有四个I/O口P0~P3,对端口的操作分为读锁存器和读引脚两种方式。由于在其I/O口硬件设计时内部数据总线与端口锁存器输出以及外部引脚分别经过缓冲电路直接关联,通过读锁存器和读引脚的方法可以分别读取端口寄存器的写入值或者I/O口引脚上的实际电平状态。在使用ANL、ORL、XRL、CLR、SETB等位操作指令对I/O口进行按位修改时,单片机将首先读回端口锁存器的值,送入ALU进行相应位修改,再写回端口寄存器,通过驱动电路输出给外围电路。注意这里不会出现像PIC单片机的问题:读回来的是端口锁存器的值而不是I/O口引脚的状态,所以即使驱动晶体管的基极使得引脚电平被钳位为低,ALU中读回的依然是1,这样在返写时不会使晶体管意外关断。
怎样解决PIC单片机读修改写问题
怎样解决PIC单片机读修改写问题关于这类似的问题你可以自己先做块板子动手试下,相信应该也不是很难用IO口模拟I2C通信,实现方式是端口外接上拉电阻,输出寄存器设置为零,然后改变方向寄存器实现0和1的转换,设置为输出则为0,输出设置为1,在上拉电阻作用下将端口拉高,端口其他IO 口做控制用,在做I2C通信时候发现I2C总线输出0时结果输出总是为高,用示波器观察最后发现问题是,输出寄存器设置成0后,在写端口其它IO口的时候,是将整个端口值都会来,然后修改写的一位,整个端口写一遍,由于I2C的IO口有上拉电阻,每次读回来的值都是1,写整个端口的时候就把输出寄存器的值改写成1了,导致输出不能为零的问题。
解决办法是,设置端口的影子寄存器,每次要修改端口任意IO口值时,都是先修改影子寄存器的相应位,然后再用影子寄存器的值写整个端口,问题得到解决。
通过这次问题的解决,对端口的读-修改-写有了更深的认识。
再系统的介绍下何谓读-修改-写,导致的问题及其解决方法:只要PICmicro的命令,所处理的FILE (暂存器,内存,和I/O的统称),其最终的值,和命令处理前的值有关,那么,这种命令便是所谓的读-修改-写命令。
因为这类命令的操作,可以再细分为三个小步骤,即是读(READ),修改(MODIFY),接著才是写(WRITE)。
如:ADDWF,DECF,IORWF,XORWF,BSF,BCF,‥‥等等皆是。
在使用这类命令的时候,如果所处理的FILE是I/O, 就必须要特别小心。
因为,假设任务电压为5V;而您在PORTB的8支脚,没有串接电阻,分别接了8颗二极管(也许是LED)到地。
如果,您在先前下了"BSF PORTB,0"这条命令,使得PORTB第0脚上的LED亮了。
当您再运行了”BSF PORTB,1"这条命令后,虽然PORTB第1脚上的LED亮了,但是,PORTB第0脚上的LED却会熄掉。
pic16单片机读写
pic16单片机读写Eeprom读写函数用于pic16 系列单片机void write_eeprom(unsigned char addr,unsigned char data) {do{;}while(WR==1); //上一次写操作是否完成EEADR=addr; //EEPROM地址EEDATA=data; //准备写入EEPROM的数据EEPGD=0; //指向EEPROM数据储存器WREN=1; //使能写操作EECON2=0x55; //设置通用参数EECON2=0xAA; //设置通用参数WR=1; //开始写do{;}while(WR==1); //等待写操作完成WREN=0; //禁止写操作}unsigned char read_eeprom(unsigned char addr){unsigned char num;do{;}while(RD==1); //上一次读操作是否完成EEADR=addr; //EEPROM地址为00HEEPGD=0; //指向EEPROM数据储存器RD=1; //开始读do{;}while(RD==1); //等待读操作完成num=EEDATA; //读出return(num); //返回读出的数}下面为pic18系列的eeprom读写程序void write_eeprom(unsigned char addr,unsigned char edata) {do{;}while(WR==1); //上一次写操作是否完成NVMADR=addr; //EEPROM地址NVMADRH:NVMADRLNVMDAT=edata; //准备写入EEPROM的数据NVMDA TNVMREG1 =0; //指向EEPROM数据储存器NVMREG0 NVMREG1 :1;NVMREG0 =0;WREN=1; //使能写操作NVMCON2=0x55; //设置通用参数NVMCON2=0xAA; //设置通用参数WR=1; //开始写do{;}while(WR==1); //等待写操作完成WREN=0; //禁止写操作}unsigned char read_eeprom(unsigned char addr){unsigned char num;do{;}while(RD==1); //上一次读操作是否完成NVMADR=addr; //EEPROM地址为00HNVMREG1 =0; //指向EEPROM数据储存器NVMREG0 NVMREG1 :1;NVMREG0 =0; //指向EEPROM数据储存器RD=1; //开始读do{;}while(RD==1); //等待读操作完成num=NVMDA T; //读出return(num); //返回读出的数}。
PIC单片机的EEPROM读写程序
PIC单片机的EEPROM读写程序PIC16C74B单片机与AT24C64通讯;该程序实现的功能是:;将I2C_A,I2C_B.....I2C_K内容写入EEPROM中;同时在EEPROM中读出数据从新写入各个寄存器;=======================================LIST P=16C74B#include<p16c74.inc>ERRORLEVEL -302I2C_A EQU 0X20I2C_B EQU 0X21I2C_C EQU 0X22I2C_D EQU 0X23I2C_E EQU 0X24I2C_F EQU 0X25I2C_G EQU 0X26REG1 EQU 0X2BREG2 EQU 0X2CCOUNT EQU 0X71 ;I2CBCOUNT EQU 0X72 ;I2CTXBUF EQU 0X73 ;I2CRXBUF EQU 0X74 ;I2CBUSCON EQU 0X75 ;I2CBUSSTA EQU 0X76 ;I2CI2CBUF EQU 0X77 ;I2CSLA VEADDR EQU 0XA0 ;I2CDA TAADDRH EQU 0X01 ;I2CDA TAADDRL EQU 0X00 ;I2C;---------------------------------------;BUSCON;---------------------------------------SLA VE_RW EQU 7LAST_BYTE_RX EQU 6SLA VE_ACTIVE EQU 5TIME_OUT EQU 4;---------------------------------------;BUSSTA;---------------------------------------BUS_BUSY EQU 7TX_PROGRESS EQU 6RX_PROGRESS EQU 5TX_SUCCESS EQU 4RX_SUCCESS EQU 3FATAL_ERROR EQU 2 ;SLA VE EEPROM ABORT EQU 1ACK_ERROR EQU 0;---------------------------------------R_NOT_W EQU 0TRUE EQU 1FALSE EQU 0SDA EQU 0X04 ;I2CSCL EQU 0X03 ;I2C;=======================================ORG 0X00GOTO STARTORG 0X20START BCF STATUS,RP1BCF STATUS,RP0CLRF RACLRF RBCLRF RCCLRF RDCLRF REBSF STATUS,RP0CLRF TRISACLRF TRISBCLRF TRISCCLRF TRISDCLRF TRISEMOVLW 0X02MOVWF I2C_AMOVLW 0X04MOVWF I2C_BMOVLW 0X03MOVWF I2C_CMOVLW 0X03MOVWF I2C_DMOVLW 0X05MOVWF I2C_EMOVLW 0X06MOVWF I2C_FMOVLW 0X04MOVWF I2C_G;======================================= START1CALL I2CBUS_INITCALL REGTOI2CBUFCALL I2CWRITECALL CLRI2CBUFCALL D10CALL I2CREADCALL I2CBUFTOREGGOTO START1;======================================= ;CLRI2CBUF;---------------------------------------CLRI2CBUFBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVLW 0X08MOVWF COUNTCLRLOOP CLRF INDFINCF FSR,FDECFSZ COUNT,FGOTO CLRLOOPRETURN;---------------------------------------;将各个REGSTER数据写入 I2CBUF 缓冲区;---------------------------------------REGTOI2CBUFBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVF I2C_A,WMOVWF INDFINCF FSR,FMOVF I2C_B,WMOVWF INDFINCF FSR,FMOVF I2C_C,WMOVWF INDFINCF FSR,FMOVF I2C_D,WMOVWF INDFINCF FSR,FMOVF I2C_E,WMOVWF INDFINCF FSR,FMOVF I2C_F,WMOVWF INDFINCF FSR,FMOVF I2C_G,WMOVWF INDFRETURN;---------------------------------------;将 I2CBUF 缓冲区数据写入各个REGSTER;---------------------------------------I2CBUFTOREGBCF STA TUS,RP0MOVLW I2CBUFMOVWF FSRMOVF INDF,WMOVWF I2C_AINCF FSR,FMOVF INDF,WMOVWF I2C_BINCF FSR,FMOVF INDF,WMOVWF I2C_CINCF FSR,FMOVF INDF,WMOVWF I2C_DINCF FSR,FMOVF INDF,WMOVWF I2C_EINCF FSR,FMOVF INDF,WMOVWF I2C_FINCF FSR,FMOVF INDF,WMOVWF I2C_GRETURN;=======================================;将I2CBUF缓冲区内的数据写入EEPROM;=======================================I2CWRITECALL I2CSTARTBTFSS BUSSTA,BUS_BUSYGOTO TX_FAILBCF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESS ;SUCESSFULL? GOTO TX_FAILCALL TX_DA TA_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO TX_FAILMOVLW I2CBUFMOVWF FSRMOVLW 07MOVWF COUNTT_BYTE_LOOPMOVF INDF,WMOVWF TXBUFCALL I2CTXBBTFSS BUSSTA,TX_SUCCESSGOTO TX_FAILINCF FSR,FDECFSZ COUNT,FGOTO T_BYTE_LOOPGOTO TX_PASSTX_FAIL CALL I2CSTOPBCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSRETLW FALSETX_PASSCALL I2CSTOPBCF BUSSTA,TX_PROGRESSRETLW TRUE;---------------------------------------;从 EEPROM 中读出数据到 I2CBUF 寄存器;---------------------------------------I2CREAD BCF STATUS,RP0BCF BUSSTA,RX_SUCCESSCALL I2CSTARTBTFSS BUSSTA,BUS_BUSYGOTO RX_FAILBCF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESS GOTO RX_FAILCALL TX_DA TA_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO RX_FAILCALL I2CSTARTBSF BUSCON,SLA VE_RWCALL TX_SLA VE_ADDRBTFSS BUSSTA,TX_SUCCESSGOTO RX_FAILBCF BUSSTA,LAST_BYTE_RXMOVLW I2CBUFMOVWF FSRMOVLW 07MOVWF COUNTR_BYTE_LOOPMOVLW 0X01XORWF COUNT,WBTFSC STATUS,ZBSF BUSSTA,LAST_BYTE_RXCALL I2CRXBBTFSS BUSSTA,RX_SUCCESSGOTO RX_FAILMOVF RXBUF,WMOVWF INDFINCF FSR,FDECFSZ COUNT,FGOTO R_BYTE_LOOPGOTO RX_PASSRX_FAIL CALL I2CSTOPBCF BUSSTA,RX_PROGRESSBCF BUSSTA,RX_SUCCESSRETLW FALSERX_PASS CALL I2CSTOPBCF STA TUS,RP0BCF BUSSTA,TX_PROGRESSBCF BUSSTA,RX_PROGRESSBSF BUSSTA,RX_SUCCESSRETLW TRUE;======================================= ; I2C 初始化;=======================================I2CBUS_INITBCF STA TUS,RP0MOVF RC,WANDLW 0X18MOVWF RCCLRF BUSSTACLRF BUSCONRETURN;======================================= ; 传送设备地址;入口: BUSCON;出口: BUSSTA;======================================= TX_SLA VE_ADDRBCF STA TUS,RP0BCF BUSSTA,ACK_ERRORMOVLW SLA VEADDRMOVWF TXBUFBTFSC BUSCON,SLA VE_RWBSF TXBUF,R_NOT_WCALL I2CTXBBTFSC BUSSTA,TX_SUCCESSGOTO TXADDR_SUCCESSCLRWDTBTFSS BUSSTA,ACK_ERRORCALL I2CSTOPGOTO TXADDR_ENDTXADDR_SUCCESSCLRWDTTXADDR_ENDRETURN;======================================= ;TX_DATA_ADDR 发送写/读的地址;======================================= TX_DATA_ADDRBCF STA TUS,RP0MOVLW DATAADDRHMOVWF TXBUFCALL I2CTXBBCF STA TUS,RP0BTFSS BUSSTA,TX_SUCCESSGOTO TX_DATA_ADDR_ERRORMOVLW DATAADDRLMOVWF TXBUFCALL I2CTXBBCF STA TUS,RP0BTFSS BUSSTA,TX_SUCCESSGOTO TX_DATA_ADDR_ERRORGOTO TX_DATA_ENDTX_DATA_ADDR_ERRORBCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSBSF BUSSTA,ACK_ERRORTX_DATA_ENDRETURN;=======================================;向 EEPROM 输出一个8位数据,并检测EEPROM的ACK信号;入口: TXBUF 寄存器; BUSSTA 寄存器;出口: EEPROM 存储器; BUSSTA 寄存器;======================================I2CTXB BCF STATUS,RP0BSF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSMOVLW 0X08MOVWF BCOUNTTXLOOP CLRWDTBSF STATUS,RP0BCF TRISC,SCLNOPBCF TRISC,SDABCF STA TUS,RP0RLF TXBUF,FBSF STATUS,RP0BTFSC STATUS,CBSF TRISC,SDANOPBSF TRISC,SCLNOPNOPBCF STA TUS,RP0DECFSZ BCOUNT,FGOTO TXLOOP;---------------------------------------;检测是EEPROM否有ACK信号产生,产生为正常;检测方法:; 1. 将RC口的SCL.SDA分别设置为输出和输入状态; 2. 延时2个指令周期,将SCL设置为高电平; 3. 延时2个指令周期,检测RC口SDA的状态; 4. 如果为高电平,设置错误状态,返回; 5. 如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行;---------------------------------------BSF STATUS,RP0BCF TRISC,SCLBSF TRISC,SDANOPNOPBSF TRISC,SCLNOPBCF STA TUS,RP0BTFSC RC,SDAGOTO TX_ERRBSF STATUS,RP0BCF TRISC,SCLBCF STA TUS,RP0BCF BUSSTA,TX_PROGRESSBSF BUSSTA,TX_SUCCESSBCF BUSSTA,ACK_ERRORGOTO TX_ENDTX_ERR BCF BUSSTA,TX_PROGRESSBCF BUSSTA,TX_SUCCESSBSF BUSSTA,ACK_ERRORTX_END RETURN;=======================================;从EEPROM中读出 8 位的数据,并发送发送ACK信号;入口: EEPROM 存储器; BUSCON 寄存器;出口: RXBUF 寄存器; BUSSTA 寄存器;=======================================I2CRXB BCF STA TUS,RP0BSF BUSSTA,RX_PROGRESSBCF BUSSTA,RX_SUCCESSMOVLW 0X08MOVWF BCOUNTRXLOOP CLRWDTBSF STATUS,RP0BCF TRISC,SCL ;定义TRISC<SCL>为输出BSF TRISC,SDA ;定义TRISC<SDA>为输入NOPNOPBSF TRISC,SCL ;TRISC<SCL>输出高电平NOPBCF STA TUS,RP0BCF STA TUS,CBTFSC RC,SDA ;原指令为BTFSC TRISC,SDA BSF STATUS,CRLF RXBUF,FDECFSZ BCOUNT,FGOTO RXLOOP;---------------------------------------;发送ACK信号到EEPROM;判断接收的是否为最后一个字节;LAST_BYTE_RX为1,是 SDA发送一个高电平,结束;LAST_BYTE_RX为0,不是 SDA发送一个低电平ACK,继续接收;---------------------------------------BSF STATUS,RP0BCF TRISC,SCLBCF TRISC,SDABTFSC BUSCON,LAST_BYTE_RX ;检测是否是最后一个字节 BSF TRISC,SDA ;是最后一个字节NOP ;发送ACK信号BSF TRISC,SCLNOPNOPNOPNOPBCF TRISC,SCLBCF STA TUS,RP0BCF BUSSTA,RX_PROGRESSBSF BUSSTA,RX_SUCCESSRETURN;=======================================;I2C 开始信号;输入: 无;输出: BUFSSTA<BUS_BUSY>;=======================================I2CSTARTBSF STATUS,RP0BSF TRISC,SDA ;1USNOP ;1USBSF TRISC,SCL ;1USNOPNOPBCF TRISC,SDANOPNOPBCF STATUS,RP0BSF BUSSTA,BUS_BUSYRETURN;=======================================;I2C 结束信号;输入: 无;输出: BUSSTA<BUS_BUSY>;=======================================I2CSTOPBSF STATUS,RP0BCF TRISC,SCLBCF TRISC,SDABSF TRISC,SCLNOPNOPBSF TRISC,SDANOPBCF STATUS,RP0BCF BUSSTA,BUS_BUSYRETURN;=======================================; D10 @; clock in 4Mhz; delay 10ms;=======================================D10 MOVLW 0X0DMOVWF REG1LOOP2 MOVLW 0XFFMOVWF REG2LOOP1 DECFSZ REG2,fGOTO LOOP1DECFSZ REG1,fGOTO LOOP2RETURN;=======================================I2CERR CLRWDTNOPNOPNOPRETURNEND硬件I2C的主模式,只能在具有MSSP模块的单片机里实现,如PIC16F87X,而PIC16C7X 的SSP只能启用I2C从模式。
PIC单片机对9346EEPROM数据的读写
PIC单片机对9346EEPROM数据的读写
实验目的:熟悉SPI总线以及9346EEPROM的读写
;RBO键按下时把DATA和DATA2写入到EEPROM中以EE—ADDR为地址的单元内,;完成后,单个数码观显示“9”做为完成标志
;RB1键按下时,读取EEPROM中以EE—ADDR为地址的单元,并送数码管显示
;硬件要求:S3、S5、S6拨码管置ON,S1第7、8位置ON。
LIST P=16F877A,R=DEC
include “P16F877A.inc”;包含头文件
__CONFIG _DEBUG_OFF">#DEFINE CS PORTC,2 ;片选信号
#DEFINE CLK PORTC,3 ;时钟信号输入
#DEFINE DI PORTC,5 ;数据输入脚
#DEFINE D0 PORTC,4 ;数据输出脚EE_ADDR EQU 05H ;待写EEPROM单元地址EE_DATA EQU 56H ;待写入的数据
EE_DATA2 EQU 78HTEMP1 EQU 30H ;读EEPROM结果存放单元
TEMP2 EQU 31H
DL1 EQU 77H ;延时用
DL2 EQU 78H ;延时用
;******************************************************
ORG 000H ;复位地址
NOP ;放置一条ICD必需的空操作指令
GOTO MAIN
ORG 0008H
TABLE
ADDWF PCL,1 ;PC值加上偏移地址
RETLW 0C0H ;0
RETLW 0F9H ;1的编码。
第六章、PIC单片机定时读数
RBIF:PORTB引脚状态变化中断标志位。
0: PORTB没有发生状态变化中断; 1: PORTB引脚出现状态变化中断,必须用软件将其清 除 。
4、RA方向寄存器 (TRISA)4=1,T0CKI为输入方式。
8.1.3 TMR0模块电路结构和工作原理
1. 8位计数寄存器TMR0 1)设置定时模式 T0CS=0 定时时间:初值,频率,预分频器。 2)设置计数模式 T0CS=1 计数 T0SE=0,T0SE=1。 2. 分频器 PS2、PS1、PS0 分频比; PSA=0,TMR0分频器;PSA=1,WDT分频器。
Bit6/INTEDG:INT中断信号触发边沿选择位,主动参 数。
0: RB0/INT引脚上的下降沿触发;
1: RB0/INT引脚上的上升沿触发。 Bit7/RBPU:B端口弱上拉使能位,主动参数。 0: RB0-RB7引脚弱上拉使能; 1: RB0-RB7引脚弱上拉禁止。
3、中断控制寄存器INTCON
GIE=0; //禁止产生中断 T0IF=0; //清除定时器0中断标志 TMR0=0X64; //预置TMR0初值 }
#include <pic.h> void init(); //I/O口初始化函数 void tmint(); //定时器初始化函数 void interrupt dealtime(); void main() { init(); tmint(); while(1) { ; } }
主要用于中断控制方式的设置。
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
PEIE:外围功能模块中断使能控制位。 0: 禁止所有外围功能模块中断; 1: 使能外围功能模块中断。 T0IE:TMR0中断使能控制位。
PIC单片机的读-修改-写问题及解决方案
PIC单片机的读/修改/写问题及解决方案何谓读-修改-写,导致的问题及其解决之道:只要PICmicro 的命令,所处理的FILE (暂存器,内存,和I/O 的统称),其最终的值,和命令处理前的值有关,那么,这种命令便是所谓的读-修改-写命令。
因为这类命令的操作,可以再细分为三个小步骤,即是读(READ),修改(MODIFY),接著才是写(WRITE)。
如:ADDWF,DECF,IORWF,XORWF,BSF,BCF,EE 等等皆是。
在使用这类命令的时候,如果所处理的FILE 是I/O, 就必须要特别小心。
因为,假设任务电压为5V;而您在PORTB 的8 支脚,没有串接电阻,分别接了8 颗二极管(也许是LED)到地。
如果,您在先前下了BSF PORTB,0 这条命令,使得PORTB 第0 脚上的LED 亮了。
当您再运行了BSF PORTB,1 这条命令后,虽然PORTB 第1 脚上的LED 亮了,但是,PORTB 第0 脚上的LED 却会熄掉。
原因是因为,运行BSF PORTB,1 时,会先将整个PORTB 的值往回读,而它读到的PORTB 第0 脚,却是相当於低电位(被二极管拉为0.7V)。
当它再把整个PORTB 的值写出去的时候,PORTB 第0 脚就被写成低电位,自然灯就熄了。
解决之道是:串电阻,或者不要直接对I/O 作读-修改-写命令。
另外还有一类要注意的状况是:如当您将BSF PORTB,0 和BSF PORTB,1 两条命令连在一起,没有空运行时,纵使您没有上一段所述线路设计不良之状况,有时候您也会发现PORTB, 0 的高电位也会不见了。
导致这个现象的原因是:因为也许您这两支脚的外面接了长导线,有相当大的电容、电感性会阻止电位的变化;而且,PIC 命令运行是在最后1/4 周期时写出,而在第一个1/4 周期时读入,PORTB,0 还来不及升至高电位,便被下一个命令读回去了。
PIC单片机片内EEPROM的读写程序
PIC单片机片内EEPROM的读写程序因为也是摸索着学习PIC单片机,当要用到EEPROM存储部分系统参数,看单片机手册上的资料,觉得还是比较麻烦,然后还是不太会,然后就想找找看网上有没有现成的PIC单片机的片内EEPROM的读写程序,然后都没有找到想要的,而且对汇编语言的也不知道,所以搜索了下最后终于发现PICC编译器里面其实对内部的EEPROM的读写有头文件,可以直接来用,方法如下:PICC的安装目录下C:\Program Files\HI-TECH Software\PICC\9.81\include(这是我的电脑里目录)里面有一个eeprom_routines.h的文件这个就是关于EEPROM 中的读写程序,具体程序如下:// This header file should not be included directly// Inclusion of this file is provided indirectly by including htc.h/******************************************************************** ***//****** EEPROM memory read/write macros and function definitions *******//******************************************************************** ***//* NOTE WELL:The macro EEPROM_READ() is NOT safe to use immediately after anywrite to EEPROM, as it does NOT wait for WR to clear. This is bydesign, to allow minimal code size if a sequence of reads isdesired. To guarantee uncorrupted writes, use the functioneeprom_read() or insertwhile(WR)continue;before calling EEPROM_READ().*/#if EEPROM_SIZE > 0#ifdef __FLASHTYPE// macro versions of EEPROM write and read#define EEPROM_WRITE(addr, value) \do{ \while(WR)continue;EEADRL=(addr);EEDATA=(value); \EECON1&=0x3F;CARRY=0;if(GIE)CARRY=1;GIE=0; \WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \if(CARRY)GIE=1; \}while(0)#define EEPROM_READ(addr)((EEADRL=(addr)),(EECON1&=0x3F),(RD=1),EEDATA)#else // else doesn't write flash#define EEPROM_WRITE(addr, value) \do{ \while(WR)continue;EEADRL=(addr);EEDATA=(value); \CARRY=0;if(GIE)CARRY=1;GIE=0; \WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \if(CARRY)GIE=1; \}while(0)#define EEPROM_READ(addr) ((EEADRL=(addr)),(RD=1),EEDATA) #endif/* library function versions */extern void eeprom_write(unsigned char addr, unsigned char value); extern unsigned char eeprom_read(unsigned char addr);#endif // end EEPROM routines看到这里就知道了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PIC 单片机读
何谓读-修改-写,导致的问题及其解决之道:
只要PICmicro 的命令,所处理的FILE (暂存器,内存,和I/O 的统称),其最终的值,和命令处理前的值有关,那幺,这种命令便是所谓的读-
修改-写命令。
因为这类命令的操作,可以再细分为三个小步骤,即是读(READ),修改(MODIFY),接着才是写(WRITE)。
如:ADDWF,DECF,IORWF,XORWF,BSF,BCF,‥‥等等皆是。
在使用这类命令的时候,如果所处理的FILE 是I/O, 就必须要特别小心。
因为,假设任务电压为5V;而您在PORTB 的8 支脚,没有串接电阻,分别接了8 颗二极管(也许是LED)到地。
如果,您在先前下了BSF PORTB,0 这条命令,使得PORTB 第0 脚上的LED 亮了。
当您再运行了BSF PORTB,1 这条命令后,虽然PORTB 第1 脚上的LED 亮了,但是,PORTB 第0 脚上
的LED 却会熄掉。
原因是因为,运行BSF PORTB,1 时,会先将整个PORTB 的值往回读,而它读到的PORTB 第0 脚,却是相当于低电位(被二极管拉为0.7V)。
当它再把整个PORTB 的值写出去的时候,PORTB 第0 脚就被写成低。