红外遥控万年历.docx
《红外遥控万年历.docx》由会员分享,可在线阅读,更多相关《红外遥控万年历.docx(48页珍藏版)》请在冰豆网上搜索。
红外遥控万年历
目录
简介…………………………………………………………………………………………2
1作品背景……..…………………………………………………………………………..3
2作品方案简述…………………………………………………………………………….3
2.1万年历时钟……………………………………………..…………………………….3
2.21602显示………………………………………………..…………………………….4
2.3红外遥控………………………………………………..……………………………5
2.4温度检测……………………………………………………………………………….6
2.5闹钟及整点报时……………………………………………………………………….6
3详细设计……………………………………………………………..………………..6
3.1硬件设计………………………………………………..………………………….…6
3.2软件设计…………………………………………………..……………………………9
4功能以及总结……………………………………..………………………………………11
附录1样品图………...……………………………..………………………………………13
附录2配件构成……………………………………………………………………………14
附录3主要程序代码……………………………………………………………………..15
简介
随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
尤其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
因此一款多功能的万年历时钟将引领我们生活的前进,并且能推进我们对单片机领域的学习与开发与增加对电子设计的兴趣。
我们所设计的多功能红外遥控万年历可以在LCD1602上显示年,月,日,以及时间的时,分,秒。
另外加入了温度检测显示以及星期几的显示,同时加入了整点报时功能。
最重要的是这款多功能红外遥控万年历可以实现按键与遥控的同步进行,可以对时间进行校准,对闹钟进行设定。
当到达闹钟时,显示屏将切换的闹钟界面,并且将用优美动听的音乐实现对用户的提醒。
改变了传统万年历只能通过按键实现操作的不便。
可以使用户用的更方便舒服。
由于时间关系和所学知识不全面,可能会有一些需要改进的地方,诚恳欢迎用户提出宝贵意见。
1作品背景
星火杯
1988年,西安电子科技大学校团委书记龙建成在学校的支持下,以团委为龙头,推出了西电首届“星火杯”竞赛。
经过20年的发展,该校校园科技活动走出了一条从无到有、从小到大、从零散自发到规范组织的蓬勃发展之路。
“星火杯”点燃了西电学生科技创新的“星星之火”,为大学生挥洒求知热情、展示聪明才智架起了广阔舞台。
从1988年到现在,“星火杯”每年举办一次,并逐步形成班级组织、个人申报、教师推荐、各个学院组织初评、学校组织优秀作品竞赛的规范化工作程序。
参加竞赛的学生人数和作品数量也逐年增加。
今年正值西电八十周年校庆,我们团队把这多功能红外遥控万年历作为生日礼物献给哺育我们的学校。
团队感触
作为对电子设计感兴趣的学生,星火杯给了我们展示的舞台。
同时电子时钟的设计又给了我们浓厚的兴趣。
在学习单片机以及C语言之后,我们可以实现软硬件结合的方略对电子产品进行纯设计。
使产品更加系统化和稳定化。
我们选用的了单片机STC89C52RC以及实现显示的1602显示屏,以及时钟芯片DS1302,温度传感器以及红外传感遥控。
通过蜂鸣器实现整点报时以及闹钟提醒。
2作品方案简述
2.1万年历时钟
采用单片机内部时钟系统。
单片机STC89S52内部设有4个定时器,可以通过对定时器设定初值,当计数器溢出后产生定时中断,可用变量对中断次数进行累计,即对时间的累计,从而实现计时的功能。
该方案中计时系统采用单片机单一的电源供电,断电后系统复位,当再次供电后,时钟将恢复原始值,需重新调整时间。
我们在硬件设计时也设计了采用DS1302方案,若系统断电,芯片可由备份电源继续供电,芯片仍可以工作,断电后无需设置时间,系统即可继续显示正常时间。
这部分的实现将是我们下一阶段实现的目标。
采用单片机内部时钟系统。
单片机STC89S52内部设有4个定时器,可以通过对定时器设定初值,当计数器溢出后产生定时中断,可用变量对中断次数进行累计,即对时间的累计,从而实现计时的功能。
该方案中计时系统采用单片机单一的电源供电,断电后系统复位,当再次供电后,时钟将恢复原始值,需重新调整时间。
我们在硬件设计时也设计了采用DS1302方案,若系统断电,芯片可由备份电源继续供电,芯片仍可以工作,断电后无需设置时间,系统即可继续显示正常时间。
这部分的实现将是我们下一阶段实现的目标。
2.2LCD1602显示
采用1602液晶作为显示器,弥补了以前数码管的所有不足,可以更清晰的显示时间以及实现多界面的转换(本例实现了对闹钟与时间界面的转换)。
LCD1602万年历显示
闹钟界面显示
2.3红外遥控
随着信息时代的走进,红外控制成为大家的喜爱。
当我们看到墙上挂着的电子时钟不准时,想对其校准时,对于取下取上就会有诸多不方便,而红外遥控的引入则使我们可以躺在床上或者沙发上对其进行遥控,并且可以进行闹钟的设定,只需要小小的一块遥控板,就可以轻轻松松的解决以前的麻烦。
而这还需要一块红外遥控传感。
红外遥控器
2.4温度检测
传感器DS18B20
DS18B20数字温度计是DALLAS公司生产的1-Wire,
即单总线器件,具有线路简单,体积小的特点。
因此用它来
组成一个测温系统,具有线路简单,在一根通信线,可以挂
很多这样的数字温度计,十分方便。
2.5闹钟及整点报时
对于广大上班一族或者是需要事情提醒者,闹钟虽然讨人厌但绝对是必须的。
不过我们这个多功能万年历闹钟将“八月桂花香”这首曲子设置为亲切的闹钟提醒。
将陪你走向约会不是约,会议不迟到,上班重要事宜等等提醒。
同时将短促并且悦耳的音乐进行整点报时,更好的提醒您完成您需要的任务。
3详细设计
3.1硬件设计
3.1.1STC89C52单片机CPU
单片机最小系统是单片机工作的基本条件,硬件电路如图3-1所示,其中
晶振选择12MHz,便于定时器时间的计算。
电容选择33uF,复位电路采用上电复方式。
图3-1单片机中央控制器
3.1.2时钟芯片DS1302与单片机的连接
图3—2
虽然本次设计没有采用到DS1320芯片。
但我们在设计硬件的时候对其进行了设计,
以方便将来通过软件的实现对我们的设计进行更好的改进。
3-1.3温度传感器的连接
DS18B20是单线温度传感器,引脚少,只有三个引脚,与单片机连接电路简单,如右图3.-3所示。
中间I/O口连单片机的P3.7口
图3-3
3.1.4红外传感器的连接
红外传感器是实现遥控功能的必须品,三个引脚,输出引脚接单片机的P32口,连接电路如图3-4所示
图3-4
3.1.5LCD1602液晶显示
本设计方案采用液晶显示屏1602作为显示器,其电路连接如图3-.4所示。
选用单片机的P0口作为液晶数据输入口,P2.5接数据读写、p2.6接RSp2.8实现对背光接口。
VO引脚接变阻器,(这里用6K的电阻实现)可以调节液晶的亮度。
用液晶作为显示器,极大地简化了硬件电路,同时增强了系统的显示能力。
图3-51602液晶连接
3.1.6蜂鸣器连接
如图3.-5所示,电路中连接一个蜂鸣器作为闹钟和整点报时实现,接单片机的P1.5端口。
其中用三极管8550来驱动蜂鸣器工作。
图3.-6蜂鸣器电路
3.2软件设计
3.2.1主程序设计
主程序系统进行过相关的初始化指令之后即从万年历主程序开始执行:
读取定时器的中断函数的相关时间信息。
根据现时日期进行星期自动跟踪更新、查询有无功能键按下。
若有,则根据按键或者红外遥控器进行对应的处理;若无,则显示,然后一直循环下去。
3.2.2主要函数设计
(1)/*年历声明调用函数*/
voidweekdecide();//week判断函数
voiddaydecide1();//日期判断函数//加的时候用
voiddaydecide2();//日期判断函数//减的时候用
voiddispd();//日期显示函数
voiddispt();//时间显示函数
voiddispt2();//闹钟显示程序二行
voiddispd2();//闹钟显示程序一行
voidclockdeal();//闹钟处理程序
voidclockhourcall();//整点报时函数
unsignedcharkeys();//按键扫描函数
voidlcd_w_cmd(unsignedcharcom);//写命令字函数
voidlcd_w_dat(unsignedchardat);//写数据函数
BOOLlcd_r_start();//读状态函数
voidint1();//LCD初始化函数
voiddelay(unsignedchart);//可控延时函数
voiddelay1();//软件实现延时函数,5个机器周期
voidmusicplay();//音乐播放
voiddelay4(unsignedcharm4);//控制频率延时
voiddelayms(unsignedchara4);//豪秒延时子程序
(2)/*温度函数声明*/
voidds1820rst();/*ds1820复位*/
unsignedchards1820rd();/*读数据*/
voidds1820wr(unsignedcharwdata);/*写数据*/
intread_temp();/*读取温度值并转换*/
voidds1820disp();//温度值计算
(3)/*红外函数声明*/
voiddelay3(unsignedcharx);//x*0.14MS
voidbeep();
(4)/*关于三个的主体函数*/
voidpromain();
4功能以及总结
4.1功能实现
可以通过两种方式实现对多功能红外遥控万年历的操作
方案一:
按键:
使用说明:
“M”健为设置键,进行对各项的切换。
“/”健为切换健,实现闹钟与万年历界面的切换。
“OK”健为确定健,数据修完成时按下该键。
“+”健一次加一。
“–”健一次减一。
1.光标移动:
使用过程中如要对时间进行调整,先按“M”键,这时光标停在显示年的最后一位上,光标闪烁的位置即为可进行调整的部分,此时若再按“M”键,光标移动;再按,光标再移动,从左到右,从上到下。
当光标到达第二行的秒的调整部分时,再按“M”键,则光标又回到初始的年的设置位置。
2.数据修改:
光标所在的位置便可进行数据修改,按“+”键加一,按“–”键减一。
3.数据确认:
当确定年,月,日以及时,分,秒修改完成以后按遥控板上的“OK”即可。
4.界面切换:
当按下遥控板上的“/”键时,万年历界面切换至闹钟界面。
调整方法与调整万年历界面的方法类似。
所不同的是,闹钟界面中需要调整设置的只是小时以及分钟,调整完成后按“OK”键闹钟界面就切换到了万年历界面,闹钟调整完成。
方案二:
遥控器
“M”健为设置键,进行对各项的切换。
“/”健为切换健,实现闹钟与万年历界面的切换。
“OK”健为确定健,数据修完成时按下该键。
“+”健一次加一。
“–”健一次减一。
功能和按键功能一样
4.2总结以及感悟
通过这次参加星火杯,我们感觉收获很大,从大二下学期确定题目到现在作品做出来,我们花费了很多的时间以及精力。
作品的功能几经修改最终得以完善。
在编写程序时,我们遇到了很多的困难。
因为我们对单片机完全只是一个初学者。
几乎是对所有的东西很陌生,不过我们一起努力学习,再加之关于52单片机的编程可以使用 C语言,而我们又恰好学过C语言。
所以学起C51编程语言比我们想象的要稍微好一些。
最终通过一个暑假的学习之后,我们对单片机的编程有了较深入的了解之后,我们开始编写需要的程序。
在编写程序的过程中,还有在焊接电路板时,我们遇到过很多的困难,有时上网找资料,有时请教别人。
在这过程中,有时搞了半天也没弄明白程序错误出在哪儿,便会很受打击。
我觉得这个时候队友的鼓励真的很重要。
我们是三个人的队伍,大家相互鼓励,于是很多这样的危机我们还是度过了。
我们花了大概3个星期的时间,最终终于将我们所要的程序在开发板上实现了,接下来我们的任务就是:
将程序从开发板实现转为在我们设计的电路板上实现。
在这个过程中,很多次都是在开发板上实现的程序焊接的电路板出现了故障,于是我们开始检查电路,然后不断改进。
就这样不断完善,一步一步向我们的目标迈进。
最后在焊接的电路板上基本实现了所想的要的各种功能。
但是一直有个问题:
就是当闹钟响的时候只要红外接收芯片插上它就不响了,然后一拔掉,它就又开始响了。
起初我们认为是硬件问题。
就一遍遍的检查电路,但是电路没错误。
那就是程序错了?
但是在开发板上都好着的,再看程序也没有错误啊。
那段时间我们找了好长时间问题就是没找到。
大家都有些遗憾,不过最终还是发现了问题:
是中断问题没有处理好,接受红外用的是单片机的外部中断,如果当进入闹钟音乐程序时关掉外部中断,然后退出时开启外部中断,这样的话,插上红外接收芯片,闹钟就会响了。
于是,问题便解决掉了。
这次的星火杯,让我们学到了很多书上学不到的知识,锻炼了我们的动手操作能力和团队合作的能力,也磨练了我们的意志。
发现问题并努力解决问题,这是我们这次参加星火杯一个很深刻的感受。
附录1样品图
多功能红外遥控万年历配置主件有:
主板一个,5V电源适配器一个,红外遥控一个。
附录2配件构成
多功能红外遥控万年历配件单
品名
型号
数量
品名
型号
数量
单片机
STC89C52
1
LCD显示屏
LCD1602
1
时钟IC
DS1302
1
晶振
32.768
1
电容
104
1
12MHZ
1
红外检测IR
1
蜂鸣器
1
遥控器
1
三极管
8550
1
温度检测
DS18B20
1
芯片插座
40PIN
1
电路板
洞洞板
1
8PIN
1
电源插孔
1
电源插头
1
电阻
10K
4
电容
10uF
1
1k
3
33p
2
排阻
10K
1
开关
触点式
6
排线
弹簧式
1
排针排母
发光二极管
1
纽扣电池
3v
1
电池座
1
电源适配器
5V
1
铜柱
4
附录3主要程序代码
#include
#include//库函数头文件,代码中引用了_nop_()函数
//定义控制信号端口
typedefbitBOOL;
//红外参数
sbitIRIN=P3^2;//红外接收器数据线
sbitBEEP=P1^5;//蜂鸣器驱动线
//温度参数
sbitDQ=P3^7;//ds18b20与单片机连接口
sbitRS=P2^6;//P2.4
sbitRW=P2^5;//P2.5
sbitE=P2^7;//P2.6
//sbitTN=P3^0;//P3.0
sbitset=P1^0;//设置键
sbitenter=P1^1;//确认键
sbitadd1=P1^2;//加1键
sbitsub1=P1^3;//减1键
bitk=0,f=0;//k为0表示运行状态,k为1表示设置状态;f为0表示第一行显示,f为1表示第二行显示
/*年历参数声明*/
unsignedcharn1=0;
unsignedcharcodemusic_tab[]={
0x18,0x30,0x1C,0x10,//格式为:
频率常数,节拍常数,频率常数,节拍常数,
0x20,0x40,0x1C,0x10,
0x18,0x10,0x20,0x10,
0x1C,0x10,0x18,0x40,
0x1C,0x20,0x20,0x20,
0x1C,0x20,0x18,0x20,
0x20,0x80,0xFF,0x20,
0x30,0x1C,0x10,0x18,
0x20,0x15,0x20,0x1C,
0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,
0x20,0x30,0x80,0xFF,
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x1C,0x20,0x20,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x80,
0x20,0x30,0x1C,0x10,
0x20,0x10,0x1C,0x10,
0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,
0x2B,0x40,0x20,0x15,
0x1F,0x05,0x20,0x10,
0x1C,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x1C,0x20,0x20,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x30,
0x20,0x30,0x1C,0x10,
0x18,0x40,0x1C,0x20,
0x20,0x20,0x26,0x40,
0x13,0x60,0x18,0x20,
0x15,0x40,0x13,0x40,
0x18,0x80,0x00
};
charsec,min,hour,week,day,month,n=-3,m=-3;
charsec1,min1,hour1,sec2,min2,hour2,m1=-3,clocknum=0;
unsignedintyear;
unsignedintnum,i,j,temp,temp1=0,temp2=0;temp3=0;
/*温度参数声明*/
unsignedchardatadisdata[5];
unsignedinttvalue=0;//温度值
unsignedchartflag;//温度正负标志
unsignedcharflagdat=0x20;
//红外参数
unsignedcharIRCOM[7];
unsignedcharredcontrol;
unsignedcharcount=0,count1=0,key;
unsignedcharlcdd[]="0123456789";
/*年历声明调用函数*/
voidweekdecide();//week判断函数
voiddaydecide1();//日期判断函数//加的时候用
voiddaydecide2();//日期判断函数//减的时候用
voiddispd();//日期显示函数
voiddispt();//时间显示函数
voiddispt2();//闹钟显示程序二行
voiddispd2();//闹钟显示程序一行
voidclockdeal();//闹钟处理程序
//voidclockmusic();//闹钟音乐函数
voidclockhourcall();//整点报时函数
unsignedcharkeys();//按键扫描函数
voidlcd_w_cmd(unsignedcharcom);//写命令字函数
voidlcd_w_dat(unsignedchardat);//写数据函数
BOOLlcd_r_start();//读状态函数
voidint1();//LCD初始化函数
voiddelay(unsignedchart);//可控延时函数
voiddelay1();//软件实现延时函数,5个机器周期
voidmusicplay();//音乐播放
voiddelay4(unsignedcharm4);//控制频率延时
voiddelayms(unsignedchara4);//豪秒延时子程序
/*温度函数声明*/
voidds1820rst();/*ds1820复位*/
unsignedchards1820rd();/*读数据*/
voidds1820wr(unsignedcharwdata);/*写数据*/
intread_temp();/*读取温度值并转换*/
voidds1820disp();//温度值计算
/*红外函数声明*/
voiddelay3(unsignedcharx);//x*0.14MS
voidbeep();
/*关于三个的主体函数*/
voidpromain();
/*主函数*/
voidmain()
{
//unsignedintz;//整点报时用
IRIN=1;//I/O口初始化
BEEP=1;
delay(250);//延时
IE=0x89;//允许总中断中断,使能INT0外部中断
TCON=0x03;//触发方式为脉冲负边沿触发
TMOD&=0xf0;
TMOD|=0x10;
TMOD=TMOD|0x01;
TH0=(65536-50000)/256;//晶振12MHz,定时时间50ms
TL0=(65536-50000)%256;
TH1=0xd8;TL1=0xef;
EA=1;//开全局中断
ET0=1;//开定时中断
TR0=1;//启动定时器
hour=1;