PIC16C74B单片机与AT24C64通讯

合集下载

SPI 串行EEPROM 与PIC16 单片机的接口设计 00909B_cn

SPI 串行EEPROM 与PIC16 单片机的接口设计 00909B_cn

2006 Microchip Technology Inc.DS00909B_CN 第1页AN909引言在连接SPI 主器件(如单片机)与SPI 从器件(如EEPROM )进行通信时,对于设计人员来说,了解发送到存储器的命令顺序至关重要。

借助于Microchip 本应用笔记和相关的示例代码,可以使得在系统设计中引入SPI EEPROM 的工作变得相当容易。

本应用笔记只讨论了一种设计方法,由于不同应用的系统要求不尽相同,其设计方法与本文所讨论的方法可能会有出入。

本文讨论了设计人员该如何去建立单片机与SPI EEPROM 进行通信的架构,并为在电子系统中使用多个SPI 从器件的复杂设计方案提供了一个设计参考起点。

除此之外,最重要的一点是,通过本应用笔记系统设计人员会了解到,在发送任何命令序列到SPI EEPROM 前必须先读取STATUS 寄存器。

图 1:简易数据传输模型固件说明本固件程序的作用是通过SPI 总线,把PIC16F630单片机EEPROM 中的128个字节数据发送到25LC160B 器件的128个连续单元中。

系统不用借助于任何硬件模块,而是通过软件实现SPI 总线通信,这样可以使用任意I/O 端口与EEPROM 器件进行通信。

图1所示为该设计方法的概念模型。

PIC16F630内部EEPROM 中的数据被写入25LC160B 器件的前四页。

通过修改固件开始处的定义说明,设计人员可以很容易地改变目标地址。

另外还可以使用类似的方法修改每页的大小。

当程序运行时,使用一个LED 阵列来指示程序的进程。

为了便于LED 指示灯更清楚地表明程序的运行状态,在每个运行状态的初始处添加了较长的延时,这同时有利于程序调试。

在25LC160B 装入128字节数据信息后,PIC16F630会读取并校验25LC160B 器件中的内容,并将校验和写入自身EEPROM 中。

之后程序返回到第一个状态,再次重复该通信序列。

OKDA简介

OKDA简介
■ MICROCHIP
TC7107CPL PIC16C54/16C57 PIC12C508A PIC16F72 PIC16C622A PIC16F876A PIC16C712 PIC16C74B PIC16F676 PIC16F73 PIC16F630
■ HOLTEK
HT7133A-1 HT1621H HT7550A-1
信 号 发 生器
■ WINBOND
W77E58-40 W78E51B/BP/BF-40 W78E52B/BP-40 W78IE52/54-24
公 司部 分 库 存 型号
W78E54B-24/40 W78E58BP-40 W7854BP-40 W7858B-24 W24257/24258-70LL W27C01/02-70 W27C020P-70 W27E040-12 W27E257-10 W29C020C-90B W29C011A-15 W89C940F W89C840AF
■ BB
XTR101AP XIR104AP XIR106AP
■ 光耦
TLP250/TLP521-1 H11A-817/PC817B/C 4N25/4N35 PC817
■ 品 质 测试
欧克达 通过I SO 900 1认证 。 欧克达 电子 联手 中国电子 元 器件中 心实 验室, 进行 产品质量 与 可靠性 测试 ,确 保 元器件10 0%原装 正品 。欧 克达对 每批 来 料进 行严格 外观 及性 能测试, 同 时联合 全球 知名的 第三方 电 子元 件检 测中 心,利 用先 进的测 试仪器 进行 测试 。所有高 精 密元件 通过 严格的 测试程 序以确 保产 品的 稳定性 及兼 容性, 保证器 件能 满足 它本身规 格 书要求 。
■ MOT/ON

pic16f单片机例程 -回复

pic16f单片机例程 -回复

pic16f单片机例程-回复如何使用PIC16F 单片机编写程序。

第一步:了解PIC16F 单片机的基本知识PIC16F 是一种低功耗、高性能的单片机芯片,由美国微芯科技公司开发。

它拥有多种功能和较大的内存空间,适用于很多应用场景,如家电、汽车电子、工业控制等。

该单片机的主要特点包括:8 位的CPU,最多可存储8KB 的程序代码,具备各种输入/输出接口,支持多种通信协议,并且能够与外部设备进行数据交互。

第二步:准备开发工具和环境在编写PIC16F 单片机程序之前,我们需要准备好相应的开发工具和环境。

常用的工具包括MPLAB X IDE(集成开发环境)、XC8 C 编译器(用于编译C 语言代码),以及一个PICkit 编程器(用于将程序烧录到单片机上)。

安装MPLAB X IDE 后,在软件中选择合适的PIC16F 型号,创建一个新的项目,并将XC8 编译器与之关联。

第三步:编写程序代码在MPLAB X IDE 中,我们可以使用C 语言来编写PIC16F 的程序代码。

以下是一个简单的示例,用于控制一个LED 灯的开关:c#include <xc.h>配置LED 引脚#define LED_PIN RA0#define LED_TRIS TRISA0void main(void) {配置引脚为输出模式LED_TRIS = 0;主循环while (1) {点亮LEDLED_PIN = 1;延时一段时间__delay_ms(1000);熄灭LEDLED_PIN = 0;延时一段时间__delay_ms(1000);}}在这个示例中,我们首先通过宏定义来配置LED 对应的引脚和寄存器。

然后,在主函数中,我们将引脚配置为输出模式,并进入一个无限循环。

在循环中,我们先点亮LED,延时一段时间后再熄灭LED,并再次延时,以实现LED 的闪烁效果。

第四步:编译和烧录程序在编写完程序代码后,我们可以使用MPLAB X IDE 的XC8 编译器对代码进行编译。

基于PIC16F74单片机的高速公路车辆监测系统

基于PIC16F74单片机的高速公路车辆监测系统

