将流水灯程序写入24C02的程序

合集下载

I2C24LC02C读写例程(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 发出特定的低电平脉冲,表示已收到数据。

24c02读写实验c程序

24c02读写实验c程序
{ucharRomDat[4];
Init();//初始化
DispBuf[2]=Hidden;
DispBuf[3]=Hidden;
for(;;)
{
Calc(RecBuf[1],RomDat[0]);//分别显示地址和数据
if(Rec)//接收到数据
{Rec=0;//清除标志
if(RecBuf[0]==0)//第一种功能,写入
TR1=1;
}
void Calc(uchar Dat1,uchar Dat2)//第一个参数放在第1、2位,第二个参数放入第5、6位
{DispBuf[0]=Dat1/16;
DispBuf[1]=Dat1%16;
DispBuf[4]=Dat2/16;
DispBuf[5]=Dat2%16;
}
void main()
/**************************************************
24C02.C
功能描述:
PC端发送3个数据n0,n1,n2.
n0=0,写,将n1写入n2地址中
n0=1,读,读出n1地址中的数据,n2不起作用,但必须有
收到一个字节后,将其地址值显示在数码管第1、2位上,数值显示在第5、6位上
sbit we=P2^7;
sbit du=P2^6;
uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,
0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
Rec=1;//置位标志

C语言程序写入按键次数到24c02,并读出来显示在4个LED上

C语言程序写入按键次数到24c02,并读出来显示在4个LED上
TestAck();
Write8Bit(ch);
TestAck();
Stop();
DelayMs(10);
}
//从24c02中读出8个bit
uchar Read8Bit()
{
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp--)
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一个52标准内核的头文件
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(address);
TestAck();
Start();
Write8Bit(ReadDviceAddress);
TestAck();
ch=Read8Bit();
NoAck();
Stop();
{
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
}
return(rbyte);
}
//从24c02中读出1个字节
uchar Read24c02(uchar address)
{
uchar ch;

c51写的24c02的读写程序

c51写的24c02的读写程序
#define WriteDeviceAddress 0xa0
#define ReadDviceAddress 0xa1
/***************************************************************************/
sbit SCL=P1^4;
sbit SDA=P1^3;
sbit DOG=P3^7;
/***************************************************************************/
void DelayMs(unsigned int number) {
unsigned char temp;
bit TestAck() {
bit ErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
/***************************************************************************/
RamAddress++;
bytes--;
}
*RamAddress=Read8Bit();
NoAck();
Stop();
}
/***************************************************************************/
}
/***************************************************************************/

应广单片机读写24C02程序代码

应广单片机读写24C02程序代码

应广单片机读写24C02程序代码#include "extern. h〃#include ,z main. h"] f• 1 • • I • • I • • I • • I • • I • • I • • I • • 1 • • I • • I • • I • • I • • I • • I • • I • • 1 • • I • • I • • I • • I •• I • • I • • I • • 1 • • I • • I • • I • • I • • I • • I • • I • • 1 • • I • • I • • I • • I • • I • • I • • I • • 1 • • I • • I • • I • • I • • I • • I • • I • • 1 • • I • • I •1 /t f ^<w vVw vTw vVw »«W VBW VgW VlW vaw vVw vTw vVw »«W VBW VgW VlW vaw vVw vTw vVw »«W VBW VgW VlW vaw vVw vTw vVw »«W VBW VgW VlW vaw vVw vTw vVw »«W VBW VgW VlW vaw vVw vTw vVw »«W VBW VgW VlW vaw VBW vTw//??0aI2C?0?0I2C_SDA equ pb. 2I2C_SCL equ pb. 0I2C_SDA_DIR equ pbc. 2I2C_SCL_DIR equ pbc. 0I2C_L0NG_DLY equ 50I2C_SH0RT_DLY equ 20I2C_SDA_HIGH equ setl I2C.SDA I2C_SDA_L0W equ setO I2C.SDAI2C_SCL_HIGH equ setl I2C.SCL I2C_SCL_L0W equ setO I2C.SCLI2C SDA OUTPUT equ setl I2C SDA DIR I2C SDA INPUT equ setO I2C SDA DIRI2C SCL OUTPUT equ setl I2C SCL DIR I2C SCL INPUT equ setO I2C SCL DIR //??0aI2C?aA?uchar i2c_rw_addr; //?AD?M0O? uchar i2c_rw_byte; //?AD?fiy?Y uchari2c_rw_cmd; //?AD?MA J£??t)M0O? uchar i2c_rw_temp; //?AD??y?10D?a?aA? uchar i2c_rw_cnt; //?AD??y?tOD?a?aA?// ----------------------------------------- //?U£U STARTDA°A//i2c_start:I2C SDA OUTPUTI2C_SCL_0UTPUTI2C_SDA_HIGHdelay I2C_L0NG_DLYI2C_SCL_HIGHdelay I2C_L0NG_DLYI2C_SDA_L0Wdelay I2C_L0NG_DLYI2C_SCL_L0Wdelay I2C_L0NG_DLY ret// -------------------//?ufiiiSTOPDA0 A// -------------------i2c_stop:I2C_SCL_L0Wdelay I2C_L0NG_DLYI2C_SDA_L0Wdelay I2C_L0NG_DLYI2C_SCL_HIGHdelay I2C_L0NG_DLYI2C_SDA_HIGHdelay I2C_L0NG_DLY ret////?1?QSALVE ACKDA O A// ------------------------------------------ i2c_slave_ack://don't check ACKI2C_SDA_INPUTdelay I2C_SH0RT_DLYI2C_SCL_HIGHdelay I2C_SH0RT_DLYI2C_SCL_LOWdelay I2C_SH0RT_DLYI2C_SDA_0UTPUTI2C_SDA_L0Wdelay I2C_SH0RT_DLYret// -----------------------------//餡?6MASTER ACKDA°A //----------------------------- i2c_master_ack:I2C_SDA_0UTPUTI2C_SDA_L0Wdelay I2C_SH0RT_DLYI2C_SCL_HIGHdelay I2C_SH0RT_DLYI2C_SCL_LOWdelay I2C_SH0RT_DLYret////骼?6MASTER NACKDA O A// -------- i2c_master_nack:I2C_SDA_0UTPUTI2C_SDA_HIGHdelay I2C_SH0RT_DLYI2C_SCL_HIGHdelay I2C_SH0RT_DLYI2C_SCL_L0Wdelay I2C_SH0RT_DLY ret// -------------------------------//D?0??oXO?0//Input: i2c_rw_temp//Used: i2c_ _rw_cnt// -------------------------------i2c_write_8bit:i2c rw ent = 8;i 2c_wr i t e_8b i t_loop:sic i2c_rw_tempswapc I2C_SDAdelay I2C_SHORT_DLYI2C_SCL_HIGHdelay I2C_SHORT_DLYI2C SCL LOWdelay I2C_SH0RT_DLYdzsn i2c_rw_cntgoto i2c_write_8bit_loopret// ----------------------------------- //?A0??dxo?0//Used: i2c_ _rw_cnt//Output: i2c_rw_temp // ----------- i2c_read_8bit:i2c_rw_temp = 0;i2c rw ent = 8;delay I2C_SHORT_DLYi2c_read_8bit_loop:I2C_SCL_HIGHdelay I2C_SHORT_DLYswapc I2C_SDAsic i2c_rw_tempI2C_SCL_LOWdelay I2C_SHORT_DLYdzsn i2c_rw_cntgoto i2c_read_8bit_loopret// ----------------------------------- //Input: i2c_rw_addr // i2c_rw_cmd//Used: i2c_ _rw_cnt// i2c_rw_temp //Output: i2c_rw_bytei2c_read_byte://startcall i2c_start//write device address(write) i2c_rw_temp = i2c_rw_cmd; calli2c_write_8bit//slave ackcal1 i2c_slave_ack//write register address i2c_rw_temp = i2c_rw_addr;call i2c_write_8bit//slave ack//don't check ACKcal1 i2c_slave_ack//start repeatcall i2c_start//write device address(read) i2c_rw_temp = i2c_rw_cmd; i2c_rw_temp・ 0 二1;call i2c_write_8bit//slave ack//don't check ACKI2C_SDA_INPUTdelay I2C_SHORT_DLYI2C_SCL_HIGHdelay I2C_SHORT_DLYI2C_SCL_LOWdelay I2C_SHORT_DLY //OaAi? 10fia(;6?dI2C_SDA??6Ax a ? fia?d//read datai2c_rw_temp = 0;call i2c_read_8biti2c_rw_byte = i2c_rw_temp; //store data//master nackcall i2c_master_nack//stopcall i2c_stop//retunedelay I2C_LONG_DLYwdresetret// ----------------------------------//Input: i2c_rw_addr // i2c_rw_byte // i2c_rw_cmd //Used: i2c_rw_cnt // i2c_rw_temp // --------------------------------i2c_write_byte://startcall i2c_start//write device address i2c_rw_temp = i2c_rw_cmd;call i2c_write_8bit//slave ack//don't check ACKcall i2c_slave_ack//write register address i2c_rw_temp = i2c_rw_addr;call i2c_write_8bit//slave ack//don't check ACKcal1 i2c_slave_ack//write datai2c_rw_temp = i2c_rw_byte;call i2c_write_8bit//slave ack//don't check ACKcall i2c_slave_ack//stopcall i2c_stop//retunedelay I2C_L0NG_DLYwdresetret© equ OxAO// ------------------------------- //°?CyAu: eeprom_read_byte //Input: i2c_rw_addr//Used: i2c. _rw_cnt// i2c_rw_temp//Output: i2c_rw_byte// ------------------------------- eeprom_read_byte:i2c_rw_cmd = EEPROM_RW_CMD;goto i2c_read_byte // X ?0a0aA 1 6A M A£(^ 10 X a// ------------------------------- //°?£yAu: eeprom_write_byte //Input: i2c_rw_addr// i2c_rw_byte//Used: i2c_ _rw_cnt// i2c_rw_temp//X?0a?° M?6Ai§°6D^d a ^?y0??i fi??a0O??O?D??0 X ? t e?fi// ------------------------------- eeprom_write_byte:i2c_rw_cmd = EEPROM_RW_CMD;goto i2c_write_byte // X ?0a0aAi6ApAfi(pl0X a。

24c02编写程序步骤

24c02编写程序步骤

1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。

被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。

开始信号:当SCL为高电平时,SDA发生从高到低的跳变,就定义为开始信号。

停止信号:当SCL为高电平时,SDA发生从低到高的跳变,就定义为结束信号。

2、数据传输的字节格式SDA传送数据是以字节为单位进行的。

每个字节必须是8位,但是传输的字节数量不受限制,首先传送的是数据的最高位。

每次传送一个字节完毕,必须接收到从机发出的一个应答位,才能开始下一个字节的传输。

如果没有接受到应答位,主机则产生一个停止条件结束本次的传送。

那么从机应该发出什么信号算是产生了应答呢?这个过程是这样的。

当主器件传送一个字节后,在第9个SCL时钟内置高SDA线,而从器件的响应信号将SDA拉低,从而给出一个应答位3、I2C数据传输协议I2C总线的数据传输协议如下:(1)、主器件发出开始信号(2)、主器件发出第一个字节,用来选通相应的从器件。

其中前7位为地址码,第8位为方向位(R/W)。

方向位为“0”表示发送,方向位为“1”表示接受。

(3)、从机产生应答信号,进入下一个传送周期,如果从器件没有给出应答信号,此时主器件产生一个结束信号使得传送结束,传送数据无效。

(4)、接下来主、从器件正式进行数据的传送,这时在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位(传送的时候先送高位,再送低位)。

当一个字节传送完毕时,再发送一个应答位(第9位),如上一条所述,这样每次传送一个字节都需要9个时钟脉冲。

数据的传送过程如下图所示:从左面的电路连接知:A2A1A0=000,可见如果要对24C02进行写操作,寻址字节是1010 000 0;如果对24C02进行读操作,寻址字节是1010 000 1。

用单片机的P1.6脚作为串行时钟线,用P1.7脚作串行数据线。

24c02单片机实验的代码

24c02单片机实验的代码

24c02单片机实验的代码使用24c02单片机进行实验的代码是一种用于存储和读取数据的电路。

这个芯片可以存储8个页面的数据,每个页面有256个字节。

通过I2C总线协议,我们可以通过单片机与24c02进行通信。

在实验中,我们首先需要设置I2C总线的通信参数,包括时钟频率和设备地址。

然后,我们可以使用写操作将数据写入24c02中的特定地址。

写操作的过程包括发送起始信号、设备地址、数据地址和数据。

写操作完成后,我们可以使用读操作来读取存储在特定地址的数据。

读操作的过程类似于写操作,但是在发送设备地址后,我们需要发送读命令,然后从24c02中读取数据。

为了简化代码,我们可以使用现成的库函数来实现I2C通信和数据读写。

这些库函数可以提供更高层次的抽象,使得代码更加易于理解和维护。

例如,我们可以使用Wire库函数来实现I2C通信,使用write函数和read函数来实现数据的写入和读取。

下面是一个使用24c02单片机进行实验的示例代码:```c#include <Wire.h>#define DEVICE_ADDRESS 0x50void setup() {Wire.begin();Serial.begin(9600);}void loop() {byte data = 0x55;// 写入数据到地址0x00Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x00);Wire.write(data);Wire.endTransmission();delay(100);// 读取地址0x00的数据Wire.beginTransmission(DEVICE_ADDRESS); Wire.write(0x00);Wire.endTransmission();Wire.requestFrom(DEVICE_ADDRESS, 1);if (Wire.available()) {byte readData = Wire.read();Serial.print("Read data: ");Serial.println(readData, HEX);}delay(1000);}```在这个示例代码中,我们首先在setup函数中初始化I2C通信和串口通信。

24C02读写程序

24C02读写程序

24C02读写程序HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s简介:HT24系列的EEPROM是通过I2C协议控制其读写的。

HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。

HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。

一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。

另外两个管脚为电源脚VCC,VSS。

用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。

引脚名称I/O 功能描述A0~A2 I地址输入VSS I电源负极输入SDA I/O串行数据输入/输出SCL I串行数据传送时钟信号输入WP I写保护VCC I电源正极输入HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM 的第几页,HT24系列的EEPROM空间大小如下表所示:型号引脚A0、A1及A2使用方法容量大小HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、A2数据和芯片引脚A0、A1、A2所接状态需一一对应2K(256×8)HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空4K(512×8,2pages)HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2所接状态需一一对应,其余引脚浮空8K(1024×8,4pages)HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)HT49 MCU系列单片机读写HT24系列的EEPROM应用范例程式说明:本文是以HT49R30A-1控制HT24LC04为例的。

ATMEL24c02使用详解(汇编及C程序都有)

ATMEL24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解(汇编及C程序都有)1000字ATMEL 24c02是一种串行EEPROM存储器,具有2KB的存储容量,可通过I2C总线进行读写操作。

使用ATMEL 24c02时,需先设置I2C总线的通信速率和设备地址。

然后,可以使用汇编语言或C语言编写程序进行读写数据操作。

汇编语言程序示例:1. 设置I2C总线通信速率及设备地址```LDAA #$0 ;设置I2C总线通信速率为100kHzSTAA SCLDIVLDAA #$A0 ;设置EEPROM的设备地址为0xA0STAA SLA```2. 写入数据到EEPROM```BYTE_WRITE PROCLDAA #$00 ;设置数据的存储地址为0x00STAA DADDRLDAA #$A5 ;设置需要写入的数据为0xA5STAA DATAJSR I2C_WRITE ;调用I2C总线写入函数RTSBYTE_WRITE ENDP```3. 从EEPROM读取数据```BYTE_READ PROCLDAA #$00 ;设置数据的读取地址为0x00STAA DADDRJSR I2C_START ;发送起始信号LDAA #$A1 ;设置EEPROM的设备地址为0xA1,读操作时需要在地址末位添加1JSR I2C_SEND ;发送EEPROM设备地址LDAA #$00 ;设置要读取的数据长度为1JSR I2C_READ ;调用I2C总线读取函数LDA DATA ;将读取到的数据保存到DATA寄存器中RTSBYTE_READ ENDP```C语言程序示例:1. 在main函数中,调用I2C_Init()函数,设置I2C总线速率和设备地址。

```void main(){I2C_Init(); //设置I2C总线速率和设备地址}```2. 写入数据到EEPROM```void Write_Byte(unsigned char addr, unsigned char dat) {I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置存储地址I2C_SendByte(dat); //写入数据I2C_Stop(); //发送停止信号}```3. 从EEPROM读取数据```unsigned char Read_Byte(unsigned char addr){unsigned char res;I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置读取地址I2C_Start(); //发送起始信号I2C_SendByte(0xa1); //设置EEPROM的设备地址为读取模式 res = I2C_ReadByte(); //读取数据I2C_Stop(); //发送停止信号return res; //返回读取的数据}```即可进行EEPROM的读写操作。

AT24C02连读连写流水灯测试存储设备C51原创的。。免费下载已通过

AT24C02连读连写流水灯测试存储设备C51原创的。。免费下载已通过

AT24C02连读连写流水灯测试存储设备C51原创的。

免费下载已通过* 时序,还是时序在模拟时序时不能出错* 写一个字节数据是A T24C02自动才生一个应答,我们只要检测到就行。

然后发送下一字节* 读一个字节后我们要写另一个应答通知A T24C02,。

它接收我们的信号才会发下一个字节,不然我们不能进行连读******************************************************************/#include<C51.H>#include<INTRINS.H>#include<CLIB.H>// P1为流水灯。

实验用来显示数据是否能够正常读写//实验板上A0 A1 A2 全部接地而且SDA SCL没有接上拉电阻#define SDA P2_0#define SCL P2_1#define W_slave 0XA0#define R_slave 0xa1typedef unsigned char uchar ;typedef unsigned int uint ;bit ack=0;uchar code str_1[]={0x01,0x02,0x03,0x30,0x35,0x36,0x37,0x38,0x39,0x30};uchar get_str_1[8];/*******************************************AT24C02初始化*******************************************/void AT24C02_Init(void);/******************************************** AT24C02 起动*********************************************/static void AT24C02_Start();/******************************************** AT24C02 停止* __nop_()为一个单指令周期*11.0592MHZ一个单指令周期为1.08us********************************************/static void AT24C02_End() ;/****************************************** 写应答******************************************/static void AT24C02_Write_ACK() ;/**************************************** 读应答****************************************/static void AT24C02_Read_ACK();/****************************************发送一个字节****************************************/static void AT24C02_Send_Char(uchar ch);/****************************************接送一个字节****************************************/static uchar AT24C02_Get_Char();/****************************************AT24C02延时****************************************/static void flash(void) ;/**************************************** 发关一个字节*****************************************/static void AT24C02_Write_One(uchar address,uchar dat);/*****************************************接收一个字节*****************************************/static uchar AT24C02_Read_One(uchar address);/*****************************************连续写N个字节*****************************************/void AT24C02_Write_Str(uchar address,uchar * str,uchar num);/****************************************************** 连读N个字节*****************************************************/void AT24C02_Read_Str(uchar address,uchar *str,uchar num);/****************************************MAIN()******************************* ***************/void main(void){// uchar tample=0x00;uchar x=0;// uchar *_str;A T24C02_Init();// AT24C02_Write_One(0x20,0xa0); //test .... 写后立即读写需要时间延时,我这里用最小的1ms能够,比// delay1ms(1); //这更小的还没有进行测试,但是没有延时读取失败。

S3C2440定时器(一)--流水灯

S3C2440定时器(一)--流水灯

定时器功能很多,我们现在先做个简单的实验,即0.5s定时,使四个led循环点亮。

代码如下,注释已经写得很清楚了:#define GLOBAL_CLK 1#include <stdlib.h>#include <string.h>#include "def.h"#include "option.h"#include "2440lib.h"#include "2440addr.h"#include "2440slib.h"#include "mmu.h"#include "profile.h"#include "memtest.h"#define GPB5_out (1<<(5*2)) //led1#define GPB6_out (1<<(6*2)) //led2#define GPB7_out (1<<(7*2)) //led3#define GPB8_out (1<<(8*2)) //led4#define led1_on ~(1<<5)#define led2_on ~(1<<6)#define led3_on ~(1<<7)#define led4_on ~(1<<8)#define led1_off (1<<5)#define led2_off (1<<6)#define led3_off (1<<7)#define led4_off (1<<8)void __irq Timer0_handle();void Main(void){//配置基本I/O口rGPBCON=GPB5_out|GPB6_out|GPB7_out|GPB8_out; //设置GPB5-8为输出rGPBDAT=led1_off|led2_off|led3_off|led4_off; //led灭//配置中断寄存器ClearPending(BIT_TIMER0);//清SRCPND,INTPND的定时器0中断标志位EnableIrq(BIT_TIMER0);//开定时器0中断使能//配置定时器寄存器rTCFG0|=0xf9;//预定标值=249rTCFG1|=0x01;//定时器0进行4分频,f=50M/(249+1)/4=50KHZrTCNTB0=25000;//定时时间=25000*(1/f)=0.5srTCON|=(1<<1); // 手动更新rTCON=0x09; // 自动加载,清“手动更新”位,启动定时器0//装入定时器0中断函数地址pISR_TIMER0=(U32)Timer0_handle;while(1);}void __irq Timer0_handle() //中断服务函数{static unsigned int count;count++;ClearPending(BIT_TIMER0);//清SRCPND,INTPND的定时器0中断标志位 if(count%4==1) //第一次进入中断,led1亮,其他灭{rGPBDAT=led2_off|led3_off|led4_off;}if(count%4==2) //第二次进入中断,led2亮,其他灭{rGPBDAT=led1_off|led3_off|led4_off;}if(count%4==3) //第三次进入中断,led3亮,其他灭{rGPBDAT=led1_off|led2_off|led4_off;}if(count%4==0) //第四次进入中断,led4亮,其他灭{rGPBDAT=led1_off|led2_off|led3_off;}}在线调试,led循环点亮,ok!大功告成!。

24C02-多花样流水灯演示程序

24C02-多花样流水灯演示程序
CALL WAITACK
MOV A,B
CALL SENDBYTE
CALL WAITACK
CALL STOP
MOV R4,#1 ;每写入1个字节,延时若干MS
CALL DELAY_5MS
RET
;----------------------------------------------------
;读操作子程序
;-----------------------------------------------------
WRITE_DATA:
MOV R0,#00H ;数据写入首地址
MOV R1,#72 ;共写入72个字节的数据
MOV DPTR,#TAB ;查表
WR_LOOP:
CLR A
MOVC A,@A+DPTR
void write_byte( uchar addr, uchar write_data);
void fill_byte(uchar fill_size,uchar fill_data);
0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,
0x9F,0xCF,0xE7,0xF3,0xF9,0xFC,0xFF,
0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,
0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF,
;-----------------------------------------------------
RCVBYTE:
MOV R7,#08 ;一个字节共接收8位数据
CLR A
SETB SDA ;释放SDA数据线
R_BYTE:

24c02典型程序

24c02典型程序
iic_start();
iic_write(adwrite); //24c02写地址
iic_ack();
iic_write(address); //24c02起始存储地址写入可自动+1
iic_ack();
for(i=0;i<num;i++) //循环写入num个字节
{
iic_write(date[i]);
iic_ //读数据
iic_noack();
iic_stop(); //最后非应答
return q; //读回该地址存储的数
}
/*******************************************
函数名称:main()
功能:初始化及循环调用子函数显示
函数名称:rom_write()
功能:循环写进num个字节
参数:如下
返回值:无
********************************************/
void rom_write(uchar date[],uchar address,uchar num)
{
uchar i; //循环次数
unsigned char rom_read (uchar address)
{uchar q;
iic_start();
iic_write(0xae);//写入芯片地址
iic_ack();
iic_write(address); //写入存储地址
iic_ack();
iic_start();
iic_write(0xaf); //读回地址
参数:无
返回值:无
********************************************/
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void delay()
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
void delayms(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}Hale Waihona Puke */#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit scl=P3^6;
sbit sda=P3^7;
uchar temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
return dat;
}
void main()
{
uchar num,i;
while(1)
{
for( i=0;i<8;i++)
{
num=read_dat2402(7);
write_dat2402(7,temp[i]);//加一写入24C02
delayms(100);
P0=num;
}
}
}
while((sda==1)&&(i<200))i++;
scl=0;
delay();
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dat=dat<<1;
scl=0;
delay();
sda=CY;
scl=1;
delay();
}
scl=0;
}
uchar read_byte()
{
uchar date,i;
for(i=0;i<8;i++)
{
date=date<<1;
scl=1;
delay();
if(sda)
{
date=date|0x01;
}
scl=0;
}
return date;
}
void write_dat2402(uchar add,uchar dat)//向24C02写一个字节进去
{
uchar dat;
start();
write_byte(0xa0);//器件地址以及写入操作
ack();
write_byte(add);//读出数据的地址
ack();
start();
write_byte(0xa1);//器件地址以及读取操作
ack();
dat=read_byte();
stop();
void start(void)
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop(void)
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack(void)
{
uchar i;
scl=1;
delay();
/************将数据写入AT24C02然后从24C02中读出**************
**************数据在P0口显示,显示效果,为100MS**************
**************流水灯P0口流水灯的接口P3.6P37为24C02***********
**************的scl和sda接口************
{
start();
write_byte(0xa0);//器件地址以及写入操作
ack();
write_byte(add);//写入数据的地址
ack();
write_byte(dat);//写入的数据
ack();
stop();
}
uchar read_dat2402(uchar add)//从24C02读一个字节进去
相关文档
最新文档