ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:37.48KB ,
资源ID:30500096      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30500096.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(STM32F103读写24C02 C程序有硬件电路图和程序.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

STM32F103读写24C02 C程序有硬件电路图和程序.docx

1、STM32F103读写24C02 C程序有硬件电路图和程序/实验24C02连接在PF口/WP、A0、A1、A2都接地,如下图所示。/单片机:STM32F103 #include stm32f10x_flash.h #include stm32f10x_gpio.h #include stm32f10x_rcc.h #define AT24C02 0xa0 /AT24C02 地址/* 变量定义 -*/GPIO_InitTypeDef GPIO_InitStructure; /GPIOErrorStatus HSEStartUpStatus;unsigned char Count1 , Count

2、2;unsigned int USEC;static vu32 TimingDelay;unsigned char Readzfc;unsigned char pDat8 = 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55;/实验数据unsigned char R_Dat8;/*声明函数 -*/void RCC_Configuration(void);void SysTick_Configuration(void);void Delay_us_24C02(u32 nTime);/*24C02硬件接口*/ #define SData GPIO_Pin_6 /I2C

3、 时钟 #define SCLK GPIO_Pin_7 /I2C 数据 /*宏定义*/#define SCL(x) x ? GPIO_SetBits(GPIOB, SCLK) : GPIO_ResetBits(GPIOB, SCLK)#define SDA(x) x ? GPIO_SetBits(GPIOB, SData) : GPIO_ResetBits(GPIOB, SData)/*变量*/u8 ack;/* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. */void Start_I2c() SDA(1); /SDA=1; 发

4、送起始条件的数据信号 Delay_us_24C02(1); SCL(1); /SCL=1; Delay_us_24C02(5); /起始条件建立时间大于4.7us,延时 SDA(0); /SDA=0; /*发送起始信号*/ Delay_us_24C02(5); / 起始条件锁定时间大于4s SCL(0); /SCL=0; /*钳住I2C总线,准备发送或接收数据 */ Delay_us_24C02(2);/* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. */void Stop_I2c() SDA(0); /SDA=0; /发送结束条

5、件的数据信号 Delay_us_24C02(1); /发送结束条件的时钟信号 SCL(1) ; /SCL=1; 结束条件建立时间大于4s Delay_us_24C02(5); SDA(0); /SDA=1; 发送I2C总线结束信号 Delay_us_24C02(4);/* 字节数据发送函数 函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。*/void SendByte(unsigned char c

6、) unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /要传送的数据长度为8位 if(cBitCnt)&0x80) SDA(1); /SDA=1; 判断发送位 else SDA(0); / SDA=0 Delay_us_24C02(1); SCL(1); /SCL=1 置时钟线为高,通知被控器开始接收数据位 Delay_us_24C02(5); /保证时钟高电平周期大于4s SCL(0); /SCL = 0 Delay_us_24C02(2); SDA(1); /SDA=1 位发送完后释放数据线,准备接收应答位 Delay_us_24C02

7、(2); SCL(1); /SCL=1 Delay_us_24C02(3); if(GPIO_ReadInputDataBit(GPIOF ,SData)=1)ack=0; else ack=1; /判断是否接收到应答信号 SCL(0); /SCL=0; Delay_us_24C02(3);/* 字节数据接收函数 函数原型: UCHAR RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 */ unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; re

8、tc=0; SDA(1); /SDA=1 置数据线为输入方式 for(BitCnt=0;BitCnt8;BitCnt+) Delay_us_24C02(1); SCL(0); /SCL=0 置时钟线为低,准备接收数据位 Delay_us_24C02(5); /时钟低电平周期大于4.7s SCL(1); /SCL=1 置时钟线为高使数据线上数据有效 Delay_us_24C02(2); retc=retc1; if(GPIO_ReadInputDataBit(GPIOF , SData)= 1)retc=retc+1; / SDA = 1读数据位,接收的数据位放入retc中 Delay_us_2

9、4C02(2); SCL(0); / SCL=0; Delay_us_24C02(2); return(retc);/* 应答子函数函数原型: void Ack_I2c(bit a);功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)*/void Ack_I2c(u8 a) if(a=0) SDA(0); /SDA=0;在此发出应答或非应答信号 else SDA(1); /SDA=1; Delay_us_24C02(3); SCL(1); /SCL=1; Delay_us_24C02(4); /时钟低电平周期大于4s SCL(0) ; /SCL=0; 清时钟线,钳住I2C总线

10、以便继续接收 Delay_us_24C02(2); /AT2402的功能函数/* 向有子地址器件发送多字节数据函数 函数原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no); 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。注意: 使用前必须已结束总线。*/u8 ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned c