基于PIC16F74单片机的高速公路车辆监测系统
宋荣;梁长垠
【期刊名称】《电子测试》
【年(卷),期】2009(000)008
【摘要】为使高速公路车辆参数测量准确、稳定与经济实用,并实现公路交通的智能化管理,本文提出一种利用巨磁阻传感器作为车辆参数检测元件,以PIC16F74单片机为信号处理与控制核心构成一种新型的高速公路车辆监测系统.文中给出了系统设计方案,并详细介绍了车辆参数监测系统的基本原理,信号处理系统的硬件电路结构与软件流程,并给出现场实验测试数据.实验结果表明,本系统对高速公路上车辆流量的测量精度达100%,对车辆行驶速度检测的精度可达95%以上,可以完全取代目前广泛使用的地埋线圈测量系统.
【总页数】4页(P47-50)
【作者】宋荣;梁长垠
【作者单位】深圳职业技术学院电子与信息工程学院,深圳,广东,518055;深圳职业技术学院电子与信息工程学院,深圳,广东,518055
【正文语种】中文
【中图分类】TP212
【相关文献】
1.基于P89LPC935单片机的高速公路监测系统的设计 [J], 谢代华;冯正勇
2.基于单片机PIC16F74的电动按摩椅的研制 [J], 吴永明;刘锦铃;罗海据
3.基于单片机PIC16F74的电动按摩椅的研制 [J], 吴永明;刘锦铃;罗海据
4.昌樟、温厚高速公路车辆超速智能监测系统设计 [J], 文勇;熊伟峰;江颖;
5.基于改进的YOLOv4高速公路车辆目标检测研究 [J], 王滢暄;宋焕生;梁浩翔;余宵雨;云旭
因版权原因,仅展示原文概要,查看原文内容请购买。

PIC24系列单片机原理与开发

PIC24系列单片机原理与开发

端口 RB 的基本功能为可编程的输入输出双向口,此外也可工作在它的第 2,3 等功能 PGD1/EMUD1/PMA6/VREF+/AN0/CN2/RB0 PGC1/EMUC1/VREF-/AN1/CN3/RB1 C2IN-/AN2/SS1/CN4/RB2 C2IN+/AN3/CN5/RB3 C1IN-/AN4/CN6/RB4 C1IN+/AN5/CN7/RB5 PGC2/EMUC2/AN6/OCFA/RB6 PGD2/EMUD2/AN7/RB7 U2CTS/C1OUT/AN8/RB8 PMA7/C2OUT/AN9/RB9 TMS/PMA13/CVREF/AN10/RB10 TDO/PMA12/AN11/RB11 TCK/PMA11/AN12/RB12 TDI/PMA10/AN13/RB13 PMA1/U2RTS/BCLK2/AN14/RB14 PMA0/AN15/OCFB/CN12/RB15 16 15 14 13 12 11 17 18 21 22 23 24 27 28 29 30 I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O
有 有 有 有 有 有 有 有 有
PIC24FJ128GA010 100 128K
JTAG
PIC24 系列单片机原理与开发 by Zeng
2012-6-8
1.3
PIC24FJ64GA006 引脚图和引脚功能说明
在单片机应用系统中,需通过单片机引脚与系统中的信息进行交换,即输入输出,来实现系 统硬件的所需的各种功能。因此作为设计者需要详细了解单片机的每个引脚的功能 ,这样才能正 确、灵活地设计单片机应用系统的硬件和软件 。PIC24F 系列单片机所集成的外设功能很多 ,大部 分引脚复合了多种功能。PIC24FJ64GA006 单片机是 64 引脚薄型正方扁平封装 (12x12x1 mm), 其引脚排列如图 1-3 所示。

17 EEPROM指导书

17 EEPROM指导书

目录EEPROM原理 (3)EX17.1、EEPROM的存取 (7)EX17.2、EEPROM连续存取 (11)EEPROM原理串行EEPROM中,较为典型的有ATMEL公司的AT24CXX系列和AT93CXX等系列产品,它们是I2C 总线式串行器件。

串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。

I2C总线是一种用于IC器件之间连接的二线制总线。

它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

以Atmel公司的2线EEPROM为例,从AT24C01~AT24C16,其内存架构分别由16page*8byte、32page*8byte、32page*16byte、64page*16byte、128page*16byte组成。

寻址字节需要7~11bit 的数据字。

AT24C32和AT24C64分别由128page*32byte、256page*32byte组成。

系统提供了2个字节的寻址数据字。

引脚描述SCL:串行时钟SDA:串行数据A2~0:设备地址、页地址WP:写禁止VCC:电源供电GND:地器件操作在数据传送过程中,必须确认数据传送的开始和结束。

在I2C总线技术规范中,开始和结束信号(也称启动和停止信号)的定义如图所示。

t wr:一个写序列的有效结束条件到一个内部的写周期结束。

时钟和数据传输:SDA引脚正常状态下由外部器件拉高。

SDA上的数据只有在SCL为低的时间段才能进行改变,在SCL为高时SDA数据的更改会表现为如下所述的一个开始条件或者一个结束条件。

开始条件:SCL为高,SDA由高变为低是一个开始条件,开始命令优先于其他所有的命令。

结束条件:SCL为高,SDA由低变为高是一个结束条件。

在一个读序列之后的结束命令,会将EEPROM置于一个待机电源模式。

PIC单片机的晶振接法详解

PIC单片机的晶振接法详解

PIC 单片机的晶振接法详解
PIC 单片机有4 种振荡模式:
Blocked Ad
具体翻译过来什幺意思,大家自己去领会,翻译出来就没意思了。

这里告诉大家两个单词的含义,有助于理解:
Crystal:晶体
Oscillator:振荡器
Crystal Oscillator:晶体振荡器,简称晶振
晶振是个器件,接上相关电路后它就会振动,就像心脏跳动的脉搏一样,正常工作的心脏跳动是有规律的脉搏,所以正常工作的晶振也是有规律的波形。

晶振就是单片机的心脏,只不过这个心脏多数时候在外边,不在单片机内部(有些单片机除外)。

心脏跳动就是脉搏,晶振跳动就叫振荡,用示波器都可以看到他们的波形。

第一种晶振接法:
以PIC16F877 为例,常用的是这种接法。

PIC16系列单片机与PC机串行通信的软硬件实现

PIC16系列单片机与PC机串行通信的软硬件实现

PIC16系列单片机与PC机串行通信的软硬件实现1 前言美国Microchip公司的PIC16系列单片机是一种新型的CMOS工艺的8位单片机。

其中,PIC16FXX单片机的程序存储器为电可擦除闪速存储器(flash),可多次修改程序,甚至可以在线编程。

PIC16F83和PIC16F84片内数据存储器除RAM外,还有64字节的EEPROM,可以当作一般的或非易失性的数据存储器使用,简单方便。

它还具有片内上电复位、延时电路、看门狗电路等。

