历史上的今天
今天是:2025年02月21日(星期五)
2020年02月21日 | 注释非常详细的51单片机IIC源程序
2020-02-21 来源:51hei
自己写的IIC程序,因为初学,还是有借鉴的地方,但是所有程序均为手打,每一行都有详细的注释
单片机源程序如下:
#include #include sbit IIC_SDA=P2^6; //声明IIC总线的数据线接在单片机的P2.6端口。 sbit IIC_SCL=P2^7; //声明IIC总线的时钟线接在单片机的P2.5端口。 //void delay(unsigned int t) //{//延时函数 // while(t){t--;}; //延时循环计数 //} //------------------------------------------------------------------- void delay_IIC(void) {//IIC总线限速延时函数。 //该函数是空函数,延时4个机器周期。 ; ; } //------------------------------------------------------------------- void IIC_Init(void) {//IIC总线初始化函数 IIC_SDA=1;//释放IIC总线的数据线。 IIC_SCL=1;//释放IIC总线的时钟线。 } //------------------------------------------------------------------- void IIC_start(void) {//IIC总线产生起始信号函数 IIC_SDA=1;//拉高数据线 IIC_SCL=1;//拉高时钟线 delay_IIC(); IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。 delay_IIC(); IIC_SCL=0;//拉低时钟线 } //------------------------------------------------------------------- void IIC_stop(void) {//IIC总线产生停止信号函数 IIC_SDA=0;//拉低数据线 delay_IIC(); IIC_SCL=1;//拉高时钟线。 delay_IIC(); IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。 delay_IIC(); } //------------------------------------------------------------------- bit IIC_Tack(void) {//接收应答信号函数 bit ack;//定义一个位变量,来暂存应答状态。 IIC_SDA=1;//释放数据总线,准备接收应答信号。 delay_IIC(); IIC_SCL=1;//拉高时钟线。 delay_IIC(); ack=IIC_SDA;//读取应答信号的状态。 delay_IIC(); IIC_SCL=0;//拉低时钟线。 delay_IIC(); return ack;//返回应答信号的状态,0表示应答,1表示非应答。 } //------------------------------------------------------------------- void IIC_write_byte(unsigned char Data) {//向IIC总线写入一个字节的数据函数 unsigned char i; for(i=0;i<8;i++)//有8位数据 { IIC_SDA=Data&0x80;//写最高位的数据 delay_IIC(); IIC_SCL=1; //拉高时钟线,将数写入到设备中。 delay_IIC(); IIC_SCL=0;//拉低时钟线,允许改变数据线的状态 delay_IIC(); Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备 } } //------------------------------------------------------------------- unsigned char IIC_read_byte() {//从IIC总线读取一个字节的数据函数 unsigned char i; unsigned char Data; //定义一个缓冲寄存器。 for(i=0;i<8;i++)//有8位数据 { IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。 delay_IIC(); Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。 delay_IIC(); if(IIC_SDA)//如果数据线为高平电平。 Data=Data|0x1;//则给缓冲字节的最低位写1。 IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。 delay_IIC(); } return Data;//返回读取的一个字节数据。 } void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data) {//向任意地址写入一个字节数据函数 IIC_start();//产生起始信号 IIC_write_byte(Daddr);//写入设备地址(写) IIC_Tack();//等待设备的应答 IIC_write_byte(Waddr);//写入要操作的单元地址。 IIC_Tack();//等待设备的应答。 IIC_write_byte(Data);//写入数据。 IIC_Tack();//等待设备的应答。 IIC_stop();//产生停止符号。 } //------------------------------------------------------------------- unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr) {//从任意地址读取一个字节数据函数 unsigned char Data;//定义一个缓冲寄存器。 IIC_start();//产生起始信号 IIC_write_byte(Daddr);//写入设备地址(写) IIC_Tack();//等待设备的应答 IIC_write_byte(Waddr);//写入要操作的单元地址。 IIC_Tack();//等待设备的应答。 IIC_start();//产生起始信号 IIC_write_byte(Daddr+1);//写入设备地址(读)。 IIC_Tack();//等待设备的应答。 Data=IIC_read_byte();//写入数据。 IIC_stop();//产生停止符号。 //-------------------返回读取的数据-------------------- return Data;//返回读取的一个字节数据。 }
史海拾趣
|
DSO-2150 USB 流线型设计,体积小巧, USB2.0接口,免电源,与台式示波器类似界面,易于上手. 更适合于笔记本电脑,生产线维修调整,便于出差使用。 小的尺寸(mm):190(L)x100(W)x35(H) ,便于携带. .高刷新率, 高采样率,150MS/s实时采样. 软 ...… 查看全部问答> |
|
在keil编译 错误一大堆烦死了,大家帮帮忙看下 哪出问题了 先谢谢了 #include sbit p3_0=P3^0; sbit p0_0=P0^0; sbit p0_1=P0^1; void delay(unsigned int k); int cheak(unsigned char *jj); void scankey(); int n=0; main() {   ...… 查看全部问答> |
|
在WINCE 6.0下,内核下的EXE以及DLL都能正常运行,外部数字签名过的EXE以及DLL也可以在这个内核下运行。任何无数字签名的EXE以及DLL则不能运行。不知该如何做? 我在平台定制时,已经将sysgen_certmod设为1。重新build and sysgen。 … 查看全部问答> |
|
谁能举个例子, 比如,我想使用arm芯片的I/O口C,也就是GPGC,用它的若干个口吧,比如8~11 该如何调用这个函数呢?期待答案,谢谢 … 查看全部问答> |
|
Error[Pe020]: identifier "BCSCTL1" is undefined 头文件:#include<msp430x41x.h> 请帮忙分析下,应该是头文件里没BCSCTL1的定义。如果如此,又应该包含哪个头文件呢。… 查看全部问答> |
|
SPS-2000焊锡搅拌机(MALCOM)特长:无铅焊锡搅拌时温度等的关系是重要的因素MALCOM <SPS-2000>设定了温度管理、实现搅拌自动停止机能,无论是刚从冰箱拿出的锡膏,工作人员只需按一下按钮就可以搅拌出最佳的状态的锡膏机器。公转约 ...… 查看全部问答> |
|
理论篇讲述了一个逻辑工程师是如何发展的,并且给出了各个阶段的特征,但是,仍然没给出清晰的量化,本章,尝试对这个问题给出一个解决方案。逻辑工程师应该掌握的各种能力大概设置了5种能力,每种能力在不同的阶段有不同的要求。其中,设计完成能 ...… 查看全部问答> |