11、har no) unsigned char i; Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack=0)return(0); SendByte(suba); /*发送器件子地址*/ if(ack=0)return(0); for(i=0;ino;i+) SendByte(*s); /*发送数据*/ if(ack=0)return(0); s+; Stop_I2c(); /*结束总线*/ return(1);/* 向有子地址器件读取多字节数据函数 函数原型: bit RecndStr(UCHAR sla,UCHAR suba,ucahr

12、 *s,UCHAR no); 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。 如果返回1表示操作成功,否则操作有误。注意: 使用前必须已结束总线。*/u8 IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) unsigned char i; Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack=0)return(0); SendByte

13、(suba); /*发送器件子地址*/ if(ack=0)return(0); Start_I2c(); /*重新启动总线*/ SendByte(sla+1); if(ack=0)return(0); for(i=0;ino-1;i+) *s=RcvByte(); /*发送数据*/ Ack_I2c(0); /*发送就答位*/ s+; *s=RcvByte(); Ack_I2c(1); /*发送非应位*/ Stop_I2c(); /*结束总线*/ return(1);void Delay(vu32 nCount) for(; nCount != 0; nCount-);void Delay_us

14、_24C02(u32 nTime)unsigned int USEC = 0; while(USEC != 10000) USEC+; int main() #ifdef DEBUG debug(); /在线调试使用 #endif RCC_Configuration(); /系统时钟配置函数 /NVIC_Configuration(); /NVIC配置函数 /SysTick_Configuration(); /Systick配置函数 /启动GPIO模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOB|RCC_

15、APB2Periph_AFIO, ENABLE); /把调试设置普通IO口 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; /所有GPIO为同一类型端口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /输出的最大频率为50HZ GPIO_Init(GPIOB, &GPIO_InitStruc

16、ture); /初始化GPIOB端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; /所有GPIO为同一类型端口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /输出的最大频率为50HZ GPIO_Init(GPIOF, &GPIO_InitStructure); /初始化GPIOB端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ; GPIO_Init

17、Structure.GPIO_Mode = GPIO_Mode_Out_OD; /开漏输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /输出的最大频率为50HZ GPIO_Init(GPIOF, &GPIO_InitStructure); /初始化GPIOA端口 GPIO_Write(GPIOB,0xffff); /将GPIOB 16个端口全部置为高电 while(1) /=IIC 读取 if(Readzfc = 1) IRcvStr(AT24C02,0,&R_Dat0,8); Readzfc = 0; if(R_Dat2 = 0x55

18、) GPIO_Write(GPIOB,0xffff); Delay(0x3fffff); GPIO_Write(GPIOB,0x0000); Delay(0x3fffff); Readzfc = 0; if(Readzfc = 0) ISendStr(AT24C02,0, &pDat0,8); Readzfc = 1; /* 配置RCC*/void RCC_Configuration(void) /复位RCC外部设备寄存器到默认值 RCC_DeInit(); /打开外部高速晶振 RCC_HSEConfig(RCC_HSE_ON); /等待外部高速时钟准备好 HSEStartUpStatus =

19、 RCC_WaitForHSEStartUp(); if(HSEStartUpStatus = SUCCESS) /外部高速时钟已经准别好 /开启FLASH的预取功能 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /FLASH延迟2个周期 FLASH_SetLatency(FLASH_Latency_2); /配置AHB(HCLK)时钟=SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); /配置APB2(PCLK2)钟=AHB时钟 RCC_PCLK2Config(RCC_HCLK_Div1); /配置AP

20、B1(PCLK1)钟=AHB 1/2时钟 RCC_PCLK1Config(RCC_HCLK_Div2); /配置PLL时钟 = 外部高速晶体时钟*9 PLLCLK = 8MHz * 9 = 72 MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /使能PLL时钟 RCC_PLLCmd(ENABLE); /等待PLL时钟就绪 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /配置系统时钟 = PLL时钟 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCL

21、K); /检查PLL时钟是否作为系统时钟 while(RCC_GetSYSCLKSource() != 0x08) #ifdef DEBUG/* Function Name : assert_failed* Description : Reports the name of the source file and the source line number* where the assert_param error has occurred.* Input : - file: pointer to the source file name* - line: assert_param error line source number* Output : None* Return : None*/void assert_failed(u8* file, u32 line) /* User can add his own implementation to report the file name and line number, ex: printf(Wrong parameters value: file %s on line %drn, file, line) */ /* Infinite loop */ while (1) #endif

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1