另外,PIC16系列单片机功耗极低,因而是一种非常适合在各种便携式设备中使用的高性价比的单片机,并已经得到了越来越广泛的应用。

但是在许多需要大量计算的运用中,还必须借助微机的强大数据处理能力。

这样必须通过通信电路实现PIC单片机与微机间的可靠数据传输。

有的PIC16单片机内并没有提供串行口,所以串行通信必须通过自己设计的硬件电路和通信软件来实现。

下面介绍用查询法实现异步串行通讯的方法。

同时给出了用PIC16F84单片机的两个I/O口模拟2线串行口的硬件接口电路、程序流程框图、单片机内通信程序以及微机内的通信程序等。

2 硬件实现方法与电路PIC16F84单片机的程序存储器由1K&times;14的闪速(flash)存储器构成,它只有13条I/O口,1个定时器,为了尽量节省单片机的软硬件资源,采用下述异步串行通信的实现方法。

,PIC16F84在4MHz时钟下,采用半双工方式,可实现9600波特率的异步串行数据通信,1位停止位,8位数据位,无校验位。

接收和发送以低位在先(一般模式),采用软件延时。

为节省篇幅,单片机内的通信程序中未提供任何握手协议,用户可根据自己的需要在软件中加入握手方式。

由于PIC16F84单片机本身没有专门的串行口,这里用其I/O口来模拟串行口的功能。

PC机的串行接口是符合EIA RS-232C规范的外部总线标准接口。

RS-232C采用的是负逻辑,即逻辑&ldquo;1&rdquo;:-5V至-15V;逻辑&ldquo;0&rdquo;:+5V至+15V。

PIC16C74单片机应用与编程探讨

PIC16C74单片机应用与编程探讨

文章编号:100622475(2006)0120031203收稿日期:2004212220作者简介:黄道敏(19712),女,安徽凤阳人,空军雷达学院讲师,研究方向:电工电子及仿真技术;陈元娣(19722),女,湖北黄陂人,讲师,研究方向:电工电子及仿真技术。

PIC16C74单片机应用与编程探讨黄道敏,陈元娣(空军雷达学院,湖北武汉 430010)摘要:PIC 系列单片机以其高性价比获得了日益广泛的应用,本文以PIC16C74为对象,对它的实际应用与编程中的一些具体问题做一探讨。

关键词:PIC16C74;单片机中图分类号:TP368.1 文献标识码:ADiscussion on Application and Programming of PIC16C74MicrocomputerH UANG Dao 2min ,CHE N Y uan 2di(AFRA ,Wuhan 430010,China )Abstract :PIC series microcomputers obtain increasing broad application by theirs high performance/price ration.This paper taking PIC16C74as representation ,discusses s ome concrete issues in the application and programming of PIC16C74.K ey w ords :PIC16C74;microcomputer0 引 言美国Microchip 公司推出的PIC 系列单片机以其功能强、可靠性高、低功耗、操作速度快、价格低等优点,获得了日益广泛的应用,相比于目前国内流行的单片机(如MCS 251,96系列),大有后来居上之势。

目前介绍PIC 单片机应用与编程的书较少,笔者结合自己近几年来使用PIC 单片机的实际经验,以PIC16C74为代表,对它的实际应用与编程中的一些具体问题做一探讨,以供PIC 单片机用户参考。

PIC24F系列十六位单片机原理与实验(注意事项、实验一)

PIC24F系列十六位单片机原理与实验(注意事项、实验一)
上电时,PORTB 端口被初始化为模拟端口,不能工作在数字模式(进行 I/O 端口读取)。 AD1PCFG 寄存器为 PORTB 端口模拟输入引脚配置控制位,AD1PCFG 寄存器的位为 1 时 PORTB 对应的引脚被配置为数字模式,此时 PORTB 端口对应的位可以进行 I/O 端口读取。
下篇 第 3 章 单元接口实验
(1)、外部主晶振与 RC12/RC15 管脚复用,使用主晶振时,RC12/RC15 管脚不能用作 I/O 端口。当单片机不使用主晶振时,将 JP3A 和 JP3B 跳线的 2-3 短路,RC12/RC15 可以 用作 I/O 端口。
(2)、外部辅助晶振与 RC13/RC14 管脚复用,使用辅助晶振时,RC13/RC14 管脚不能 用作 I/O 端口。当单片机不使用辅助晶振时,将 JP4A 和 JP4B 跳线的 2-3 短路,RC13/RC14 可以用作 I/O 端口。
对比上边两幅图可看出,需要修改的字段如下:
1、 Primary Oscillator Select (主振荡器选择位) 此处选择 HS Oscillator Enabled
厦门大学信息科学与技术学院——单片机原理与接口技术实验室——海韵园实验楼 305#
第 230 页
PIC24F 系列十六位单片机原理与实验(试用版)
3、操作顺序 为保证 ICD2 能正常工作,调试目标板时按如下步骤进行: (1)、电脑开机; (2)、MPLAB ICD2 的 USB 端口连接到电脑 PC 机的 USB 口(如果已经连接则可跳过此
步); (3)、MPLAB ICD2 的 6 芯水晶头接入用户目标板(如果已经连接则可跳过此步),之
后目标板接通电源。 (4)、启动 MPLAB IDE 工作环境; (5)、MPLAB IDE 中建立项目,编写程序并进行硬件调试。 其中,(2)与(4)步骤不能颠倒。

PIC24系列单片机原理与开发

PIC24系列单片机原理与开发

PIC24系列单片机原理与开发
一、单片机原理
单片机是一种集成电路芯片,它集中了CPU、存储器、输入输出接口以及各种外设接口等部分。

PIC24系列单片机采用16位的CPU架构,具有较高的运算速度和较强的处理能力。

它可以运行多种操作系统并支持多种编程语言,如C语言、汇编语言等。

PIC24系列单片机的外设包括通用输入输出口、定时器、串口、模拟转换器等。

通用输入输出口可以用来连接各种外部设备,如传感器、按钮等。

定时器可以用来生成各种定时信号,实现各种定时功能。

串口可以用于与其他设备进行通信,如与电脑进行数据传输。

模拟转换器可以将模拟信号转换为数字信号,用于处理各种模拟数据。

二、单片机开发
硬件设计方面,需要根据具体的应用需求设计电路板。

电路板通常包括单片机芯片、外设接口、电源电路、输入输出端口等。

在设计电路板时需要注意电路的稳定性、耐干扰性和可靠性等因素。

