I2C存储器读写计数器并能断电存储.docx
《I2C存储器读写计数器并能断电存储.docx》由会员分享,可在线阅读,更多相关《I2C存储器读写计数器并能断电存储.docx(28页珍藏版)》请在冰点文库上搜索。
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
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--);
}
附录二(任务三程序)
__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,0x00},//I
{0x00,0x20,0x40,0x41,0x3F,0x01},//J
{0x00,0x7F,0x08,0x14,0x22,0x41},//K
{0x00,0x7F,0x40,0x40,0x40,0x40},//L
{0x00,0x7F,0x02,0x0C,0x02,0x7F},//M
{0x00,0x7F,0x04,0x08,0x10,0x7F},//N
{0x00,0x3E,0x41,0x41,0x41,0x3E},//O
{0x00,0x7F,0x09,0x09,0x09,