温度显示闹钟功能的电子日历设计文档格式.docx
《温度显示闹钟功能的电子日历设计文档格式.docx》由会员分享,可在线阅读,更多相关《温度显示闹钟功能的电子日历设计文档格式.docx(42页珍藏版)》请在冰豆网上搜索。
最下边的一个按键是闹钟的设置按键。
硬件设计
DS1302简介:
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实不时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实不时钟可提供秒、分、时、日、礼拜、月和年,一个月小与31天时能够自动调整,且具有闰年补偿功能。
工作电压宽达~。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
各引脚的功能为:
Vcc1:
主电源;
Vcc2:
备份电源。
当Vcc2>
Vcc1+时,由Vcc2向DS1302供电,当Vcc2<
Vcc1时,由Vcc1向DS1302供电。
SCLK:
串行时钟,输入,控制数据的输入与输出;
I/O:
三线接口时的双向数据线;
CE:
输入信号,在读、写数据期间,必需为高。
该引脚有两个功能:
第一,CE开始控制字访问移位寄放器的控制逻辑;
第二CE提供结束单字节或多字节数据传输的方式。
DS1302有下列几组寄放器:
DS1302①有关日历、时刻的寄放器共有12个,其中有7个寄放器(读时81h~8Dh,写时80h~8Ch),寄存的数据格式为BCD码形式,
DS1302有关日历、时刻的寄放器
DS1302的寄放器和控制命令
日历、时刻寄放器及控制字如下表所示:
寄存器名称
7
6
5
4
3
2
1
0
RAM/CK
A4
A3
A2
A1
A0
RD/W
秒寄存器
分寄存器
小时寄存器
日寄存器
月寄存器
DS18B20简介:
DALLAS最新单线数字温度传感器DS18B20简介新的"
一线器件"
体积更小、适用电压更宽、更经济Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持"
一线总线"
接口的温度传感器。
一线总线独特而且经济的特点,利用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
测量温度范围为-55°
C~+125°
C,在-10~+85°
C范围内,精度为±
°
C。
DS1822的精度较差为±
2°
C。
现场温度直接以"
的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或进程控制、测温类消费电子产品等。
DS18B20的特性:
DS18B20能够程序设定9~12位的分辨率,精度为±
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后仍然保留。
1.DS18B20的新性能
(1)
可用数据线供电,电压范围:
~;
(2)
测温范围:
-55~+125℃,在-10~+85℃时精度为±
℃;
(3)
可编程的分辨率为9~12位,对应的可分辨温度别离为℃、℃、℃和℃;
(4)
12位分辨率时最多在750ms内把温度值转换为数字;
(5)
负压特性:
电源极性接反时,温度计不会因发烧而烧毁,但不能正常工作。
2.DS18B20的外形和内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列如下:
引脚概念:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
有4个主要的数据部件:
(1)光刻ROM中的64位序列号是出厂前被光刻好的,它能够看做是该DS18B20的地址序列码。
64位光刻ROM的排列是:
开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
光刻ROM的作用是使每一个DS18B20都各不相同,如此就可以够实现一根总线上挂接多个DS18B20的目的。
按照DS18B20的通信协议,主机控制DS18B20完成温度转换必需通过三个步骤:
每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,如此才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
。
ROM指令表:
指令
约定代码
功能
读ROM
33H
读DS1820ROM中的编码(即64位地址)
符合ROM
55H
发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。
搜索ROM
0F0H
用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。
为操作各器件作好准备。
跳过ROM
0CCH
忽略64位ROM地址,直接向DS1820发温度变换命令。
适用于单片工作。
告警搜索命令
0ECH
执行后只有温度超过设定值上限或下限的片子才做出响应。
RAM指令表:
温度变换
44H
启动DS1820进行温度转换,转换时最长为500ms(典型为200ms)。
结果存入内部9字节RAM中。
读暂存器
0BEH
内部RAM中9字节的内容
写暂存器
4EH
发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。
复制暂存器
48H
将RAM中第3、4字节的内容复制到EEPROM中。
重调EEPROM
0B8H
将EEPROM中内容恢复到RAM中的第3、4字节。
读供电方式
0B4H
读DS1820的供电模式。
寄生供电时DS1820发送“0”,外接电源供电DS1820发送“1”。
4.DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是取得的温度值的位数因分辨率不同而不同,且温度转换时的延不时刻由2s减为750ms。
24C02简介:
管脚配置
管脚描述
管脚名称功能
A0A1A2器件地址选择
SDA串行数据/地址
SCL串行时钟
WP写保护
Vcc+工作电压
Vss地
24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟这是一个输入管脚。
24C02双向串行数据/地址管脚用于器件所有数据的发送或接收SDA是一个开漏输出管脚可与其它开漏输出或集电极开路输出进行线或wire-OR
A0A1A2器件地址输入端这些输入脚用于多个器件级联时设置器件地址当这些脚悬空时默许值为0当利用24WC01或24WC02时最大可级联8个器件若是只有一个24WC02被总线寻址这三个地址输入脚A0A1A2可悬空或连接到Vss若是只有一个24WC01被总线寻址这三个地址输入脚A0A1A2必需连接到Vss,当利用24WC04时最多可连接4个器件该器件仅利用A1A2地址管脚A0管脚未用能够连接到Vss或悬空若是只有一个24WC04被总线寻址A1和A2地址管脚可悬空或连接到Vss,当利用24WC08时最多可连接2个器件且仅利用地址管脚A2A0A1管脚未用能够连接到Vss或悬空若是只有一个24WC08被总线寻址A2管脚可悬空或连接到Vss,当利用24WC16时最多只可连接1个器件所有地址管脚A0A1A2都未用管脚能够连接到Vss或悬空。
若是WP管脚连接到Vcc所有的内容都被写保护只能读当WP管脚连接到Vss或悬空允许
器件进行正常的读/写操作
I2器件寻址
主器件通过发送一个起始信号启动发送进程然后发送它所要寻址的从器件的地址8位从器件地址的高4位固定为1010见图5接下来的3位A2A1A0为器件的地址位用来概念哪个器件和器件的哪个部份被主器件访问上述8个CAT24WC01/024个CAT24WC042个
LCD1602简介:
1.字符型LCD的引脚概念
2.常常利用指令
(1)清屏指令
功能:
<
1>
清除液晶显示器,即将DDRAM的内容全数填入"
空白"
的ASCII
码20H;
2>
光标归位,即将光标撤回液晶显示屏的左上方;
3>
将地址计数器(AC)的值设为0。
(2)光标归位指令
把光标撤回到显示器的左上方;
把地址计数器(AC)的值设置为0;
维持DDRAM的内容不变。
(3)进入模式设置指令
设定每次定入1位数据后光标的移位方向,而且设定每次写入的一个
字符是不是移动。
参数设定的
情形如下所示:
位名设置
I/D0=写入新数据后光标左移1=写入新数据后光标右移
S0=写入新数据后显示屏不移动1=写入新数据后显示屏整体右
移1个字符
(4)显示开关控制指令
控制显示器开/关、光标显示/关闭和光标是不是闪烁。
参数设定的情
况如下:
D0=显示功能关1=显示功能开
C0=无光标1=有光标
B0=光标闪烁1=光标不闪烁
(5)设定显示屏或光标移动方向指令
使光标移位或使整个显示屏幕移位。
参数设定的情形如下:
S/CR/L设定情形
00光标左移1格,且AC值减1
01光标右移1格,且AC值加1
10显示器上字符全数左移一格,但光标不动
11显示器上字符全数右移一格,但光标不动
(6)功能设定指令
设定数据总线位数、显示的行数及字型。
DL0=数据总线为4位1=数据总线为8位
N0=显示1行1=显示2行
F0=5×
7点阵/每字符1=5×
10点阵/每字符
整体软件设计
2.3.1、存储单元的分派、标志位的概念
各个所用端口的肯定:
sbitDQ=P1^0;
//ds18b20温度传送数据IO口
sbitds1302_rst=P1^1;
//1302复位
sbitds1302_io=P1^2;
//数据输入输出
sbitds1302_sclk=P1^3;
//串行时钟
sbitalarm_out=P3^6;
sbitlcd1602_rs=P2^0;
//1602命令、数据选择
sbitlcd1602_rw=P2^1;
//1602写
sbitlcd1602_e=P2^2;
//1602使能
sbitset=P2^4;
//选择按键
sbitup=P2^5;
//加
sbitdown=P2^6;
//减
sbitnao=P2^7;
main()
{
lcd1602_init();
ds18b20_init();
ds1302_init();
c02_init();
while
(1)
{
if(done==1)
{
keyjpress();
}
if(done==0)
{
xianshi();
//取得并显示日历和时刻
key_set_alarm();
alarm_ring();
}
}
}
整体设计流程图如下
具体程序流程图
三,结束语
在这次课程设计中确实对单片机的理解有了专门大的提高,从纯的理论中能联系到实际中来。
专门是对I2C总线的理解有了专门大的进步,在验收中老师提到一个最困扰的问题就是地址问题,咱们的数据是怎么写进去的,写到哪里了,自己对地址的概念有了一个加倍清楚的熟悉。
另外,对数据手册的运用也有了必然的熟悉,以前所学的知识大部份只局限到讲义,可是咱们要用到一个芯片,咱们必需要明白它的特性,那么数据手册,就是一个不可缺少的资料。
再次,就是这次咱们小组三个人表现出来的合作意识超级不错,也很感想老师所提出的问题,在解决问题进程中也是提高专门快的。
四,系统原理图
五,程序清单
#include<
>
#include"
"
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetabe1[]="
20--"
;
//液晶一直显示的字符
ucharcodetabe2[]="
:
"
ucharcodetabe3[]="
Alarmset:
ucharmiao,fen,shi,nian,yue,ri,week,wendu_shi,wendu_ge,wendu_shu,variate,alarm_shi,alarm_fen,alarm_miao;
ucharflag=1,count=0,flag_up=0,flag_down=0,flag_alarm=0,alarm_on,alarm_count=0,done=0;
uintwendu;
//概念IO
sbitACC0=ACC^0;
sbitACC7=ACC^7;
//延时
voiddelay(ucharx)
uchary,z;
for(z=x;
z>
0;
z--)
for(y=110;
y>
y--);
}
voiddelay1()
_nop_();
ds18b20_delay(ucharxus)//延时xus
while(xus--);
/**********************ds18b20***********************/
voidds18b20_init()//DS18B20初始化
ucharx=0;
DQ=1;
ds18b20_delay(8);
DQ=0;
ds18b20_delay(80);
ds18b20_delay(14);
x=DQ;
ds18b20_delay(20);
voidwrite_onechar(uchardat)//写一字节
uchari;
for(i=8;
i>
i--)
DQ=0;
if(dat&
0x01==0x01)
DQ=1;
else
DQ=0;
ds18b20_delay(5);
DQ=1;
ds18b20_delay
(1);
dat>
=1;
ucharread_onechar()//读一字节
ucharvalue=0,i;
value>
DQ=0;
ds18b20_delay
(1);
DQ=1;
if(DQ==1)
value|=0x80;
else
value&
=0x7f;
ds18b20_delay(4);
returnvalue;
uintread_wendu()//DS18B20读温度
uchara=0,b=0;
uintwen=0x0000;
//初始化
write_onechar(0xcc);
//跳过读序号列号的操作
write_onechar(0x44);
//启动温度转换
ds18b20_delay(150);
//跳过读序号列号的操作
write_onechar(0xbe);
//读取温度寄存器等(共可读9个寄存器)前两个就是温度
b=read_onechar();
//读取温度值低位
a=read_onechar();
//读取温度值高位
wen=a;
wen=(wen<
8)|b;
returnwen;
/**********************ds1302***************************/
voidwrite_byte(uchardat)//写一字节
uchark;
ACC=dat;
for(k=8;
k>
k--)
ds1302_io=ACC0;
ds1302_sclk=0;
//拉低sclk
ds1302_sclk=1;
//拉高sclk
ACC>
}
ucharread_byte()
ACC7=ds1302_io;
returnACC;
voidds1302_write(ucharadd,uchardate)
ds1302_rst=0;
ds1302_sclk=0;
//在rst没拉高之前先把sclk置0
ds1302_rst=1;
write_byte(add);
write_byte(date);
ds1302_sclk=1;
uchards1302_read(ucharadd)
uchartemp;
temp=read_byte();
returntemp;
voidds1302_init()//ds1302初始化
ds1302_write(0x8e,0x00);
//写允许
ds1302_write(0x80,0x58);
ds1302_write(0x82,0x56);
ds1302_write(0x84,0x23);
ds1302_write(0x86,0x21);
ds1302_write(0x88,0x12);
ds1302_write(0x8a,0x02);
ds1302_write(0x8c,0x10);
ds1302_write(0x8e,0x80);
//写保护
/***************************lcd1602***************************/
voidlcd_write_com(ucharcom)//命令字写入lcd单元中
lcd1602_rw=0;
delay1();
lcd1602_rs=0;
//RW=1,RS=0,写LCD命令字
P0=com;
//将com中的命令字写入LCD数据口
lcd1602_e=1;
//E端时序