/*-----------------------------------------------
名称:IIC协议 EEPROM24c02
论坛:www.doflye.net
编写:shifang
修改:无
内容:此程序用于检测EEPROM性能,测试方法如下:写入24c02一些数据,然后在内存中清除这些数据,
掉电后主内存将失去这些信息,然后从24c02中调入这些数据。看是否与写入的相同。
函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
周期,即晶振频率要小于12MHZ)
------------------------------------------------*/
#include <reg52.h> //头文件的包含
#include <intrins.h>
#define _Nop() _nop_() //定义空指令
// 常,变量定义区
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
sbit LATCH1=P2^2;
sbit LATCH2=P2^3;
sbit SDA=P2^1; //模拟I2C数据传送位
sbit SCL=P2^0; //模拟I2C时钟控制位
bit ack; //应答标志位
void DelayUs2x(unsigned char t);//函数声明
void DelayMs(unsigned char t);
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
启动总线
------------------------------------------------*/
void Start_I2c()
{
SDA=1; //发送起始条件的数据信号
_Nop();
SCL=1;
_Nop(); //起始条件建立时间大于4.7us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //发送起始信号
_Nop(); //起始条件锁定时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //钳住I2C总线,准备发送或接收数据
_Nop();
_Nop();
}
/*------------------------------------------------
结束总线
------------------------------------------------*/
void Stop_I2c()
{
SDA=0; //发送结束条件的数据信号
_Nop(); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //发送I2C总线结束信号
_Nop();
_Nop();
_Nop();
_Nop();
}
/*----------------------------------------------------------------
字节数据传送函数
函数原型: void SendByte(unsigned char c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
------------------------------------------------------------------*/
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((c<<BitCnt)&0x80)SDA=1; //判断发送位
else SDA=0;
_Nop();
SCL=1; //置时钟线为高,通知被控器开始接收数据位
_Nop();
_Nop(); //保证时钟高电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; //8位发送完后释放数据线,准备接收应答位
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; //判断是否接收到应答信号
SCL=0;
_Nop();
_Nop();
}
/*----------------------------------------------------------------
字节数据传送函数
函数原型: unsigned char RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
------------------------------------------------------------------*/
unsigned char RcvByte()
{
unsigned char retc;
unsigned char BitCnt;
retc=0;
SDA=1; //置数据线为输入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; //置时钟线为低,准备接收数据位
_Nop();
_Nop(); //时钟低电平周期大于4.7us
_Nop();
_Nop();
_Nop();
SCL=1; //置时钟线为高使数据线上数据有效
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
/*----------------------------------------------------------------
应答子函数
原型: void Ack_I2c(void);
----------------------------------------------------------------*/
void Ack_I2c(void)
{
SDA=0;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //时钟低电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清时钟线,钳住I2C总线以便继续接收
_Nop();
_Nop();
}
/*----------------------------------------------------------------
非应答子函数
原型: void NoAck_I2c(void);
----------------------------------------------------------------*/
void NoAck_I2c(void)
{
SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //时钟低电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清时钟线,钳住I2C总线以便继续接收
_Nop();
_Nop();
}
/*----------------------------------------------------------------
向无子地址器件发送字节数据函数
函数原型: bit ISendByte(unsigned char sla,ucahr c);
功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
/*bit ISendByte(unsigned char sla,unsigned char c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(c); //发送数据
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
}
*/
/*----------------------------------------------------------------
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
bit ISendStr(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(suba); //发送器件子地址
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s); //发送数据
if(ack==0)return(0);
s++;
}
Stop_I2c(); //结束总线
return(1);
}
/*----------------------------------------------------------------
向无子地址器件读字节数据函数
函数原型: bit IRcvByte(unsigned char sla,ucahr *c);
功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
址sla,返回值在
没有合适的资源?快使用搜索试试~ 我知道了~
51单片机入门100个例程
共1154个文件
plg:192个
lst:114个
obj:113个
5星 · 超过95%的资源 需积分: 47 30 下载量 35 浏览量
2018-12-21
18:53:12
上传
评论 4
收藏 1.41MB ZIP 举报
温馨提示
51单片机入门的C语音例程,有IO口的各种输入输出操作,各种样式的LED点亮、数码管的使用、各种中断和定时器的操作、电机和蜂鸣器的使用
资源推荐
资源详情
资源评论
收起资源包目录
51单片机入门100个例程 (1154个子文件)
1602液晶动态显示 7KB
1602液晶按键输入显示 8KB
1602液晶移动显示 7KB
1602液晶静态显示 6KB
1602滚动显示 6KB
1个独立按键控制led 1KB
1个独立按键控制LED状态转换 2KB
2402存储一个数据 11KB
24c02存储多个数据 13KB
24c02存储花样灯 13KB
24c02记忆开机次数 17KB
2按键加减操作 4KB
2按键加减操作 4KB
8位数码管动态扫描原理演示 2KB
8位数码管动态扫描显示 2KB
8位数码管显示其中之一 1KB
8位数码管静态显示其中之二 1KB
8位端口检测8独立按键 5KB
9999累减 3KB
9999累加 3KB
999累减 3KB
999累加 3KB
99秒累加 3KB
99累减 3KB
9累减 3KB
9累加 3KB
8位数码管动态扫描显示.Uv2.bak 2KB
按键控制单个数码管显示_Uv2.Bak 2KB
单个共阳数码管静态显示_Uv2.Bak 2KB
单个数码管指示逻辑电平_Uv2.Bak 2KB
8位数码管动态扫描显示_Uv2.Bak 2KB
8位数码管显示其中之一_Uv2.Bak 2KB
1602液晶按键输入显示.Uv2.bak 2KB
外部中断1下降沿触发_Uv2.Bak 2KB
24c02记忆开机次数_Opt.Bak 2KB
T1外部计数输入_Uv2.Bak 2KB
显示变化数字_Uv2.Bak 2KB
喇叭发声原理_Uv2.Bak 2KB
报警发声_Uv2.Bak 2KB
按键喂狗_Uv2.Bak 2KB
花样灯.Uv2.bak 2KB
矩阵键盘简易计算器_Opt.Bak 2KB
24c02存储花样灯_Opt.Bak 2KB
步进电机转动原理_Opt.Bak 1KB
1602液晶静态显示_Opt.Bak 1KB
步进电机按键控制_Opt.Bak 1KB
2按键加减操作_Opt.Bak 1KB
密码锁_Opt.Bak 1KB
24c02存储多个数据_Opt.Bak 1KB
单个共阳数码管静态显示_Opt.Bak 1KB
8位数码管动态扫描显示.opt.bak 1KB
步进电机转速数码管显示_Opt.Bak 1KB
外部中断1下降沿触发_Opt.Bak 1KB
8位数码管动态扫描显示_Opt.Bak 1KB
数码管递加递减带消隐_Opt.Bak 1KB
双继电器模拟洗衣机控制_Opt.Bak 1KB
8位数码管显示其中之一_Opt.Bak 1KB
1602液晶按键输入显示.opt.bak 1KB
产生多路不同频率方波_Opt.Bak 1KB
1602液晶按键输入显示_Opt.Bak 1KB
矩阵键盘反转扫描_Opt.Bak 1KB
矩阵键盘行列扫描_Opt.Bak 1KB
外部中断0电平触发_Opt.Bak 1KB
步进电机调速原理_Opt.Bak 1KB
步进电机综合控制_Opt.Bak 1KB
矩阵键盘中断扫描_Opt.Bak 1KB
直流电机调速控制_Opt.Bak 1KB
2402存储一个数据_Opt.Bak 1KB
看门狗溢出测试_Opt.Bak 1KB
按键长按短按效果_Opt.Bak 1KB
多位数按键加减_Opt.Bak 1KB
数码管循环右移2_Opt.Bak 1KB
直流电机按键控制_Opt.Bak 1KB
步进电机正反转_Opt.Bak 1KB
产生200mS方波_Opt.Bak 1KB
数码管循环左移_Opt.Bak 1KB
T1外部计数输入_Opt.Bak 1KB
继电器控制原理_Opt.Bak 1KB
数码管局部闪烁_Opt.Bak 1KB
多位数按键加减_Opt.Bak 1KB
数码管循环右移_Opt.Bak 1KB
喇叭发声原理_Opt.Bak 1KB
产生1mS方波_Opt.Bak 1KB
消防车警报_Opt.Bak 1KB
数码管闪烁_Opt.Bak 1KB
警车声音_Opt.Bak 1KB
救护车声音_Opt.Bak 1KB
喇叭滴答声_Opt.Bak 1KB
音乐播放_Opt.Bak 1KB
99秒累加_Opt.Bak 1KB
报警发声_Opt.Bak 1KB
按键喂狗_Opt.Bak 1KB
9累加_Opt.Bak 1020B
按键控制单个数码管显示_Opt.Bak 900B
单个数码管指示逻辑电平_Opt.Bak 884B
不同频率闪烁多个led灯_Opt.Bak 879B
显示变化数字_Opt.Bak 876B
IO输出_Opt.Bak 875B
闪烁led_Opt.Bak 874B
IO输出_Opt.Bak 869B
共 1154 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12
资源评论
- xiao_dian_zi2019-01-04东西挺好的,适合入门的初学者 C语言很棒,有详细注释
难匿
- 粉丝: 9
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于STM32单片机心率脉搏监测健康运动计步系统源码带视频演示.7z
- mmexport1713192608513.mp4
- 斯特林V4发动机 斯特林V4发动机
- 基于C实现的N阶数字正方形 ;N阶数字三角形;N阶数字递减三角形;乘法表
- 基于分水岭算法的图像分割的python源码(课程设计).zip
- 基于Java 实现的二进制十进制之间的相互转换
- Pytorch实现基于卷积神经网络的面部表情识别项目源码+数据集+全部资料(毕业设计).zip
- Pytorch实现基于深度学习卷积神经网络的面部表情识别项目源码+面部表情数据集(人脸面部表情识别项目).zip
- 淘金小游戏助手.apk
- 基于卷积神经网络的人脸面部表情识别项目源码+面部表情数据集+训练好的模型(人脸面部表情识别项目).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功