软件编程方面,需要编写程序代码来控制单片机的运行。

程序通常使用C语言或汇编语言编写。

编写程序的主要目的是实现特定的功能,如控制外设、处理输入输出数据等。

软件编程需要具备一定的编程基础和单片机相关知识。

总结:
PIC24系列单片机是一种高性能、低功耗的16位微控制器系列,具有高速运行、丰富的外设和低功耗特点。

单片机开发包括硬件设计和软件
编程两个方面,需要根据具体的应用需求设计电路板,并编写程序代码来实现特定的功能。

单片机开发还需要使用一些开发工具,如开发板和编程器。

基于PIC单片机的24路输入信号监测模块

基于PIC单片机的24路输入信号监测模块
具 有 较 强 的兼 容 性 和可 移 植 性
外. 全部采用 S MT贴 片T艺 . 保证元件焊接质量的 同时也加强 了电路 板 的抗 干扰 能力
2 . 软 件 开 发
MP L A B X I DE是 Mi c mc h j p公 司针 对 P I C系 列 单 片机 开发 的 最新 的集成开发环境 . 综合 了编辑器 、 项 目管理器和设计平台等功能。 信 号 监测模块 的单片机 程序使 用 c语 言编程 . 程序指 令简洁 , 开发过 程高 效、 实用 信号监测模块 主要具备信号采集和显示 、 数据处理计 算以及 监测数据传输等 功能.其 中信号采集和状态显示为模块 的基 本功 能 而 当模块接收到特殊指令后 。 则会根据其采样信号 的状 态完成 数据处 理计算和传输的功能 当正常上电后 . 模块首先确定其通讯地址编码 , 然后将实时扫描 2 4 路 信号输 入端 口的状态 如有信号输入 . 模块将其 对应 的 L E D点亮 . 指示其输入状态 . 并且从通讯端 口向上位机发送各
通道 的信号输入状态信 息 、 j j 用户操作模块 的功能按键或模块收到上 位机 发送 的数据处理指令后 。 模块将 进人数据处理功能状态 。 此时 , 模 1 . 硬 件 设 计 块 除继续采样并显示各通道状态外 . 还会累加计算输入信号的持续时 1 . 1主控 芯 片的 选 择 间. 并通过通讯端 口将 信号输入状态 、 输 入的持续时 间等数据持续发 P I C 单 片机是 南 M i c r 0 c h i p 公 司开发的系列单 片机 产品 .因为其 送给上位机 当任一通道输入信号终止后 , 模块将停止对应 的计 时; 当 具 有功能完善 、 功耗低 、 抗干扰能力强 、 编程指令高效 等特 点 , 使其广 全部输入信号终止后 . 模 块将完成此次信 号处理任 务. 回到普通 的数 泛应用于各类_ r _ . 业领域 . 能够适用于较为恶劣 的使用环境 信号 监测 据采集状态 . 同时 向上位机发送任 务完成的 回馈 . 等待 接收新 的数据 模块采用的主控芯片为 P I C1 6 F I 5 1 2系列 8位单片机 该 系列单 片机 处 理 指令 。 为新一代 的高性 能 R I S C单 片机 . 具 备优化 的 c编译器架构 . 数据指 3 . 应 用 案 例 - 令仅为 4 9条 , 网此 单片机 程序简洁 、 开发过程更加高效 。 此外 , 单片机 应急灯具放 电时f . 3 N试系统为信号监测模块的典型应 用之一 每 的2 8个引脚 中有 2 5个 为 1 / O 口. 正是 由于其 丰富的片上 资源 . 使得 只信号监测模块具有独立 的通讯地址编码 . 模块与控制 主机之 间采用 该信号监测模块能够具备 2 4 个信号采样通道 . 能够 同时完成对 2 4路 标准的 MOD B U S通讯协议 .系统最大容量能够保证 1 0 0只监测模 块 开关 量输入信号进行采样和处理 同时在线 .即能够 同时对 2 4 0 0台应急灯具 的放 电时间进行测 量。其 l _ 2电路设计 中. 应急灯具 的丁作状 态通 过光学传感器转换为 D C 5 V的开关量 信号 信号监测模块的内部电路 由上下 两块 电路板组成 , 分别为上层板 传至模块的输入端 当灯具点亮 时输入信号为真 . 灯具熄 灭时输入信 和下层板 . . 其 中下层板为主控板 . 主要 由单片机及其外围电路 、 信号输 号终止 灯具进入应急状 态后 , 用 户通过操作模块 的按键 或控 制上值 入接 口 、 通讯接 口和电源处理单 元等部分组成 , 主要用于对输 入信号 机 向其发送数据处理指 令 .模块 开始对灯具 的放 电时间累加计时 , 并 进行采样 和处理 . 根据特定 指令完成对数据 的处理运算 , 然后 通过通 实时向上位机上传灯具 的状态 和放 电时间等数据 . . 当模块所监控的全 讯 接 口将 数 据 处 理 结 果 发 送 给 上 位机 或 其 他 控 制 终 端 模 块 的 信 号 输 部灯具熄灭 、 输入信 号终止后 , 模块 向控制主机 发送信 息 , 完成灯具放 入 接 口 南 分 别 置 于 电路 板 上 下 边 沿 的两 组 6 * 2的 R . 1 1 l 捅座构 成 . 输 电时间 的检测工作 入通道 为 2 4路 R J l 1 插座为 6 P 4 C型 , 除 了能够接 收 D C 4 . 2 ~ 5 . 2 V的 4 . 结束 语 开关量输入信号外 . 还能够为外设器件提供 D C 5 V的供 电 模 块的通 本文 介绍 的开关量信号 监测模块 以常 用的 P I C单片机作 为主控 讯接 V I 采用 R S 一 4 8 5串行 总线接 口.在电路板 上 由 1 组2 l的 R J 4 5 芯 片, 性能稳定 、 抗干扰能力强 , 具 有 采样 通 道 丰 富 、 可独立编址 、 功 能 插座构成 . 通过普通网线互连即可实现对多个模 块的组网 模块的电 完善等特点 除 了具备常规输人模块的信号采样 、 传输等功能外 , 特有 源部分采 只 { k C 2 2 0 V转 D C 5 Y1 A的开关电源 . 配合电路内部的电源管 的信号处理和累加计时模式使其能满足特定应用场合的需 要。 配合 桐 理芯片 . 保证 了对单 片机 的稳定供电 , 提高了电路的抗 干扰 能力 。 应的前端传感器 . 信 号监测模块 能够进 行灯具应急 时间检测 、 蓄电池

PIC单片机24C512程序范本

PIC单片机24C512程序范本

PIC单片机24C512程序范本/********************* PIC16F886 读写AT24C512 *********************/#include__CONFIG(XT&WDTDIS); //定义配置字,晶振类型:XT,关闭看门狗#define sda RC4 //EEPROM SDA接RC4#define scl RC3 //EEPROM SCL接RC3#define RSPIN RA0 //LCD 1602 RS接RA0#define RWPIN RA1 //LCD 1602 R/W接RA1#define EPIN RA2 //LCD 1602 E接RA3bit eepromdi;bit eepromdo;//---------------------------------------// 非精确延时函数//-----------------------------------------void delay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++){for(j=0;j<10;j++){asm("CLRWDT"); //必须要加喂狗指令,否则到这里就会复位}}//---------------------------------------// 1602忙检测函数//-----------------------------------------void lcd_wait_busy(void){TRISB7=1;RSPIN=0;RWPIN=1;EPIN=1;// while(RB7==1); //读忙状态,不忙时退出。

proteus仿真时不能检测1602的忙信号,用延时替代delay(7);EPIN=0;TRISB7=0;}//---------------------------------------// 1602写命令函数//-----------------------------------------void lcd_write_com(unsigned char combuf){RSPIN=0;RWPIN=0;PORTB=combuf;EPIN=1;asm("NOP"); //空操作,延时一个指令周期EPIN=0;//---------------------------------------// 1602写命令函数(带忙检测)//-----------------------------------------void lcd_write_com_busy(unsigned char combuf){lcd_wait_busy();lcd_write_com(combuf);}//---------------------------------------// 1602写数据函数(带忙检测)//-----------------------------------------void lcd_write_data(unsigned char databuf){lcd_wait_busy();RSPIN=1;RWPIN=0;PORTB=databuf;EPIN=1;asm("NOP");EPIN=0;}//---------------------------------------// 1602显示地址写函数//-----------------------------------------void lcd_write_address(unsigned char x,unsigned char y) {x&=0x0f;y&=0x01;if(y==0x00)lcd_write_com_busy(x|0x80);elselcd_write_com_busy((x+0x40)|0x80);}//---------------------------------------// 1602初始化函数//-----------------------------------------void lcdreset(void){delay(150);lcd_write_com(0x38);delay(50);lcd_write_com(0x38);delay(50);lcd_write_com(0x38);lcd_write_com_busy(0x38);lcd_write_com_busy(0x08);lcd_write_com_busy(0x01);lcd_write_com_busy(0x06);lcd_write_com_busy(0x0c);}//---</t;i++)------------------------------------// 指定地址写入函数//-----------------------------------------void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf){lcd_write_address(x,y);lcd_write_data(buf);}//--------------------------------------- // 延时函数//----------------------------------------- void delay1(void){unsigned char k;for(k=0;k<180;k++)asm("CLRWDT");}//--------------------------------------- // 启动I2C总线函数//----------------------------------------- void i2cstart(void){scl=1;asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");sda=1;delay1();sda=0;delay1();scl=0;delay1();}//--------------------------------------- // 终止I2C总线函数//----------------------------------------- void i2cstop(void){sda=0;sda=0;asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");scl=1;delay1();sda=1;delay1();scl=0;delay1();}//--------------------------------------- // 从I2C总线读入一位数据函数//----------------------------------------- void bitin(void){eepromdi=1;TRISC4=1;scl=1;asm("NOP");asm("NOP");asm("NOP");asm("NOP");eepromdi=sda;asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");scl=0;asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");TRISC4=0;}//--------------------------------------- // 向I2C总线写入一位数据函数//----------------------------------------- void bitout(void){sda=eepromdo;asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");scl=1;asm("NOP");asm("NOP");asm("NOP");asm("NOP");scl=0;asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");}//--------------------------------------- // 向I2C总线写入一字节函数//----------------------------------------- void i2cwrite(unsigned char sedata) {unsigned char k;for(k=0;k<8;k++){if(sedata&0x80){eepromdo=1;}else{eepromdo=0;}sedata=sedata<<1;bitout();}bitin();}//---------------------------------------// 从I2C总线读出一字节函数//----------------------------------------- unsigned char i2cread(void){unsigned char redata;unsigned char m;for(m=0;m<8;m++){redata=redata<<1;bitin();if(eepromdi==1){redata|=0x01;}else{redata&=0xfe;}asm("NOP");}eepromdo=1;bitout();return redata;}//---------------------------------------// 从AT24C64指定地址上读出1字节数据函数//----------------------------------------- unsigned char read_24C64(unsigned int address){unsigned char eebuf3;i2cstart();i2cwrite(0xa0);i2cwrite(address>>8);i2cwrite(address%256);i2cstart();i2cwrite(0xa1);eebuf3=i2cread();i2cstop();return eebuf3;}//---------------------------------------// 向AT24C64指定地址上写入1字节数据函数//-----------------------------------------void write_24C64(unsigned int address1,unsigned char byte) {i2cstart();i2cwrite(0xa0);i2cwrite(address1>>8);i2cwrite(address1%256);i2cwrite(byte);i2cstop();}//---------------------------------------// 初始化端口函数//-----------------------------------------void init(void){ANSEL=0X00; //所有IO为数字IOANSELH=0X00; //所有IO为数字IOOSCCON=0X08; //系统时钟由CONFIG决定TRISA=0B11111000; //RA1,RA2,RA3置为输出,其他置为输入TRISB=0B00000000; //RB0-RB7置为输出1TRISC=0B11100111; //RC3,RC4为输出,其他置为输入RBIE=0; //RB口电平变化中断禁止}//---------------------------------------// 主函数//-----------------------------------------void main(void){unsigned char data,buf;unsigned int a;init();lcdreset(); //复位1602lcd_write_char(0,0,'a');lcd_write_char(1,0,'d');lcd_write_char(2,0,'d');lcd_write_char(3,0,'r');lcd_write_char(4,0,'e');lcd_write_char(5,0,'s');lcd_write_char(6,0,'s');lcd_write_char(8,0,'|');lcd_write_char(10,0,'W');lcd_write_char(8,1,'|');lcd_write_char(10,1,'R');while(1){for(a=0;a<65535;a=a+64){data=rand(); //产生随机数据lcd_write_char(0,1,a/10000+0x30);lcd_write_char(1,1,(a%10000)/1000+0x30); lcd_write_char(2,1,(a%1000)/100+0x30); lcd_write_char(3,1,(a%100)/10+0x30);lcd_write_char(4,1,a%10+0x30);write_24C64(a,data); //写数据lcd_write_char(12,0,data/100+0x30);lcd_write_char(13,0,(data%100)/10+0x30); lcd_write_char(14,0,data%10+0x30);buf=read_24C64(a); //读数据lcd_write_char(12,1,data/100+0x30);lcd_write_char(13,1,(data%100)/10+0x30); lcd_write_char(14,1,data%10+0x30);delay(3000);}}}。

