基于红外的数字钟和温度计的设计毕业论文.doc_第1页
基于红外的数字钟和温度计的设计毕业论文.doc_第2页
基于红外的数字钟和温度计的设计毕业论文.doc_第3页
基于红外的数字钟和温度计的设计毕业论文.doc_第4页
基于红外的数字钟和温度计的设计毕业论文.doc_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于红外的数字钟和温度计的设计摘要: 本设计利用SCT90C516RD+单片机设计了一款具有时钟、温度、闹铃并可用红外遥控器进行时间、日历、温度、闹铃设置功能的红外遥控多功能数字钟。液晶显示用12864,界面清晰美观大方。红外遥控及检测部分有(38k)小型红外21键发射模块及一体化接收头组成,操作简单方便,操作距离空旷地可达6m,时钟模块才采用DS1302为时钟源,温度模块为DS18B20温度传感器,电源模块由两节可充电池提供。关键字:SCT90C516RD+、 红外遥控、时钟日历、12864液晶.,温度DS18B20一、 总体设计方案 采用SCT90C516RD+为主控芯片、DS1302为时钟源、DS18B20为温度传感器、(38K)小型红外21键发射模块为红外发射模块、一体化红外接收头作为接收模块、显示模块利用蓝屏的12864液晶,总体方案图如图1-1所示主控芯片90c516RD+12864液晶显示红外接收模块时钟模块温度模块电源 图1-1 系统总体方案设计框图二、 硬件电路设计 1、 主控器模块以STC90C516RD+为主控芯片构成最小系统,包括STC90C516RD+/复位电路、晶振电路、电源接口及I/O口的上拉及输出接口。如图2-1所示图2-1 最小系统图2时钟和温度模块 时钟和温度模块由时钟芯片DS1302外加32.768k的晶振构成时钟源,由DS18B20温度传感器采集温度信息。 如图2-2所示。 图2-1 时钟和温度模块3.红外和闹钟模块 红外和脑子 模块由三极管驱动蜂鸣器构成,红外接收部分由一体化接收头构成。 如图2-3 所示 图2-3 温度和闹钟模块 4.显示模块 显示模块由LCD12864构成如图2-4所示 图2-4 显示模块三软件设计 N开机上电系统初始化画面1设置时间、闹钟读取温度和时间红外按键Y红外处理菜单界面红外完成初始化读取键值、响应设置菜单跳出设定设置完成软件部分:主函数:#include#include#include#includeuchar welcome_flag=0,set_flag=0,exit_flag=0,alarm_flag=0;uchar disp5;uchar row_num=1,line_num=2; /lcd上的显示坐标x,yuchar model=0;void main() lcd_init(); /初始化lcd timer0init(); /定时计数器中断初始化 Ex0_init(); /外部中断1初始化 init_ds18b20(); set_rtc(); while(1) if(model=0) start_lcd(); /按上下键选择模式 或者模式键进入相应的模块 if(model=1) xianshi_lcd(); 1.时钟部分:DS1302.H#include#include#ifndef _DS1302_H_#define _DS1302H_#define uint unsigned int#define uchar unsigned charsbit sck=P15; /时钟sbit sda=P16; /数据sbit rst1=P17; / DS1302复位extern void write_ds1302_byte(uchar adddat); /单字节写入数据或者地址extern void writeds1302(uchar add,int dat);/写地址 数据extern uchar readds1302_byte(uchar add); /读取一个字节的数据extern void set_rtc(); /设置初始时间extern void read_rtc(); /读时钟数?void rtc_display_sfm();/显示时分胿oid rtc_display_nyr();/显示年月日void rtc_display_week();/显示星期extern void show_time();/显示时间extern void judge_alarm();extern void init_set_time_sign();extern void set_over_time_show();#endifDS1302.C:#include#includeuchar disdata5;uchar code Line17=温度;extern uint temper; / 温度值void delay(uint n) while(n-);void init_ds18b20() uchar tmp; ds18b20=1; delay(8);ds18b20=0;delay(90); /750us左右ds18b20=1;delay(8);tmp=ds18b20;delay(5);void write_ds18b20(uchar dat) uchar i; for(i=0;i=1; delay(4);uchar read_ds18b20() uchar i, value;for(i=0;i=1; ds18b20=1; /释放总线 if(ds18b20=1) value|=0x80; delay(4);return value;uchar get_temper()/读取温度 uchar a,b;/用于存放温度float tt; init_ds18b20(); /初始化 write_ds18b20(0xcc); /跳过romwrite_ds18b20(0x44); /启动温度装换 /delay1ms(300);init_ds18b20();write_ds18b20(0xcc);write_ds18b20(0xbe); /读取温度a=read_ds18b20(); /低八位b=read_ds18b20();temper=b; /temp为温度值UINT 16bittemper=8; /两个字节组合到一起temper=temper|a; tt=temper*(0.0625); / temp/16 则是温度的真实值tt.7位整数,4位小数temper=tt*10+0.5; / 扩大十倍取出了第一位小数return(temper);void temper_display(uint temp)uchar i;disdata0=temp/1000+0x30;disdata1=temp%1000/100+0x30;disdata2=temp%100/10+0x30;disdata3=0x2e;disdata4=temp%10+0x30;if(disdata0=0x30) disdata0=0x20; /百位为零,不显示 if(disdata1=0x30) disdata1=0x20;/ 百位为零,而且十位也为零,不显示 poslcd(4,0);for(i=0;i4;i+)write_dat(Line17i); poslcd(4,2);for(i=1;i5;i+) write_dat(disdatai); poslcd(4,4); for(i=4;i6;i+) write_dat(Line17i); 2.显示部分:LCD12864.H#include #include#ifndef _LCD12864_H_#define _LCD12864H_#define uint unsigned int#define uchar unsigned char#define lcd P0 /lcd数据线选择P0口sbit rs=P11;sbit rw=P12;sbit en=P13;sbit psb=P24; /选择并口方式sbit rst=P22;/*函数声明*/void delay1ms(uint);void delay_ms(int);extern void lcd_init(void); /初始化lcdextern void writeinst(uchar); /写入指令extern void write_dat(uchar); /写入数据extern bit checkbf(void); /检查忙绿extern void poslcd(uchar x,uchar y); /写入位置/extern void write_inst_dat(uchar,int);/写命令数据函数extern void model_row(uchar,uchar ,uchar);#endifLCD12864.C#includevoid delay1ms(uint x) /延时x*1ms int i,j; for(i=0;ix;i+); for(j=0;j120;j+);void delay_ms(int x) int i,j; for(i=0;ix;i+); for(j=0;j60;j+);void lcd_init(void)/初始化 psb=1; rst=0; delay1ms(3); rst=1; delay1ms(5); writeinst(0x30); /设置功能 采用8位数据传输 基本指令 00110000 delay1ms(40); /延时40ms writeinst(0x0c); /显示开关控制 writeinst(0x01); /清屏 delay1ms(10); /延时10msbit checkbf() /检查忙绿函数 bit temp;rs=0;rw=1;en=1;temp=(bit)(P0&0x80);_nop_();en=0;_nop_();return(temp);void writeinst(uchar inst) /写指令函数 while(checkbf(); rs=0;rw=0;en=0;delay1ms(10);P0=inst;_nop_();_nop_();en=1;delay1ms(5);en=0;void write_dat(uchar dat) /写数据函数 while(checkbf(); rs=1; rw=0;en=0;delay1ms(10);P0=dat;en=1;delay1ms(5);en=0; void poslcd(uchar x,uchar y) /写入位置函数 uchar pos; if(x=1) pos=0x80; else if(x=2) pos=0x90;else if(x=3) pos=0x88; else if(x=4) pos=0x98; pos=pos+y; writeinst(pos); /写入显示的位置/writeinst(0x0f);/开启光标3. 红外部分:IR.H/*红外遥控定义的引脚为P34;采用外部中断1*/#ifndef _IR_H_#define _IRH_extern void timer0init(); /定时器0初始化extern void int0init(); /中断0初始化extern void irpros(); /红外处理函数extern void ir_display();/红外按键显示extern void receive();/红外读取成功extern void Ex0_init();/外部中断1extern void keyscan(); /按键扫描extern void start_lcd();/开始屏幕显示内容extern void alarm(int,int);extern void xianshi_lcd();extern void alter_time();#endifIR.C#include#includeuchar irtime; /计数0-255 uchar startflag; /检测到引导码标志位uchar irreceiveok;/红外接收完成标志位uchar irbitnum; /用于计数 总共有33位码uchar irproseok; /将32位码存放到ircodei后完成标志位uchar irdata33;/存放33位extern uchar ircode4;void timer0init() TMOD=0X02; TH0=0X00; TL0=0X00; EA=1; ET0=1; TR0=1; void Ex0_init() IT0=1; /设置为负边缘触发EA=1;EX0=1;void timer0(void) interrupt 1 irtime+; /255void Ex0() interrupt 0 if(startflag) if(irtime32) / 9ms/0.256 =35 存在载波变形检测到引导码 irbitnum=0; /把红外时间清0 准备记录下一次的时间 irdatairbitnum=irtime; irtime=0; /每记录一次都要清0 irbitnum+; if(irbitnum=33)/所有数据记录完成 irbitnum=0; irreceiveok=1; else startflag=1; irtime=0; void irpros() uchar k=1,j,i,temp; for(j=0;j4;j+) /第一位数据不需要 for(i=0;i1; if(irdatak6) temp=temp|0x80;k+; ircodej=temp; irproseok=1;void receive()/成功接收到引导码并转化到display()中if(irreceiveok) irpros(); irreceiveok=0; if(irproseok) ir_display(); irproseok=0; 4.温度部分:DS18B20.H #include #include#ifndef _DS18B20_H_#define _DS18B20H_#define uint unsigned int#define uchar unsigned charsbit ds18b20=P10;/温度引脚extern void delay(uint); /延时1usextern void init_ds18b20(); /初始化ds18b20extern void write_ds18b20(uchar);/写字节extern uchar read_ds18b20();/读取一个字节extern uchar get_temper();/得到温度extern void temper_display(uint); /温度显示处理#endif DS18B20.C#include#includeuchar disdata5;uchar code Line17=温度;extern uint temper; / 温度值void delay(uint n) while(n-);void init_ds18b20() uchar tmp; ds18b20=1; delay(8);ds18b20=0;delay(90); /750us左右ds18b20=1;delay(8);tmp=ds18b20;delay(5);void write_ds18b20(uchar dat) uchar i; for(i=0;i=1; delay(4);uchar read_ds18b20() uchar i, value;for(i=0;i=1; ds18b20=1; /释放总线 if(ds18b20=1) value|=0x80; delay(4);return value;uchar get_temper()/读取温度 uchar a,b;/用于存放温度float tt; init_ds18b20(); /初始化 write_ds18b20(0xcc); /跳过romwrite_ds18b20(0x44); /启动温度装换 /delay1ms(300);init_ds18b20();write_ds18b20(0xcc);write_ds18b20(0xbe); /读取温度a=read_ds18b20(); /低八位b=read_ds18b20();temper=b; /temp为温度值UINT 16bittemper=8; /两个字节组合到一起temper=temper|a; tt=temper*(0.0625); / temp/16 则是温度的真实值tt.7位整数,4位小数temper=tt*10+0.5; / 扩大十倍取出了第一位小数return(temper);void temper_display(uint temp)uchar i;disdata0=temp/1000+0x30;disdata1=temp%1000/100+0x30;disdata2=temp%100/10+0x30;disdata3=0x2e;disdata4=temp%10+0x30;if(disdata0=0x30) disdata0=0x20; /百位为零,不显示 if(disdata1=0x30) disdata1=0x20;/ 百位为零,而且十位也为零,不显示 poslcd(4,0);for(i=0;i4;i+)write_dat(Line17i); poslcd(4,2);for(i=1;i5;i+) write_dat(disdatai); poslcd(4,4); for(i=4;i6;i+) write_dat(Line17i); 按键操作部分:/*有关按键操作部分*/#include#include#include#includesbit bell=P35;/蜂鸣器 低电平将一直响uchar sum=0; /用于存放两个数 低位、高位uchar plus=0,sub=0;/使能键 遥控按键 加减uchar power_num=0,flag_num=0; /判断有第一次数值键按下uchar alarm_clock;uchar num=1;uchar ircode4;tab11;uint temper;uchar set_time_flag;uchar time_data1_num=6;uchar shineng_flag=1;uchar count_num=0;extern int time_data17;/存放修改设置的时间 把设置的时间赋给time_data7extern int time_data23;/设置闹钟的时间 和time_data2;进行对比 如果一样 开启闹钟 /*菜单界面*/ uchar code Line110=1.WELCOME!;uchar code Line29=2.SETTIME;uchar code Line37=3.ALARM;uchar code Line46=4.EXIT;uchar code Line53=-;uchar code Line7=欢迎光临;uchar code Line8=请设定秒分时;uchar code Line12=-;/0x2duchar code Line13=:;uchar code Line14=年月日;uchar code Line15=时分秒;uchar code Line16=星期;uchar code Line18=set_achieve!;extern uchar time_flag;extern uchar disp5;extern uchar line_num;extern uchar row_num;extern uchar welcome_flag,set_flag,exit_flag,alarm_flag;extern uchar model;extern uchar arrows_x=1;extern uchar line_y=1;extern uchar alarm_open_flag;extern uchar set_alarm_over_flag;extern uchar state_flag;extern uchar set_time_over_flag;uchar init_set_time_sign_flag=0;uchar set_alarm_sign_flag=0;void alarm(int count,int n) /count=100,n=1; int i; for(i=0;icount;i+) bell=0; delay_ms(n); bell=1; delay_ms(n); void alarm_num(uchar n)/闹钟响的次数 uchar i; for(i=0;in;i+) alarm(100,1); delay1ms(2000); alarm_flag=0; void show_time_temper() /菜单一进入显示时间 温度 uchar i;if(set_time_flag=1) set_over_time_show(); set_time_flag=0; set_rtc(); read_rtc(); judge_alarm(); /设定值与真实值进行对比 show_time(); get_temper(); temper_display(temper); if(alarm_open_flag=1) alarm_num(1); state_flag=0; alarm_open_flag=0; receive(); /红外接收处理完成 if(ircode2=0x46)/退回到主菜单 ircode2=0;welcome_flag=0;model=0; writeinst(0x01);/清屏return; for(i=0;i4;i+)/关闭红外接收 防止进入死循环 ircodei=0; void show_set_time() /菜单二 设定时间模式 if(init_set_time_sign_flag=0) init_set_time_sign(); time_data1_num=6; init_set_time_sign_flag=1; alter_time(); void set_alarm_time() /菜单三设定闹钟时间 设置的时间与时钟读取的时间进行比较 uchar i; if(set_alarm_sign_flag=0) poslcd(1,1); for(i=0;i=60)sum=0;/不正确的时候 显示00 break; while(count_num=1)/判断分是否设置正确 if(sum=60)sum=0; break; while(count_num=2) /判断时是否设置正确 if(sum=24)sum=0; break; time_data2count_num=sum; /将设置的数据存入到time_data2中与实际时间进行比较 write_dat(sum/10+0x30); /显示将要设置的时间 write_dat(sum%10+0x30); sum=0; line_y=line_y+2;/ delay1ms(100); poslcd(2,line_y); writeinst(0x0f); if(line_y=7) poslcd(3,1); for(i=0;i12;i+) write_dat(Line18i); line_y=1; writeinst(0x0c); count_num+;if(count_num=3)count_num=0; flag_num=0; /直到清除了数据才让退出 if(ircode2=0x46) ircode2=0; model=0; /回到主菜单 alarm_flag=0;/退出闹钟设置 flag_num=0; count_num=0; writeinst(0x01);/清屏 set_alarm_sign_flag=0; set_alarm_over_flag=1;/闹钟设置完成 return; void exit_show() /菜单四uchar i; poslcd(2,2);writeinst(0x0c);for(i=0;i8;i+) write_dat(Line7i); for(i=0;i2;i+) writeinst(0x0c); receive(); /红外接收处理完成 if(ircode2=0x46) ircode2=0; model=0; exit_flag=0; writeinst(0x01);/清屏 return; void xianshi_lcd() uchar i; if(welcome_flag=1) show_time_temper(); if(set_flag=1) show_set_time(); if(alarm_flag=1) set_alarm_time(); if(exit_flag=1) exit_show(); if(model=0) return; for(i=0;i4;i+)/关闭红外接收 防止进入死循环 ircodei=0; void model_row(uchar x,uchar y,uchar n) uchar i; poslcd(x,y); for(i=0;in;i+) if(n=10) tabi=Line1i; if(n=9) tabi=Line2i;if(n=7) tabi=Line3i;if(n=6) tabi=Line4i;if(n=3) tabi=Line5i; writeinst(0x0c); write_dat(tabi); writeinst(0x0c); void start() model_row(1,3,10); model_row(2,3,9); model_row(3,3,7); model_row(4,3,6); void ir_display()/将16进制数转化 uchar buf,i; disp4=ircode2; /数字键的数据码 从0到9和加减 if(disp4=0x16|disp4=0x0c|disp4=0x18 |disp4=0x5e|disp4=0x08|disp4=0x1c |disp4=0x5a|disp4=0x42|disp4=0x52 |disp4=0x4a|disp4=0x15|disp4=0x09) switch(disp4) case 0x16:buf=0;flag_num+;break; case 0x0c:buf=1;flag_num+;break; case 0x18:buf=2;flag_num+;break; case 0x5e:buf=3;flag_num+;break; case 0x08:buf=4;flag_num+;break; case 0x1c:buf=5;flag_num+;break; case 0x5a:buf=6;flag_num+;break; case 0x42:buf=7;flag_num+;break; case 0x52:buf=8;flag_num+;break; case 0x4a:buf=9;flag_num+;break; case 0x15:buf=buf+;plus+; break; case 0x09:buf=buf-;sub+; break;/加号键 disp4=0;/为接受下一次数据做准备 if(buf0) buf=0; if(plus) plus=0; sum+; if(sub) sub=0; sum-; if(sum2)flag_num=0; sum=sum*10+buf-48; for(i=0;i4;i+)/关闭红外接收 防止进入死循环 ircodei=0; void start_lcd() uchar i; model_row(arrows_x,1,3); start(); receive(); /红外接收处理完成 if(ircode2=0x44) ircode2=0;arrows_x-; if(arrows_x4) arrows_x=1; writeinst(0x01);/清屏 model_row(arrows_x,1,3); start(); if(ircode2=0x46) ircode2=0; switch(arrows_x) case 1:welcome_flag=1;break;case 2:set_flag=1; break;case 3:alarm_flag=1; b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论