I2C存储器读写计数器并能断电存储Word格式.docx
- 文档编号:21673355
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:39
- 大小:107.72KB
I2C存储器读写计数器并能断电存储Word格式.docx
《I2C存储器读写计数器并能断电存储Word格式.docx》由会员分享,可在线阅读,更多相关《I2C存储器读写计数器并能断电存储Word格式.docx(39页珍藏版)》请在冰豆网上搜索。
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<
p18f452.h>
i2c.h>
#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;
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;
voidwrite_data(uchardat)//LCD1602数据输入
rs=1;
//写数据:
RS=H,RW=L,D0~D7=指令码,E=高脉冲
PORTD=dat;
//写数据到液晶
voiddisp_init()
//选择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);
//液晶第二行第二位数
write_com(0x80+0x42);
write_data(num3+0x30);
//液晶第二行第三位数
voiddelay(uintz)//z毫秒延时子程序
uintx,y;
for(x=110;
x>
0;
x--)
for(y=z;
y>
y--);
附录二(任务三程序)
pic18.h>
//调用头文件,可以去PICC18软件下去查找PIC18FXX2.H
__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,'
0x69,'
0x72,'
0x7A,'
0x6B,'
0x73,'
0x74,'
0x6C,'
0x75,'
0x7D,'
};
constunsignedcharShifted[59][2]={
A'
B'
C'
D'
E'
F'
G'
H'
I'
J'
K'
L'
M'
N'
O'
P'
Q'
R'
S'
T'
U'
V'
W'
X'
Y'
Z'
~'
_'
+'
|'
{'
}'
:
"
<
>
?
//******************************************************************/
//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 存储器 读写 计数器 断电 存储