24c64数据写入全攻略(AT24C64)

24c64数据写入全攻略(AT24C64)

○1硬件:STC89C52,AT24C64首先是AT24c64的硬件电路:其中scl与单片机的P3.6口相连Sda与单片机的P3.7口相连10k上拉电阻是必须要加的。

连接好单片机与at24c64后,开始程序部分。

○2我用这个eeprom是为了存储LCD5110液晶显示模块的字库,LCD5110不带字库,因此只能把生成的字库存入at24c64中。

我的LCD5110显示程序可参考:/393275398/blog/item/c7562e5e30162250fbf2c0a5.html字模提取软件下载(配套软件的使用说明)/c0z0c9l9q7○3当我们提取了我们需要的字的字模后如:{0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00},{0x00,0x00,0xF0,0xFE,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0xFE,0xF0,0x00},{0x00,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x1F,0x00},{0x00,0x00,0x00,0x00,0x01,0x03,0x06,0x04,0x04,0x04,0x06,0x03,0x01,0x00,0x00,0x00},//"0"{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x04,0x04,0x04,0x06,0x07,0x07,0x06,0x04,0x04,0x04,0x00,0x00,0x00},//"1"0和1的字模,我们要将它写入到at24c64中。

基于PIC单片机的便携式测试记录仪设计

