版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、重庆邮电大学单片机课程设计报告指导学院:通信与信息学院专业:信息工程红外遥控电子钟摘要:本系统设计一个基于单片机红外遥控电子钟,数据处理用MCS-51系列采用89C51单片机作为中央控制器。数据采集部分采用一体化红外接收头直接转换为二进制代码,并通过总线传送数据和发送控制指令,控制8位数码管、蜂鸣器、LED灯等工作操作。红外接头数据发送和单片机接口只需要一个I/O口,本设计用的P3.2口。此红外遥控电子钟,由51学习板、7段数码管、蜂鸣器控制电路、红外接收头转换电路、遥控器等组成,其实现功能是:数码管显示电子钟小时、分钟、秒、红外遥控设置时间、闹钟定时蜂鸣、关键字:89C51; HS0038b
2、红外接收头;有源蜂鸣器; 一:方案设计与论证方案1:采用DS12C88芯片。该芯片是一种新型的时钟日历芯片,它能自动产生年月日分秒等时间信息,而且它自带有锂电池,对于一天内时间记录绰绰有余,有牛刀小用之感,且价格比较昂贵,本设计的来说可以暂时不考虑。方案2:采用定时器0控制1s。采用自编程序,通过定时器中断控制实现秒自加,分自加,时自加。因软件控制简单,方便可靠。方案3:方案论证:22二:电路设计系统硬件的结构框图数码管显示单片机红外遥控器电源蜂鸣器红外通信接口蜂鸣器闹钟电路设计红外接收头电路单元电路设计外电路三:程序设计1、 电子钟子程序单元设计void T1_time() interrup
3、t 3 /定时器T1 3为T1定时器的序号TH1=(65536-50000)/256;TL1=(65536-50000)%256;num1+; if(num1=20) /加一为50ms 20次为1秒num1=0;if(time_sign=0&&clock_sign=0)/若进入时间设置,则时间停止走 time_sign控制时间走停 clock_sign控制闹钟是否进入设置num2+;numt2=num2; /numt2的意思是当进入时间设置时,秒的时间num2立刻赋给numt2,numt2立刻停住并显示elsenumt2+;if(clock_sign=1&&ti
4、me_sign=0)/进入闹钟设置时时间不停if(numt2=60) /秒循环进位判断numt2=0;numt3+;if(numt3=60) /分循环进位判断numt3=0;numt4+;if(numt4=24) /时循环进位判断numt4=0;if(num2=60) /秒循环进位判断num2=0;num3+;sh=num2/10;sl=num2%10;elsesh=num2/10;sl=num2%10; if(num3=60) /分循环进位判断num3=0;num4+;mh=num3/10;ml=num3%10;elsemh=num3/10;ml=num3%10; if(num4=24) /
5、时循环进位判断num4=0;hh=num4/10;hl=num4%10;elsehh=num4/10;hl=num4%10; 2、红外解码子程序单元设计基本原理分析如下:如接收到头码是4.5ms低电平+4.5ms高电平,我们分析 第一个下降沿到第二个下降沿的宽度是 9ms,我们判断这个头码可以给定一个范围,只要数据在这个范围内则认为头码是正确的,检测头码正确后接着检测剩下的32位数值。判断是否头码,范围越大识别率越高,现在的值可以识别 4.5ms+4.5ms 也能识别 9ms+4.5ms,同时抗扰能力越差,可以自行调整测试。如果检测到是头码发出,则把存储区的值irdata 的地址复位到首地址
6、即 irdata0,同时把头码的长度数据 irtime存储到 irdata0,然后进接着就是剩下的32位数据了,长度自动存储到数组,数组共33个字节,头码占一个。k=1; for(i=0;i<4;i+) /处理4个字节 for(j=1;j<=8;j+) /处理1个字节8位 4 J7 v7 y! V% a# i
7、160; cord=irdatak;" u p4 A+ L% l% x if(cord>7)/大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差( R$ r& s3 y / V9 u5 ) ?8 E) Q' n; W3 o, m% v,
8、 value=value|0x80;1 z6 G7 K* s# w! ?; w0 o7 U else ' u7 f! x3 q9 Q5 6 a value=value;) _- q/ L4 C 0 E# S( w: O; d( q- t; b
9、160; if(j<8) # 5 _2 C9 u8 E& b: J( J( _% E value=value>>1;$ O5 f! k) r: Y$ t: c' ?0 k+; 通过存储的时间长度判断数值时0还是1,k=1,表示从irdata1 开
10、始处理,因为第一位是头码,不是数据,所以跳过去从第二位处理。程序中这一句就是根据时间长度判断,假设使用12M晶振 定时器的单位数值时1us,使用8位定时器自动重装,将得到每个定时周期0.256ms的时长, 1.68/0.256=6.59,也就是 定时器0计数次数。 这里取接近整数值 7。 四:测试方法与测试结果1、测试仪器:51学习板、PC机、遥控器2、测试方法:将51学习板通过USB接口接入PC机,在PC机上运行keil uvision4编译好程序,将参数调节好,运行。运行同时,用遥控器对准红外接头遥控。3、测试结果:数码管能成功显示电子钟小时、分钟、秒,格式为小时-分钟-秒;通过摁键遥控器
11、,红外遥控设置时间,可分别使小时分钟秒加减;设置闹钟,设定预定闹铃时间,到达闹铃时间后,蜂鸣器可以报警发声五:讨论在上学期对单片机的学习和这次通过接近四个星期的设计,深感综合能力有了很大的提高,制作电路板的经验更为熟练,编程水平也更上了一个新台阶,特别是深入了解了单片机原理的应用,感觉它的功能非常的强大。本系统虽然能实现题目的要求,但是还有待以进一步完善的地方,仍能增加其更强大功能,比如,如何把闹钟设成一首音乐,但是由于时间和本身知识水平的有限。其它的更多功能将会在未来的时间内进一步完成。程序代码/*- 说明: 1)时间显示格式为#-#-#。mode进入闹钟设置时间(时间在定时时间到 定时时间
12、加一之内闹钟均会响),静音键保存闹钟时间设置。 2)power键进入时间设置,静音键保存并退出。上下左右键控制时分秒的切 换和时分秒的加减。 3)定时器T0用于量化计数,定时器T0来计算电平长度和外部输入用于控制红外接收。定时器T1(控制1秒)用来正常走时间 -*/#include <REGX51.H>/*- 定义变量-*/#define uint unsigned int#define uchar unsigned charsbit dula=P10; /段选标志 sbit wela=P11;/位选标志sbit beep=P17;/闹铃标志bit irpro_ok,irok; /
13、红外处理标志 irok是红外接收ok irpro_ok是红外码值量化好并且存储好 uchar IRcord4;/存储处理后的红外码值数组uchar irdata33;/存储处理前的33位红外码值数组uchar irtime; /红外处理用全局变量 irtime用于量化电平长度 uchar num1,num2,num3,num4,hh,hl,mh,ml,sh,sl,numd,digit; /时分秒用定义全局变量/用于控制1s,秒,分,时数字按键中间变量,数字值uchar numt1,numt2,numt3,numt4,num5=12,num6=12,num7=12,num8=12;/ 存储原时间
14、num1-4的中间变量 num5-8为闹钟时间uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /0 1 2 3 4 5 6 7 8 9uint key1,key2,key3,key4,key5,key6;/按键定义uint set_sign/*控制时分秒那位闪*/,clock_sign;/*控制闹钟是否进入设置*/ /进入设置时间标志uint sound_sign/*控制闹钟响*/,time_sign/*控制时间走停*/, digit_sign=0;/*数值键设置标志*/ /*- 函数声明-*/void E
15、X0init(); /外部初始化函数void TIM0init(); /T0初始化函数void TIM1init();/T1初始化 函数 void clock(); /闹钟函数void Hwscan();/红外扫描函数void Ir_work(); /红外键值散转处理函数void Ircdeal();/红外码值处理函数void key_work(); /遥控方向键值操作处理函数void digit_work();/遥控数字键值操作处理函数void clock_set();/遥控设置闹钟时间函数void delayms(uint);/延迟函数void display(uchar,uchar,uc
16、har,uchar,uchar,uchar);/显示函数/*- 主函数-*/void main()TIM1init(); /定时器1初始化TIM0init(); /定时器0初始化EX0init(); /初始化外部中断while(1)Hwscan();/红外扫描display(hh,hl,mh,ml,sh,sl);key_work();clock();/*- 定时器0初始化 (定时器用来计算电平的长度)-*/void TIM0init(void) /定时器0初始化 TMOD=0x12; /定时器0工作方式2(8位自动重装),TH0是重装值,TL0是初值 TH0=0x00; /重载值 TL0=0x
17、00; /初始化值 ET0=1; /开中断 TR0=1; /*- 定时器T1初始化-*/void TIM1init()TMOD =0x12; /定时器1工作方式1(16位定时器)TH1 =(65536-50000)/256;TL1 =(65536-50000)%256;ET1 =1;TR1 =1;/*- 外部中断0初始化-*/void EX0init(void) IT0 = 1; /指定外部中断0下降沿触发,INT0 (P3.2) EX0 = 1; /使能外部中断 EA = 1; /开总中断/*- 红外扫描函数-*/void Hwscan()if(irok) /如果接收好了进行红外处理 Irc
18、deal(); /把接收到的33位irdata的电平长度进行量化判断是高电平还是低电平,并把它赋值到IRcord0,1,2,3数组中irok=0;if(irpro_ok) /如果处理好后进行工作处理,如按对应的按键后显示对应的数据等Ir_work(); /红外键值散转处理,根据遥控器输入的数据码IRdata2来进行下一步处理,比如我按了闹钟设置键,则程序进入闹钟设置函数/*- 定时器T1中断处理函数,即时间满了后自动进入本中断函数进行相应的操作,以此循环往复-*/void T1_time() interrupt 3 /定时器T1 3为T1定时器的序号TH1=(65536-50000)/256;
19、TL1=(65536-50000)%256;num1+; if(num1=20) /加一为50ms 20次为1秒num1=0;if(time_sign=0&&clock_sign=0)/若进入时间设置,则时间停止走 time_sign控制时间走停 clock_sign控制闹钟是否进入设置num2+;numt2=num2; /numt2的意思是当进入时间设置时,秒的时间num2立刻赋给numt2,numt2立刻停住并显示elsenumt2+;if(clock_sign=1&&time_sign=0)/进入闹钟设置时时间不停if(numt2=60) /秒循环进位判断
20、numt2=0;numt3+;if(numt3=60) /分循环进位判断numt3=0;numt4+;if(numt4=24) /时循环进位判断numt4=0;if(num2=60) /秒循环进位判断num2=0;num3+;sh=num2/10;sl=num2%10;elsesh=num2/10;sl=num2%10; if(num3=60) /分循环进位判断num3=0;num4+;mh=num3/10;ml=num3%10;elsemh=num3/10;ml=num3%10; if(num4=24) /时循环进位判断num4=0;hh=num4/10;hl=num4%10;elsehh=
21、num4/10;hl=num4%10; /*- 定时器0中断处理-*/void T0_time() interrupt 1 using 1 irtime+; /用于计数2个下降沿之间的时间/*- 外部中断0中断处理-*/void EX0_() interrupt 0 /外部中断0服务函数static uchar i; /接收红外信号处理static bit startflag; /是否开始处理标志位if(startflag) if(irtime<63&&irtime>=33) /头码是9ms+4.5ms和4.5ms+4.5ms均可 i=0; /头码存储到0位 ird
22、atai=irtime;/存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i+; /跳到下一位 if(i=33) /表示存储32为完毕 irok=1; i=0; else /装回初值irtime=0; /有其他干扰使为0startflag=1;/*- 红外码值处理-*/void Ircdeal(void) /红外码值处理函数(四个字节一共32位)和量化差不多 uchar i, j, k;uchar cord,value;k=1;for(i=0;i<4;i+) /控制4个字节共32位for(j=1;j<=8;j+) /控制1个字节8位cord=irdatak;if
23、(cord>7) /大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80; /位运算符或| >>记毁作前者表示或,后者表右移的意思,针对二进制位进行操作if(j<8)value>>=1;k+;IRcordi=value;value=0; irpro_ok=1;/处理完毕标志位置1/*- 数码管显示函数-*/void display(uchar hh,uchar hl,uchar mh,uchar ml,uchar sh,uchar sl)if(set_sign=1)if(num1<=8) /时显示并闪烁dul
24、a=1; P0=tablehh;dula=0;P0=0xff; wela=1;P0=0x7f; /0111 1111wela=0;delayms(1);dula=1;P0=tablehl;dula=0;P0=0xff;wela=1;P0=0xbf; /1011 1111wela=0;delayms(1);elsedula=1; /时显示不闪烁P0=tablehh;dula=0;P0=0xff; wela=1;P0=0x7f; /0111 1111wela=0;delayms(1);dula=1;P0=tablehl;dula=0;P0=0xff;wela=1;P0=0xbf; /1011 11
25、11wela=0;delayms(1);if(set_sign=2)if(num1<=8) /分显示并闪烁dula=1; P0=tablemh;dula=0;P0=0xff;wela=1;P0=0xef; /1110 1111wela=0;delayms(1);dula=1;P0=tableml;dula=0;P0=0xff;wela=1;P0=0xf7; /1111 0111wela=0;delayms(1);else/分显示不闪烁dula=1; P0=tablemh;dula=0;P0=0xff;wela=1;P0=0xef; /1110 1111wela=0;delayms(1);
26、dula=1;P0=tableml;dula=0;P0=0xff;wela=1;P0=0xf7; /1111 0111wela=0;delayms(1);if(set_sign=3)if(num1<=8)/秒显示并闪烁dula=1; P0=tablesh;dula=0;P0=0xff;wela=1;P0=0xfd; /1111 1101wela=0; delayms(1);dula=1;P0=tablesl;dula=0;P0=0xff;wela=1;P0=0xfe; /1111 1110wela=0;delayms(1);else/秒显示不闪烁dula=1; P0=tablesh;du
27、la=0;P0=0xff;wela=1;P0=0xfd; /1111 1101wela=0; delayms(1);dula=1;P0=tablesl;dula=0;P0=0xff;wela=1;P0=0xfe; /1111 1110wela=0;delayms(1);dula=1; / 时分和分秒之间的横杠,一直显示P0=0x40; /0100 0000dula=0;P0=0xff;wela=1;P0=0xdb; /1101 1011wela=0;delayms(1);/*- 遥控方向键值操作处理函数-*/ void key_work() /*numb2控制秒 key5和key6 /numb
28、3控制分 key3和key4 /numb4控制时 key1和key2if(key1=1) /设置时按键加num4=num4+1;if(num4=24)num4=0;if(key2=1)/设置时按键减if(num4=-1)num4=23;else num4-;if(key3=1)/设置分按键加if(num3=60)num3=0;else num3+;if(key4=1)/设置分按键减if(num3=-1)num3=59;else num3-;if(key5=1) /按键控制秒if(num2=59)num2=0;elsenum2+;if(key6=1)if(num2=-1)num2=59;else
29、num2-;key1=key2=key3=key4=key5=key6=0; /重置低电平 /*- 延迟函数-*/void delayms(uint xms)uint i,j;for(i=xms;i>0;i-)for(j=124;j>0;j-);/*- 闹钟函数-*/void clock() if(num2=num6&&num3=num7&&num4=num8&&clock_sign=0&&set_sign=0)sound_sign=1;if(num2=num6&&num3=num7+1&&am
30、p;num4=num8)sound_sign=0; if(num1<=12&&sound_sign=1)beep=0;P1_2=0;elsebeep=1;P1_2=1;/*- 闹钟定时函数-*/void clock_set()if(clock_sign=1)/进入闹钟时间的设置numt1=num1,numt2=num2,numt3=num3,numt4=num4;/时间存储num1=num5,num2=num6,num3=num7,num4=num8;/闹钟时间读取(默认时间为12-12-12)if(clock_sign=0) /闹钟时间的保存num5=num1,num6
31、=num2,num7=num3,num8=num4; num1=numt1,num2=numt2,num3=numt3,num4=numt4; /原时间读取/*- 红外键值散转处理函数-*/void Ir_work(void)switch(IRcord3) case 0x4b:if(clock_sign=0) /静音键设置保存并退出 time_sign=0;set_sign=0; if(clock_sign=1) /闹钟保存 clock_sign=0; clock_set(); time_sign=0; set_sign=0; sound_sign=0;break; case 0x2b:if(
32、clock_sign=0)/mode进入闹钟时间设置 clock_sign=1; /进入闹钟定时后不进行保存clock_set();set_sign=1;/控制时分秒那位开始闪time_sign=0; /控制时间走停的标志位置低,sound_sign=0;break; case 0x4f:if(set_sign=1)key1=1; /vol+键数值加 时加key1 if(set_sign=2)key3=1; /分加key3 if(set_sign=3)key5=1;break;/秒加key5case 0x5f:if(set_sign=1)key2=1; /vol-键设置减/时减key2 if(
33、set_sign=2)key4=1; /分减key4 if(set_sign=3)key6=1;break; /秒减key6case 0x63:if(clock_sign=1) /power进入时间设置 clock_sign=0;/闹钟保存 clock_set(); set_sign=1; /控制时分秒那位开始闪 time_sign=1; /控制时间走停的标志位置 sound_sign=0;break; case 0x43:if(clock_sign=1|time_sign=1) /右键右移动 set_sign+;digit_sign=0; if(set_sign=4)set_sign=1;
34、break; case 0x53:if(clock_sign=1|time_sign=1) /左键左移动 set_sign-;digit_sign=0; if(set_sign=0)set_sign=3; break;case 0x03:digit=0;digit_work();break; /数字0键case 0x07:digit=1;digit_work();break; /数字1键case 0x0b:digit=2;digit_work();break; /数字2键case 0x0f:digit=3;digit_work();break; /数字3键case 0x13:digit=4;digit_work();break; /数字4键case 0x17:digit=5;digit_work();break; /数字5键case 0x1b:digit=6;digit_work();break; /数字6键case 0x1f:digit=7;digit_work();b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度离婚案件中涉及2024年购置车辆分割协议书3篇
- 2024年远程医疗服务系统搭建合同
- 2025年度装载机租赁与售后服务合同3篇
- 2025年度智慧城市安防监控系统工程合同书3篇
- 2024年物业绿化维护合同(适用于物业绿化养护)3篇
- 求一个数比另一个数多几(少几)教学反思
- 高级财务会计历年核算题(分类)
- 人民日报青春摘抄(高中作文素材)
- 华南农业大学珠江学院《数据库技术基础(ACCESS)》2023-2024学年第一学期期末试卷
- 培黎职业学院《Java语言程序设计A》2023-2024学年第一学期期末试卷
- 体外膜肺氧合(ECMO)并发症及护理
- 垫江县中医院2018年11月份临床技能中心教学设备招标项目招标文件
- 排放源统计(环统)年报填报指南
- 反射疗法师理论考试复习题及答案
- 房地产销售主管岗位招聘笔试题及解答(某大型国企)2025年
- 心电图并发症预防及处理
- 重庆市七中学2023-2024学年数学八上期末统考模拟试题【含解析】
- 检验科lis系统需求
- 中东及非洲空气制水机行业现状及发展机遇分析2024-2030
- DL∕T 1631-2016 并网风电场继电保护配置及整定技术规范
- 煤矿立井井筒及硐室设计规范
评论
0/150
提交评论