#include"i2c.h"
/*******************************************************************************
* 函数名 : Delay10us()
* 函数功能 : 延时10us
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Delay10us()
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
/*******************************************************************************
* 函数名 : I2cStart()
* 函数功能 : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿
* 输入 : 无
* 输出 : 无
* 备注 : 起始之后SDA和SCL都为0
*******************************************************************************/
void I2cStart()
{
SDA=1;
Delay10us();
SCL=1;
Delay10us();//建立时间是SDA保持时间>4.7us
SDA=0;
Delay10us();//保持时间是>4us
SCL=0;
Delay10us();
}
/*******************************************************************************
* 函数名 : I2cStop()
* 函数功能 : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿
* 输入 : 无
* 输出 : 无
* 备注 : 结束之后保持SDA和SCL都为1;表示总线空闲
*******************************************************************************/
void I2cStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();//建立时间大于4.7us
SDA=1;
Delay10us();
}
/*******************************************************************************
* 函数名 : I2cSendByte(unsigned char dat)
* 函数功能 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定
* 输入 : num
* 输出 : 0或1。发送成功返回1,发送失败返回0
* 备注 : 发送完一个字节SCL=0,SDA=1
*******************************************************************************/
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。
for(a=0;a<8;a++)//要发送8位,从最高位开始
{
SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号
dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//建立时间>4.7us
SCL=0;
Delay10us();//时间大于4us
}
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待应答,也就是等待从设备把SDA拉低
{
b++;
if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
{
SCL=0;
Delay10us();
return 0;
}
}
SCL=0;
Delay10us();
return 1;
}
/*******************************************************************************
* 函数名 : I2cReadByte()
* 函数功能 : 使用I2c读取一个字节
* 输入 : 无
* 输出 : dat
* 备注 : 接收完一个字节SCL=0,SDA=1.
*******************************************************************************/
unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1; //起始和发送一个字节之后SCL都是0
Delay10us();
for(a=0;a<8;a++)//接收8个字节
{
SCL=1;
Delay10us();
dat<<=1;
dat|=SDA;
Delay10us();
SCL=0;
Delay10us();
}
return dat;
}
/*******************************************************************************
* 函数名 : void At24c02Write(unsigned char addr,unsigned char dat)
* 函数功能 : 往24c02的一个地址写入一个数据
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2cStart();
I2cSendByte(0xa0);//发送写器件地址
I2cSendByte(addr);//发送要写入内存地址
I2cSendByte(dat); //发送数据
I2cStop();
}
/*******************************************************************************
* 函数名 : unsigned char At24c02Read(unsigned char addr)
* 函数功能 : 读取24c02的一个地址的一个数据
* 输入 : 无
* 输出 : 无
*******************************************************************************/
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2cStart();
I2cSendByte(0xa0); //发送写器件地址
I2cSendByte(addr); //发送要读取的地址
I2cStart();
I2cSendByte(0xa1); //发送读器件地址
num=I2cReadByte(); //读取数据
I2cStop();
return num;
}
51单片机基础例程源码学习
需积分: 0 117 浏览量
更新于2023-07-23
收藏 443KB ZIP 举报
51单片机是微控制器领域中的经典型号,由Intel公司推出,因其内部有51个通用寄存器而得名。它广泛应用于各种电子设备,如家电控制、汽车电子、自动化设备等。本资源“51单片机基础例程源码学习”是一个面向初学者的教程,旨在帮助理解51单片机的工作原理和编程技巧。
51单片机的核心是8位CPU,使用C语言或汇编语言进行编程。C语言编程具有易读性好、可移植性强的优点,适合初学者入门。而汇编语言则更接近硬件,对理解和优化程序性能有很大帮助,但对于复杂应用,通常使用C语言编写上层逻辑。
在“基础实验例程”中,你可能会遇到以下常见知识点:
1. **I/O端口操作**:51单片机有P0、P1、P2、P3四个并行I/O端口,用于输入和输出数据。通过设置寄存器的位来控制端口的高低电平,实现与外部设备的交互。
2. **定时器/计数器**:51单片机内置了两个16位定时器(Timer0和Timer1)和一个8位定时器(Timer2),它们可以工作在不同模式下,如定时、计数、波特率发生器等,常用于脉冲产生、延时、采样等任务。
3. **中断系统**:中断是单片机处理突发事件的重要机制。51单片机有多个中断源,如外部中断、定时器中断、串行口中断等。中断服务程序负责处理中断事件,提高系统的实时性。
4. **串行通信**:51单片机的UART(通用异步收发传输器)用于实现与其他设备的串行通信,如ASCII码的发送和接收,常用于模块间的通讯或者与PC机的数据交换。
5. **显示和键盘接口**:7段数码管显示和矩阵键盘是常见的输入输出设备,通过控制IO口和编码译码电路,实现数字和字符的显示,以及按键的扫描识别。
6. **A/D转换和D/A转换**:51单片机一般不内置ADC和DAC,但可以通过扩展芯片实现模拟信号和数字信号的转换,这对于采集传感器数据或控制模拟电路至关重要。
7. **基本电路设计**:了解如何连接单片机与外围器件,如电源、晶振、复位电路、编程接口等,是实现单片机应用的基础。
通过这些基础例程的学习,你可以逐步掌握51单片机的基本操作,包括初始化设置、数据处理、中断处理、通信协议等。实践是检验理论的最好方式,每个例子都应动手实践,通过调试和修改代码来加深理解。同时,配合相关的书籍和教程,理论结合实际,将有助于你在51单片机的道路上走得更远。
记住,学习51单片机不仅是掌握一种技术,更是培养解决问题和动手能力的过程。希望这个“51单片机基础例程源码学习”资源能为你的学习之路点亮一盏灯。
小黑爱上了小白
- 粉丝: 3
- 资源: 13
最新资源
- cim-websocket
- TouchSocket-websocket
- ubuntu-ubuntu
- ABAQUS UMAT&VUMAT子程序二次开发实例源码Fortran DISP 材料损伤断裂弹塑性
- comsol介质阻挡放电DBD模型,可以得到电子数目密度和电子密度等分布
- 声子晶体声表面波光学特性
- 西门子1200博图程序冷却油泵PID控制系统,和多台油泵及水泵G120西门子变频器Modbud RTU通讯,画面采用西门子KTP700触摸屏,内有变频器参数 Modbus通讯报文详细讲解,PID带手动
- STM32F405_RAW-stm32cubemx
- 西门子1200 1500博途单部电梯程序,文件包含一个四层电梯程序,三个六层电梯程序,版本TIA16 仅一个六层电梯有触摸屏画面,程序仅限于用于参考对比 博图版本V15.1及以上
- Javascript-javascript
- 西门子1200PLC加KTP触摸屏画面博途程序案例,博图版本V16,程序具体为电池涂布机浆料输送系统新能源项目 程序结构分: 1.配料系统物料分配输送 2.模拟量转,监测
- 西门子S7-1500暖通空调冷水机组PLC程序案例, 硬件采用西门子1500CPU+ET200SP接口IO模块,HMI采用西门子触摸屏 程序采用SCL控制程序编程,系统水泵采用一用一备,通过程序实现
- 西门子200Smart加维纶触摸屏程序画面程序案例,项目内容为某制造企业疫苗车间控制系统,报告配液工艺,发酵工艺,纯化工艺及CIP清洗工艺控制 程序结构清晰,控制功能较多,包含模拟量,泵,PID,U
- stm32CubeMx_F429-stm32cubemx
- 51单片机8路抢答器(二)C程序、proteus仿真、报告 支持按键设置、LED数码管显示 支持按键设置开始、加分、减分、准备 1.八个按键分别表示1至8号选手 2当按下开始键后,从10秒开始倒计
- ModBus-stm32cubemx