基于PIC单片机的便携式测试记录仪设计

基于PIC单片机的便携式测试记录仪设计基于PIC单片机的便携式测试记录仪设计基于PIC单片机的便携式测试记录仪(以下简称记录仪)既有一般数据采集装置的实时采集与保存功能,同时又能够对采集数据进行实时处理、显示和打印。

适用于对采集速度要求不高、交流供电比较困难以及无须长期留人值班的场合。

以追求高可靠、低功耗、小体积设计思想的本记录仪具有如下功能对现场物理量进行实时采集、保存、处理与显示;自动识别现场安装的传感器数量、传感器号和量程;自动和手动两种采集方式,自动采集适用于长期无人值班的固定场合,手动采集便于对分布在不同区域的物理量进行测试;与PC机通讯,可根据需要将采集数据下载至PC数据库;实时打印;自检功能,避免了系统运行过程中可能遇到本身无法容错处理的异常事件而导致的死机现象。

1硬件设计1.1总体设计原则根据高可靠、低功耗、小体积的设计思想及应用对象几乎对采集速度无要求(此处指系统本身的采集速度已远远超过实际应用要求)的特性,总体设计原则是元器件采用低功耗、宽范围工作电源的CMOS集成电路;总线采用口线少的串行总线;允许情况下,尽量用软件实现硬件功能,用中断代替查询工作方式;一旦系统空闲则立即使其进入低功耗休眠状态,当需要时再用外部中断予以唤醒。

1.2硬件组成根据总体设计原则,硬件组成如图1所示。

其中单片机为美国MicroChip公司的中档产品PIC16C74,+5V供电、4MHz主频时功耗低于2mA;E2PROM存储阵列由超低工作电压(+2.5V~+5.5V)、具有可编程选择多种特性的8KB智能化电可擦除存贮器24LC65芯片组成。

其中,0#为传感器识别片(以下简称识别片),保存现场实际安装的传感器数量、传感器号及量程。

该芯片被设计在放大器板上,永久安装于现场。

传感器号由4位数字组成,前2位表示组号,后2位表示传感器组内号。

1#为字典片,分为三个存储区第一存储区被设置成高寿命写入区,保存表头参数,如疵点单元计数器、记录计数器、记录指针、自动采集时间等;第二存贮区为字典区,保存传感器修正系数、实时打印所涉及的汉字国标码等,查找时以传感器号为关键字进行指针定位;第三存储区被定义为疵点单元地址队列,保存在写过程中遇到的疵点单元地址。

PIC单片机与24LC256 IIC通信程序

PIC单片机与24LC256 IIC通信程序

