I2C存储器读写计数器并能断电存储.docx
- 文档编号:8537128
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:39
- 大小:107.72KB
I2C存储器读写计数器并能断电存储.docx
《I2C存储器读写计数器并能断电存储.docx》由会员分享,可在线阅读,更多相关《I2C存储器读写计数器并能断电存储.docx(39页珍藏版)》请在冰豆网上搜索。
I2C存储器读写计数器并能断电存储
任务二:
I2C存储器读写(计数器,并能断电存储)
实验原理
1)I2C总线概述
I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需
的包括总线裁决和高低速器件同步功能的高性能串行总线。
2)I2C信号线
I2C总线只有两根双向信号线。
一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。
当总线空闲时,两根线均为高电平。
连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
图3I2C总线框图
3)I2C总线的数据传送
a)数据位的有效性规定
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
图4SDA与SCL的工作时序图
b)起始和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
c)I2C总线的数据传送速率
I2C总线的通信速率受主机控制,能快能慢,最高速率限制为100Kb/s
d)I2C总线的数据传送格式
主机向从机发送数据
从机向主机发送数据
图5I2C总线的数据传送格式
S:
起始位SA:
从机地址,7位
W/:
写标志位,1位R:
读标志位,1位
A:
应答位,1位A/:
非应答位,1位
D:
数据,8位P:
停止位
阴影:
主机产生的信号无阴影:
从机产生的信号
4)总线的寻址
I2C总线协议有明确的规定:
采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。
寻址字节的位定义
D7~D1位组成从机的地址。
D0位是数据传送方向位,为“0”时表示主机
向从机写数据,为“1”时表示主机由从机读数据。
主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/位将自己确定为发送器或接收器。
从机的地址由固定部分和可编程部分组成。
在一个系统中可能希望接入多
个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。
如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有
8个同样的器件接入到该I2C总线系统中。
任务三:
要求:
设计一个简单系统,每10S进行温度采集(结合电路与程序,分析指标),在液晶屏上显示当前温度和前一状态的温度,并将结果存入存储器,具备可将温度的存储结果与PC机通讯和数据发送功能,可以使用键盘设定温度高低限制值,达到限制值时报警。
一、实验设计思路
二、实验内容
1、蜂鸣器工作原理
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
原理图见图:
如图所示,蜂鸣器的负极经电阻R3接地,蜂鸣器的正极接到三极管的集电极C,三极管的基级B经过限流电阻R2后由单片机的P1.3引脚控制,当P1.3输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;当P1.3输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制P1.3脚的电平来使蜂鸣器发出声音和关闭。
程序中改变单片机P1.3引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
另外,改变P1.3输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。
2、SP2键盘控制
数据格式
1个起始位
总是逻辑0
8个数据位
(LSB)低位在前
1个奇偶校验位
奇校验
1个停止位
总是逻辑1
1个应答位
仅用在主机对设备的通讯中
数据发送时序
一个键盘发送值的例子:
通码和断码是以什么样的序列发送到你的计算机从而使得字符G出现在你的字处理软件里的呢?
因为这是一个大写字母,需要发生这样的事件次序:
按下Shift键-按下G键-释放G键-释放Shift键。
与这些时间相关的扫描码如下:
Shift键的通码12h,G键的通码34h,G键的断码F0h34h,Shift键的断码F0h12h。
因此发送到你的计算机的数据应该是:
12h34hF0h34hF0h12h
3、DS18B20温度传感器
DS18B20工作原理及应用:
DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。
其一个工作周期可分为两个部分,即温度检测和数据处理。
在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。
18B20共有三种形态的存储器资源,它们分别是:
ROM只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。
数据在出产时设置不由用户更改。
DS18B20共64位ROM。
RAM数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。
第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。
在上电复位时其值将被刷新。
第5个字节则是用户第3个EEPROM的镜像。
第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。
第9个字节为前8个字节的CRC码。
EEPROM非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,
DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
4、LCD1602液晶显示
读写操作时序如图所示
图三:
读操作时序
图四:
写操作时序
附录一:
(任务二程序)
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineePORTBbits.RB3//液晶屏e端接RB3
#definerwPORTBbits.RB4//液晶屏rw端接RB4
#definersPORTBbits.RB5//液晶屏rs端接RB5
voiddisp(ucharnum1,ucharnum2,ucharnum3);
voiddelay(uintz);
voiddisp_init(void);//液晶屏初始化
voidwrite_com(ucharcom);//对液晶屏写指令
voidwrite_data(uchardat);//写数据
voidmain(void)
{
unsignedintlednum=0,x,tt=0;//lednum显示的数据,x24c02读到的数据,tt时间累加
unsignedinta1=0,a2=0,a3=0;//显示位数个十百
disp_init();//1602的初始化
OpenI2C(MASTER,SLEW_ON);//I2C的初始化
SSPADD=9;//频率为400KHZ
T0CONbits.TMR0ON=0;//关闭TIMER0
T0CONbits.T08BIT=0;//配置为16位计数模式
T0CONbits.T0CS=0;//选择内部时钟源即定时模式
TMR0H=(65536-10000)/256;//定时5us
TMR0L=(65536-10000)%256;
INTCONbits.TMR0IF=0;//清TIMER0溢出中断标志位
T0CONbits.TMR0ON=1;//使能TIMER0
while
(1)
{
x=EERandomRead(0xA0,0x03);//读数据,0XA0为器件地址0X03为存储地址
if(INTCONbits.TMR0IF==1)//TIMER0溢出中断标志位为1
{
INTCONbits.TMR0IF=0;//清TIMER0溢出中断标志位
TMR0H=(65536-10000)/256;//5us*10000=50ms
TMR0L=(65536-10000)%256;
tt++;
if(tt==20)//1s
{
tt=0;
x++;
if(x==256)
{
x=0;
}
EEByteWrite(0xA0,0x03,x);//写数据
EEAckPolling(0xA0);//应答
}
}
lednum=EERandomRead(0xA0,0x03);//防止断电遗失
a1=lednum/100;//百位上的数字
a2=lednum%100/10;//十位上的数字
a3=lednum%10;//个位上的数字
disp(a1,a2,a3);//显示
}
}
voidwrite_com(ucharcom)//LED1602控制字输入
{
TRISB=0b000000000;//TRISB=0b00010000;
TRISD=0;
e=0;
rw=0;
rs=0;//写指令:
RS=L,RW=L,D0~D7=指令码,E=高脉冲
PORTD=com;//写指令到液晶
delay(5);
e=1;
delay(5);
e=0;
}
voidwrite_data(uchardat)//LCD1602数据输入
{
TRISD=0;
e=0;
rw=0;
rs=1;//写数据:
RS=H,RW=L,D0~D7=指令码,E=高脉冲
PORTD=dat;//写数据到液晶
delay(5);
e=1;
delay(5);
e=0;
}
voiddisp_init()
{
TRISD=0;//选择D端口为液晶屏数据的输入口
write_com(0x38);//液晶开显示
write_com(0x0c);//显示光标,光标闪烁
write_com(0x06);//读或写一个字符后地址指针加一,光标加一
write_com(0x01);//显示清屏:
1、数据指针清零;2、所有显示清零
write_com(0x80);//第一行首位
}
voiddisp(ucharnum1,ucharnum2,ucharnum3)
{
write_com(0x80+0x40);
write_data(num1+0x30);//液晶第二行第一位数
delay
(1);
write_com(0x80+0x41);
write_data(num2+0x30);//液晶第二行第二位数
delay
(1);
write_com(0x80+0x42);
write_data(num3+0x30);//液晶第二行第三位数
delay
(1);
}
voiddelay(uintz)//z毫秒延时子程序
{
uintx,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
附录二(任务三程序)
#include
__CONFIG(1,XT);//晶振为外部4M
__CONFIG(2,WDTDIS);//看门狗关闭
__CONFIG(4,LVPDIS);//禁止低电压编程
#defineRSPINRB5//DataorInstrumentSelectLCD1602
#defineRWPINRB4//WriteorRead
#defineEPINRB3//6800modeEnablesingle
unsignedchartemp1=0,temp1_1=0;//采集到的温度高8位上一次的
unsignedchartemp2=0,temp2_2=0;//采集到的温度低8位
unsignedinta,b,c=0;
#definebeepRC2//定义蜂鸣器接口
/****************************************/
#definesdaRC4//AT24C02
#definesclRC3
biteepromdi;
biteepromdo;
unsignedcharaddressbuf;
unsignedcharbuf_24C02;
/****************************************/
bitclrbit;//USART
unsignedcharrecebuf;
/****************************************/
//转换后的温度值小数点部分查表
constunsignedchartablexiao[16]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};
/****************************************************************************************/
#defineKey_DataRB1
#defineKey_CLKRB0
unsignedcharIntNum;//中断次数计数
unsignedcharKeyV;//键值
unsignedcharKey_UP=0,Shift=0;//Key_UP是键松开标识,Shift是Shift键按下标识
unsignedcharkeybuf;
unsignedchardisbuf;//84
unsignedcharshu1=0,shu2=0,tem1=0,tem2=0,tem3=0;//温度上限
bitbf;//标识是否有字符被收到
bitdisbit;
//0x66为backspace键
//0x5a为Enter键
constunsignedcharUnShifted[59][2]={
0x1C,'a',
0x32,'b',
0x21,'c',
0x23,'d',
0x24,'e',
0x2B,'f',
0x34,'g',
0x33,'h',
0x43,'i',
0x3B,'j',
0x42,'k',
0x4B,'l',
0x3A,'m',
0x31,'n',
0x44,'o',
0x4D,'p',
0x15,'q',
0x2D,'r',
0x1B,'s',
0x2C,'t',
0x3C,'u',
0x2A,'v',
0x1D,'w',
0x22,'x',
0x35,'y',
0x1A,'z',
0x45,'0',
0x16,'1',
0x1E,'2',
0x26,'3',
0x25,'4',
0x2E,'5',
0x36,'6',
0x3D,'7',
0x3E,'8',
0x46,'9',
0x0E,'`',
0x4E,'-',
0x55,'=',
0x5D,'\\',
0x29,'',
0x54,'[',
0x5B,']',
0x4C,';',
0x52,'\'',
0x41,',',
0x49,'.',
0x4A,'/',
0x71,'.',
0x70,'0',
0x69,'1',
0x72,'2',
0x7A,'3',
0x6B,'4',
0x73,'5',
0x74,'6',
0x6C,'7',
0x75,'8',
0x7D,'9',
};
constunsignedcharShifted[59][2]={
0x1C,'A',
0x32,'B',
0x21,'C',
0x23,'D',
0x24,'E',
0x2B,'F',
0x34,'G',
0x33,'H',
0x43,'I',
0x3B,'J',
0x42,'K',
0x4B,'L',
0x3A,'M',
0x31,'N',
0x44,'O',
0x4D,'P',
0x15,'Q',
0x2D,'R',
0x1B,'S',
0x2C,'T',
0x3C,'U',
0x2A,'V',
0x1D,'W',
0x22,'X',
0x35,'Y',
0x1A,'Z',
0x45,'0',
0x16,'1',
0x1E,'2',
0x26,'3',
0x25,'4',
0x2E,'5',
0x36,'6',
0x3D,'7',
0x3E,'8',
0x46,'9',
0x0E,'~',
0x4E,'_',
0x55,'+',
0x5D,'|',
0x29,'',
0x54,'{',
0x5B,'}',
0x4C,':
',
0x52,'"',
0x41,'<',
0x49,'>',
0x4A,'?
',
0x71,'.',
0x70,'0',
0x69,'1',
0x72,'2',
0x7A,'3',
0x6B,'4',
0x73,'5',
0x74,'6',
0x6C,'7',
0x75,'8',
0x7D,'9',
};
//******************************************************************/
//6x8.h文件:
/*-----------------------------------------------
6x8font
1pixelspaceatleftandbottom
index=ASCII-32
-----------------------------------------------*/
constunsignedcharfont6x8[][6]=
{
{0x00,0x00,0x00,0x00,0x00,0x00},//sp
{0x00,0x00,0x00,0x2f,0x00,0x00},//!
{0x00,0x00,0x07,0x00,0x07,0x00},//"
{0x00,0x14,0x7f,0x14,0x7f,0x14},//#
{0x00,0x24,0x2a,0x7f,0x2a,0x12},//$
{0x00,0x62,0x64,0x08,0x13,0x23},//%5
{0x00,0x36,0x49,0x55,0x22,0x50},//&
{0x00,0x00,0x05,0x03,0x00,0x00},//'
{0x00,0x00,0x1c,0x22,0x41,0x00},//(
{0x00,0x00,0x41,0x22,0x1c,0x00},//)
{0x00,0x14,0x08,0x3E,0x08,0x14},//*
{0x00,0x08,0x08,0x3E,0x08,0x08},//+
{0x00,0x00,0x00,0xA0,0x60,0x00},//,
{0x00,0x08,0x08,0x08,0x08,0x08},//-
{0x00,0x00,0x60,0x60,0x00,0x00},//.
{0x00,0x20,0x10,0x08,0x04,0x02},///
{0x00,0x3E,0x51,0x49,0x45,0x3E},//016
{0x00,0x00,0x42,0x7F,0x40,0x00},//1
{0x00,0x42,0x61,0x51,0x49,0x46},//2
{0x00,0x21,0x41,0x45,0x4B,0x31},//3
{0x00,0x18,0x14,0x12,0x7F,0x10},//4
{0x00,0x27,0x45,0x45,0x45,0x39},//5
{0x00,0x3C,0x4A,0x49,0x49,0x30},//6
{0x00,0x01,0x71,0x09,0x05,0x03},//7
{0x00,0x36,0x49,0x49,0x49,0x36},//8
{0x00,0x06,0x49,0x49,0x29,0x1E},//9
{0x00,0x00,0x36,0x36,0x00,0x00},//:
26
{0x00,0x00,0x56,0x36,0x00,0x00},//;
{0x00,0x08,0x14,0x22,0x41,0x00},//<
{0x00,0x14,0x14,0x14,0x14,0x14},//=
{0x00,0x00,0x41,0x22,0x14,0x08},//>
{0x00,0x02,0x01,0x51,0x09,0x06},//?
{0x00,0x32,0x49,0x59,0x51,0x3E},//@
{0x00,0x7C,0x12,0x11,0x12,0x7C},//A33
{0x00,0x7F,0x49,0x49,0x49,0x36},//B
{0x00,0x3E,0x41,0x41,0x41,0x22},//C
{0x00,0x7F,0x41,0x41,0x22,0x1C},//D
{0x00,0x7F,0x49,0x49,0x49,0x41},//E
{0x00,0x7F,0x09,0x09,0x09,0x01},//F
{0x00,0x3E,0x41,0x49,0x49,0x7A},//G
{0x00,0x7F,0x08,0x08,0x08,0x7F},//H
{0x00,0x00,0x41,0x7F,0x41,0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- I2C 存储器 读写 计数器 断电 存储
![提示](https://static.bdocx.com/images/bang_tan.gif)