PIC单片机与24LC256 IIC通信程序注:网上找来的,不记得哪里下的,能用,再发出来与大家共享,感谢原作者!# include<pic.h># define uch unsigned char# define unint unsigned int# define SDA RC4# define SCL RC3uch ACK;void delay(void) //延时{unint m;for(m=0;m<0xffff;m++)continue;}void start (void) // IIC开始{TRISC3=0; //置输出TRISC4=0;SDA=1;asm("nop");SCL=1; //在至少4u秒期间SDA从高电平到低电平asm("nop");asm("nop");asm("nop");SDA=0;asm("nop");asm("nop");asm("nop");SCL=0;asm("nop");asm("nop");}void stop(void) // IIC结束{ TRISC3=0;TRISC4=0; //置输出SDA=0;asm("nop");SCL=1; //在至少4u秒期间SDA从低电平到高电平asm("nop");asm("nop");asm("nop");SDA=1;asm("nop");asm("nop");asm("nop");SCL=0;asm("nop");asm("nop");}uch check(void) // 检查应答信号 {TRISC4=1;SCL=0;SCL=1;if (SDA == 1){ACK = 1;}else{ACK = 0;}SCL=0;return(ACK);}void send(uch data) // 发送一个字节{uch bitcount=8; //发送8位do{TRISC3=0; //置输出TRISC4=0;if((data&0x80)==0x80){SDA=1; //发送 1}else{SDA=0; //发送 0}SCL=0; // 在时钟大于4u秒期间写数据SCL=1;asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");SCL=0;data=data<<1;bitcount--;} while(bitcount);TRISC4=1 ; //释放总线等待应答 asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");}uch recive(void) //接受一个字节{uch temp1=0;uch bitcount1=8;TRISC4=1; //置输入TRISC3=0;do{ SCL=0; //在时钟大于4u秒期间读数据SCL=1;asm("nop");asm("nop");if(SDA) //读 1{temp1=temp1|0x01;}else //读 0{temp1=temp1&0xfe;}SCL=0;if(bitcount1-1){temp1=temp1<<1;}bitcount1--;}while(bitcount1);return(temp1);}void ack(void) //发送继续读信号{SDA=0;SCL=0;SCL=1;asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");SCL=0;}void nack(void) //停止继续读{SDA=1;SCL=0;SCL=1;asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");SCL=0;}void wrtoROM(uch *data,unint address,uch num) //给24LC256写数据{ unint i;unint adrl=address%256; //低8位地址unint adrh=address/256; //高8位地址start(); //起始信号send(0xa2); //写主控器识别地址,本人是a2do{;}while(check()); //等待应答send(adrh); //送数据高8位地址do{;}while(check()); //等待应答send(adrl); //送数据低8位地址do{;}while(check()); //等待应答for(i=0;i<num;i++,data++){send(*data); //发送数据do{;}while(check()); //等待应答}stop(); //停止delay(); //延时,下次发数据}void rdfromROM(uch *pdata,unint address,uch num2) //从24LC256中读数据{ unint adrl;unint adrh;uch j;for(j=0;j<num2;j++,pdata++){adrl=address%256; //地址低位adrh=address/256; //地址高位start(); //开始send(0xa2); //写主控器识别地址(写),本人是a2do{;}while(check()); //等待应答send(adrh); //送高位do{;}while(check()); //等待应答send(adrl); //送低位do{;}while(check()); //等待应答start(); //开始读数据send(0xa3); //写主控器识别地址(读)do{;}while(check()); //等待应答*pdata=recive();nack();stop();address=address+1; //指向下一个地址}}main(){ unint h,n;uch m;uch str[64]={0x5d,0x5d,0x32,0x18,0x6c,0x88,0xa0,0x1d,0x20,0x08};SCL=1;SDA=1;PORTD=0XFF;TRISD=0;for(n=0;n<256;){wrtoROM(str,n,64); //写一页的数据,根据24LC256一页是64个字节 n=n+64; //写下一页数据}for(h=0;h<64;h++) //数组清0{str[h]=0x21;}delay();rdfromROM(str,0x02,64); //读从地址0开始的一页数据while(1){for(m=0;m<64;m++){PORTD=str[m];delay();PORTD=0XFF;delay();}}}。

PIC单片机定时电路的应用研究

PIC单片机定时电路的应用研究

PIC单片机定时电路的应用研究李小琴【摘要】Based on the PIC16F74 microcontroller and the DS1302 clock chip research,design a timer circuit,the circuit has a real-time display,the school,there are five timer setting function,the application in a rice cooker unattended,it can automatically startup and shutdown,to people's lives is a big convenience.%通过对单片机PIC16F74和时钟芯片DS1302的研究,设计了定时器电路。

结果表明,该定时器电路具有实时显示、校时以及5个定时设置功能。

该定明器应用在电饭煲等电器上时,可自动启动和关闭,给人们的生活带来了很大的便利。

【期刊名称】《宁波职业技术学院学报》【年(卷),期】2012(000)002【总页数】3页(P14-16)【关键词】单片机;定时器;设置【作者】李小琴【作者单位】宁波职业技术学院,浙江宁波315800【正文语种】中文【中图分类】TP273“电子保姆”这个新名词已经逐渐在我们的日常生活中诞生,人们利用电子技术实现家用电器的控制已经屡见不鲜。

只要您设置好煮饭时间,自动电饭煲就可以为您服务。

早上,当你还在梦乡中,美味的粥就已经煮好了,等待您起床品味;中午、傍晚,当你还在办公室或回家的路上,午饭和晚饭就已经准备好,等待你品尝。

如果您要吃夜宵,夜宵也会为你准备好。

要是您不回家吃饭,1h后电源会自动关闭。

本文以PIC单片机为核心,研究并设计了定时器控制电路,可用在电饭煲等定时控制器上。

图1为系统功能模块。

图1中,系统由电源、MCU主控部分、2个继电器、6个LED指示灯、4位LED数码管、10个按键组成。

单片机模拟I2C总线及AT24C01应用实例(格式整理版)

单片机模拟I2C总线及AT24C01应用实例(格式整理版)

单片机模拟I2C总线及AT24C01应用实例(格式整理版) I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。

I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。

例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。

可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。

1.I2C总线特点I2C总线最主要的优点是其简单性和有效性。

由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。

总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。

I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。

一个主控能够控制信号的传输和时钟频率。

当然,在任何时间点上只能有一个主控。

2.I2C总线工作原理2.1总线的构成及信号类型I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。

在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。

各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。

CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。

这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。

2.2位的传输SDA线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变,见图1:图12.3开始信号SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PIC16C74B鍗曠墖鏈轰笌AT24C64閫氳
;======================================= ;PIC16C74B鍗曠墖鏈轰笌AT24C64閫氳;璇ョ▼搴忓疄鐜扮殑鍔熻兘鏄 細;灏咺2C_A,I2C_B.....I2C_K鍐呭 鍐欏叆EEPROM涓?鍚屾椂鍦‥EPROM涓 鍑烘暟鎹 粠鏂板啓鍏ュ悇涓 瘎瀛樺櫒;======================================= LIST P=16C74B #include ERRORLEVEL -302I2C_A EQU 0X20 I2C_B EQU 0X21I2C_C EQU 0X22I2C_D EQU 0X23I2C_E EQU 0X24I2C_F EQU 0X25I2C_G EQU 0X26 REG1 EQU 0X2BREG2 EQU 0X2CCOUNT EQU 0X71 ;I2CBCOUNT EQU 0X72 ;I2CTXBUF EQU 0X73 ;I2CRXBUF EQU 0X74 ;I2CBUSCON EQU 0X75 ;I2CBUSSTA EQU 0X76 ;I2CI2CBUF EQU 0X77 ;I2CSLAVEADDREQU 0XA0 ;I2CDATAADDRH EQU 0X01 ;I2CDATAADDRL EQU 0X00 ;I2C;--------------------------------------- ;BUSCON;--------------------------------------- SLAVE_RW EQU 7LAST_BYTE_RX EQU 6SLAVE_ACTIVE EQU 5TIME_OUT EQU 4;--------------------------------------- ;BUSSTA;---------------------------------------BUS_BUSY EQU 7TX_PROGRESS EQU 6RX_PROGRESS EQU 5TX_SUCCESS EQU4RX_SUCCESS EQU 3FATAL_ERROR EQU 2 ;SLAVE EEPROM ABORT EQU 1ACK_ERROR EQU 0;---------------------------------------R_NOT_W EQU 0 TRUE EQU 1FALSE EQU 0SDAEQU 0X04 ;I2CSCL EQU 0X03 ;I2C;======================================= ORG 0X00 GOTO START ORG 0X20START BCF STATUS,RP1 BCF STATUS,RP0 CLRF RA CLRF RBCLRF RC CLRF RD CLRF RE BSF STATUS,RP0 CLRF TRISA CLRF TRISB CLRF TRISC CLRF TRISD CLRF TRISE MOVLW 0X02 MOVWF I2C_AMOVLW 0X04 MOVWF I2C_B MOVLW 0X03 MOVWF I2C_C MOVLW 0X03 MOVWF I2C_D MOVLW 0X05 MOVWF I2C_E MOVLW 0X06 MOVWF I2C_F MOVLW 0X04 MOVWF I2C_G;======================================= START1 CALL I2CBUS_INIT CALL REGTOI2CBUF CALL I2CWRITE CALL CLRI2CBUF CALL D10 CALL I2CREAD CALL I2CBUFTOREG GOTO START1;======================================= ;CLRI2CBUF;---------------------------------------CLRI2CBUF BCF STATUS,RP0 MOVLW I2CBUF MOVWF FSR MOVLW 0X08 MOVWF COUNTCLRLOOP CLRF INDF INCF FSR,FDECFSZ COUNT,F GOTO CLRLOOP RETURN;--------------------------------------- ;灏嗗悇涓猂EGSTER鏁版嵁鍐欏叆I2CBUF缂撳啿鍖?---------------------------------------REGTOI2CBUF BCF STATUS,RP0 MOVLW I2CBUF MOVWFFSR MOVFI2C_A,W MOVWF INDF INCF FSR,F MOVF I2C_B,W MOVWF INDF INCF FSR,F MOVF I2C_C,W MOVWF INDF INCF FSR,F MOVF I2C_D,WMOVWF INDF INCF FSR,F MOVF I2C_E,W MOVWF INDF INCF FSR,F MOVF I2C_F,W MOVWF INDF INCF FSR,F MOVF I2C_G,W MOVWF INDF RETURN;---------------------------------------;灏?I2CBUF缂撳啿鍖烘暟鎹 啓鍏ュ悇涓猂EGSTER ;--------------------------------------- I2CBUFTOREG BCF STATUS,RP0 MOVLW I2CBUF MOVWF FSR MOVF INDF,W MOVWF I2C_AINCF FSR,F MOVF INDF,W MOVWF I2C_B INCF FSR,F MOVF INDF,W MOVWF I2C_C INCF FSR,F MOVF INDF,W MOVWF I2C_D INCF FSR,F MOVFINDF,W MOVWF I2C_E INCF FSR,F MOVF INDF,W MOVWF I2C_F INCF FSR,F MOVF INDF,W MOVWF I2C_G RETURN;======================================= ;灏咺2CBUF缂撳啿鍖哄唴鐨勬暟鎹 啓鍏EPROM;=======================================I2CWRITE CALL I2CSTART BTFSS BUSSTA,BUS_BUSY GOTO TX_FAIL BCF BUSCON,SLAVE_RW CALL TX_SLAVE_ADDR BTFSS BUSSTA,TX_SUCCESS ;SUCESSFULL? GOTO TX_FAIL CALL TX_DATA_ADDR BTFSS BUSSTA,TX_SUCCESS GOTO TX_FAIL MOVLW I2CBUF MOVWF FSR MOVLW 07 MOVWF COUNTT_BYTE_LOOP MOVF INDF,WMOVWF TXBUF CALL I2CTXB BTFSS BUSSTA,TX_SUCCESS GOTO TX_FAIL INCF FSR,F DECFSZ COUNT,F GOTO T_BYTE_LOOP GOTO TX_PASSTX_FAIL CALL I2CSTOP BCF BUSSTA,TX_PROGRESS BCF BUSSTA,TX_SUCCESS RETLW FALSETX_PASS CALL I2CSTOP BCF BUSSTA,TX_PROGRESS RETLW TRUE;--------------------------------------- ;浠?EEPROM涓 鍑烘暟鎹 埌I2CBUF瀵勫瓨鍣?---READ BCF STATUS,RP0 BCF BUSSTA,RX_SUCCESS CALL I2CSTART BTFSS BUSSTA,BUS_BUSY GOTO RX_FAIL BCF BUSCON,SLAVE_RW CALL TX_SLAVE_ADDRBTFSS BUSSTA,TX_SUCCESS GOTO RX_FAIL CALL TX_DATA_ADDR BTFSS BUSSTA,TX_SUCCESS GOTO RX_FAIL CALL I2CSTART BSF BUSCON,SLAVE_RW CALL TX_SLAVE_ADDRBTFSS BUSSTA,TX_SUCCESS GOTO RX_FAIL BCF BUSSTA,LAST_BYTE_RX MOVLW I2CBUF MOVWF FSR MOVLW 07 MOVWF COUNT R_BYTE_LOOP MOVLW 0X01 XORWF COUNT,WBTFSC STATUS,Z BSF BUSSTA,LAST_BYTE_RX CALL I2CRXB BTFSS BUSSTA,RX_SUCCESS GOTO RX_FAIL MOVF RXBUF,W MOVWF INDF INCF FSR,F DECFSZ COUNT,F GOTO R_BYTE_LOOP GOTO RX_PASSRX_FAIL CALL I2CSTOP BCF BUSSTA,RX_PROGRESS BCF BUSSTA,RX_SUCCESS RETLW FALSE RX_PASS CALL I2CSTOP BCF STATUS,RP0 BCF BUSSTA,TX_PROGRESS BCF BUSSTA,RX_PROGRESS BSF BUSSTA,RX_SUCCESS RETLW TRUE;======================================= ; I2C鍒濆 鍖?=======================================I2CBUS_INIT BCF STATUS,RP0 MOVFRC,W ANDLW 0X18 MOVWF RC CLRF BUSSTA CLRF BUSCON RETURN ;======================================= ;浼犻€佽 澶囧湴鍧€;鍏ュ彛: BUSCON;鍑哄彛: BUSSTA;=======================================TX_SLAVE_ADDR B
相关文档
最新文档