徐海学院单片机课程设计13级.docx
《徐海学院单片机课程设计13级.docx》由会员分享,可在线阅读,更多相关《徐海学院单片机课程设计13级.docx(31页珍藏版)》请在冰豆网上搜索。
![徐海学院单片机课程设计13级.docx](https://file1.bdocx.com/fileroot1/2023-6/11/b40049c4-b147-46cf-a702-e1bd44866d77/b40049c4-b147-46cf-a702-e1bd44866d771.gif)
徐海学院单片机课程设计13级
中国矿业大学徐海学院
单片机课程设计
姓名:
王金成学号:
22131128
同组人:
汤岚学号:
22130257
班级:
电气13-3班
实验日期:
2015年12月
教师签字
单片机课程设计之实现数字钟定时
姓名:
王金成班级:
电气13-3学号:
22131128
【摘要】近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用越来越普及了,并且由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,使单片机在电子和一些自动化行业中应用也越来越广泛了,利用单片机实现的电子钟具有编程灵活,并便于功能的扩展,很精确。
数字钟的组成模块主要由一个AT89C51单片机模块、用于显示时间的数码管显示模块其他组成部分。
红外线遥控是目前使用很广泛的一种通信和遥控技术。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
【关键词】单片机红外控制KEIL软件C语言编程
1.系统设计方案
系统设计原理框图
2程序设计
2.程序设计
定时程序设计
单片机的定时功能也是通过计数器的计数来实现的,此时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲,也就是每经过1个机器周期的时间,计数器加1。
如果MCS-51采用的12MHz晶体,则计数频率为1MHz,即每过1us的时间计数器加1。
这样可以根据计数值计算出定时时间,也可以根据定时时间的要求计算出计数器的初值。
MCS-51单片机的定时器/计数器具有4种工作方式,其控制字均在相应的特殊功能寄存器中,通过对特殊功能寄存器的编程,可以方便的选择定时器/计数器两种工作模式和4种工作方式。
定时器/计数器工作在方式0时,为13位的计数器,由TLX(X=0、1)的低5位和THX的高8位所构成。
TLX低5位溢出则向THX进位,THX计数溢出则置位TCON中的溢出标志位TFX.
当定时器/计数器工作于方式1,为16位的计数器。
本设计师单片机多功能定时器,所以MCS-51内部的定时器/计数器被选定为定时器工作模式,计数输入信号是内部时钟脉冲,每个机器周期产生一个脉冲使计数器增1。
实时时钟实现的基本方法
时钟的最小计时单位是秒,但使用定时器的方式1,最大的定时时间也只能达到131ms。
我们可把定时器的定时时间定为50ms。
这样,计数溢出20次即可得到时钟的最小计时单位:
秒。
而计数20次可以用软件实现。
秒计时是采用中断方式进行溢出次数的累积,计满20次,即得到秒计时。
从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。
要求每满1秒,则“秒”单元中的内容加1;“秒”单元满60,则“分”单元中的内容加1;“分”单元满60,则“时”单元中的内容加1;“时”单元满24,则将时、分、秒的内容全部清零。
实时时钟程序设计步骤
(1)选择工作方式,计算初值;
(2)采用中断方式进行溢出次数累计;
(3)从秒——分——时的计时是通过累加和数值比较实现的;
(4)时钟显示缓冲区:
时钟时间在方位数码管上进行显示,为此在内部
RAM中要设置显示缓冲区,共6个地址单元。
显示缓冲区从左到右依次存放时、分、秒数值;
(5)主程序:
主要进行定时器/计数器的初始化编程,然后反复调用显示
子程序的方法等待中断的到来。
(6)中断服务程序:
进行计时操作
(7)加1子程序:
用于完成对时、分、秒的加操作,中断服务程序在秒、分、时加1时共有三种条调用加1子程序,包括三项内容:
合字、加1并进行十进制调整、分字。
3红外遥控
红外接收与发射
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
图1a《红外发射原理图》
图1b《红外接受原理图》
红外解码
红外遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
4.程序执行方案
子函数顺序结构方案
将各个模块放入main()函数顺序执行
优点:
结构简单,代码量少,层次清晰。
缺点:
实时性差,用户体验较差,
中断加顺序方案
关键模块采用中断结构,如显示模块,以保证其实时性,对于实时性要求不高的模块采用循环结构嵌套顺序结构。
优点:
实时性好,运行稳定,抗干扰性能好
缺点:
结构复杂
5.设计工作及设计报告评分表
项目
内容
测试结果
走时
准确性
程序走时准确,误差小于1s/分钟
正确性
秒、分、时进位正确。
优良程度
走时完全符合设计要求。
闹铃
完成程度
能够闹铃,能够设置闹铃时间和整点报时。
正确性
能够准时闹铃和整点报时
电路图及
设计文件
完整性
所要求功能完全实现。
规范程度
电路符合设计规范,软件符合软件设计要求。
抗干扰设计
显示抗干扰
显示正常,未发现受按键干扰和其他干扰。
按键抗干扰
按键及时、有效、正确响应。
系统抗干扰
系统稳定运行4小时未见异常。
6.系统调试
系统调试包括硬件调试和软件调试两部分,介绍一下我在这两方面遇到一些问题,以及如何解决的。
硬件部分
硬件焊接为单片机板,因为是以前焊好的,所以不存在问题。
软件部分
开始对单片机C语言很陌生,看程序很困难,自己编写不出程序。
通过老师的讲解,和以前学过的C语言的知识,与单片机C语言基本相同,有些区别,把其中的区别搞懂了,能够编写简单的程序了。
通过程序调试各个部分的功能,完成各功能模块,把程序下载到单片机中,最终实现报时的功能。
7.结论与展望
结论
单片机多功能定时系统理论上能很好的达到了学校教学要求,发挥了单片机在智能化方面的应用。
该系统的设计很好的满足当前学校教学的需要,是一个理想的智能化的设计。
它具有一个走时精确的实时钟,可以任意设置时间,可以控制时间表的转换,时钟的显示功能等。
可以通过按键操作和数字显示。
该系统规模小,但是功能较多,操作简单,造价低,应用非常广泛。
该系统的设计为向家庭数字化方向发展又前进了一步。
同时又扩大了单片机的应用领域。
单片机的发展趋势
自单片机出现至今,单片机技术已走过了几十年的发展路程。
纵观几十年来单片机发展历程可以看出,单片机技术的发展以微处理器(MPU)技术及超大规模集成电路技术的发展为先导,拉动广泛的应用领域,表现出比微处理器更具个性的发展趋势:
(1)采用先进结构以实现高性能
在过去的一段时间内,单片机的指令运行速度一直在10MIPS以下,这对于应用在工业控制领域内的单片机来说是足够了,但当单片机被应用在通讯及DSP领域作为高速运算、编码或解码时,就会出现因指令运行速度不够而限制单片机应用的情形,因此提高单片机指令运行速度已经成为迫切需要解决的问题。
(2)进一步降低功耗
基于80C51的飞利浦低功率、低系统成本微控制器51LPC系列是业界推动单片机向低功耗方向发展的主导单片机系列之一。
51LPC系列单片机采用以下三种方法降低功耗:
使系统进入空闲模式,在空闲模式下,只有外围器件在工作,任意的复位及中断均可结束空闲模式;
使系统进入低功耗模式,在低功耗模式下,振荡器停止工作,是功耗降到最小;
使系统进入低电压EPROM操作;EPROM包含了模拟电路,当Vcc高于4V时,可通过软件使这些模拟电路掉电以降低功耗,在上电情况下可使系统退出该模式。
(3)采用FlashMemory
随着半导体工艺技术的不断进步,MPU的Flash版本逐渐替代了原有的OTP版本。
FlashMPU具有以下优点:
与多次可编程的窗口式EPROM相比,FlashMPU的成本要低得多;在系统编程能力以及产品生产方面提供了灵活性,因为FlashMPU可在编程后面再次以新代码重新编程;可减少已编程器件的报废和库存;有助于生产厂商缩短设计周期,使终端用户产品和、更具有竞争力。
(4)集成更多功能及兼容性
目前单片机的另一个发展趋势是在芯片上集成更多的功能。
如模拟功能,包括模拟比较器、A/D和D/A转换器等。
具体表现在:
兼容性作为设计的第一考虑;额外的新的特点是透明的;使用同一种编程器;OTP使器件快速提升及标准化成为可能。
(5)强抗干扰能力
不断加强抗干扰能力是单片机进一步发展的必然趋势。
STMicroelectronics公司推出的ST62系列单片机在这方面是佼佼者,其优良的抗干扰能力使得许多大公司将其应用在系统中的关键部件上。
许多单片机开发商也正朝着这个方向努力。
(6)朝系列化、全面化方向发展
各大单片机开发商在增加产品功能的同时效力于形成产品的系列化=全面化,以满足各种控制领域的要求,这也是单片机发展的趋势之一。
日本TOSHBA公司开发了从4位到64位的多系列单片机,日立公司也有从4.位到32位的单片机,目前还没有哪个厂家生产的单片机比东芝公司的种类多。
随着单片机性能的不断提高,不断的克服和弥补自身的不足。
在各种控制领域,单片机将拥有更加广阔的使用天地。
在很长的一段时间内,它将一直是工程设计人员的首选控制芯片之一。
8.自我总结
这次课程设计,我学到了许多,无论是硬件焊接还是软件编程,都有了进一步的提高。
初步掌握了单片机C语言的编程。
对红外控制,单片机显示等有了更深入的了解。
这些离不开老师的指导和同学的互相帮助。
我还有许多不足,这些还远远不够,在今后我还要不断的练习。
参考文献
[1]张专成赵怀勋.单片机测控系统中的监视定时器.武警技术学院.Mar
1997
[2]张景元.基于单片机的多用途定时器的设计与实现.电子工程师2000年第
8期
[3]李洪涛.一种单片机控制的定时打铃器.电子世界.1990年第2期
[4]何业军李超.基于单片机控制的高精度定时打铃器的设计.电子技
术.2001年第7期
[5]关宗安仲丛久.基于单片机实现的多路定时控制器的设计.沈阳航空工业
学院学报.2004年6月.第21卷第3期
[6]ATMEL.MicrocontrollerDatabook.2002
[7]Mark1.Montrose.PRINTEDCircuitBoardDesignTechniquesforEMC
compliance.IEEPressseries.2000
[8]范立南.单片微机接口与控制技术.沈阳:
辽宁大学出版社.1996
[9]张友德.单片微型机原理、应用与实践.上海:
复旦大学出版社.1992
[10]李华.MCS-51系列单片机实用接口技术,北京:
北京航空航天大学出版
社.1993
[11]何希庆,高伟.MCS-51单片机原理、实验、实例[M].山东:
山东大学出版
社.1989
[12]张毅刚,彭喜源,潭晓昀.MCS-51单片机应用设计[M].哈尔滨:
哈尔滨工
业大学出版社.1997
[13]胡汉才.单片机原理及接口技术[M],北京:
清华大学出版社.1996
[14]余永权,单片机与家用电器智能化设计[M].北京:
电子工业出版社.1995
[15]房小翠,王金凤.单片微型计算机与机电接口技术[M].北京国防工业出版
社.2002
[16]皮红梅,李英顺.单片机开发中的定时方法.沈阳石油化工高等专科学校学
报.2002年12月
[17]Maxim公司.NewreleasesDataBook1996
附录一:
单片机板电路原理图
附录二:
单片机数字钟实物照
附录三:
程序
//#include
#include
#include"delay.h"
#include"decode.h"
sbitspeaker=P2^5;
unsignedinti;
unsignedintk;
unsignedchartimer0h,timer0l,time;
//世上只有妈妈好数据表
codeunsignedcharsszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
//音阶频率表高八位
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
//音阶频率表低八位
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
#defineucharunsignedchar
#defineuintunsignedint
#defineFont_codeP0//字符码写地址
#definereg_codeP2//字位码写地址
unsignedintn;
unsignedcharmin;
unsignedcharhour;
unsignedcharsecond;
unsignedcharminx;
unsignedcharhourx;
bitflag;
codeunsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0-9
unsignedcharsDis_Shiwei=0xc0;//定义十位
unsignedcharsDis_Gewei=0xc0;//定义个位
unsignedcharmDis_Shiwei=0xc0;//定义十位
unsignedcharmDis_Gewei=0xc0;//定义个位
unsignedcharhDis_Shiwei=0xc0;//定义十位
unsignedcharhDis_Gewei=0xc0;//定义个位
codeucharShow_Tab[]={
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xC6,/*C*/
0xA1,/*d*/
0x86,/*E*/
0x8E/*F*/
};
codeucharS_Tab[8]={
0xfe,
0xfd,
0xfb,
0xf7,
0xef,
0xdf,
0xbf,
0x7f
};
unsignedcharDisplay_Buffer[8];//显示缓冲区
ucharbit_con;//字位码扫描计数器
externucharkey_value;//键值
externbitkey_flg;//按钮按下标志
externbitcycle_flg;//循环标志
voiddelay(unsignedintcnt)
{
while(--cnt);
}
voiddelayx(unsignedchart)
{
unsignedchart1;
unsignedlongt2;
for(t1=0;t1{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR2=0;
}
voidsong()
{
RCAP2H=timer0h;
RCAP2L=timer0l;
TR2=1;
delayx(time);
}
voidmain()
{
delay_nus
(1);
delay_nms
(1);
reg_code=0xff;//关闭显示
for(bit_con=0;bit_con<8;bit_con++)Display_Buffer[bit_con]=Show_Tab[0];
bit_con=0;
Timer0init();//定时器0初始化
EX0init();//外部中断初始化
while
(1)
{
P0=sDis_Shiwei;//显示十位
P2=0xbf;
delay(300);//短暂延时
P0=sDis_Gewei;//显示个位
P2=0x7f;
delay(300);
P0=mDis_Shiwei;//显示十位
P2=0xef;
delay(300);//短暂延时
P0=mDis_Gewei;//显示个位
P2=0xdf;
delay(300);
if(key_value==0x09)//如果读到K1为0
{key_value=0;
min++;
if(min==60)
min=0;
}
P0=hDis_Shiwei;//显示十位
P2=0xfb;
delay(300);//短暂延时
P0=hDis_Gewei;//显示个位
P2=0xf7;
delay(300);
if(key_value==0x43)//如果读到K1为0
{key_value=0;
hour++;
if(hour==24)
hour=0;
}
if(key_value==0x40)//如果读到K1为0
{key_value=0;
hour--;
if(hour==0)
hour=23;
}
sDis_Shiwei=~tab[second/10];//十位显示值处理
sDis_Gewei=~tab[second%10];//个位显示处理
mDis_Shiwei=~tab[min/10];//十位显示值处理
mDis_Gewei=~tab[min%10];//个位显示处理
hDis_Shiwei=~tab[hour/10];//十位显示值处理
hDis_Gewei=~tab[hour%10];//个位显示处理
if(key_value==0x45)//如果读到K1为0
{key_value=0;
minx=min;
hourx=hour;
flag=0;
}
if(key_value==0x15)//如果读到K1为0
{key_value=0;
min--;
if(min==0)
min=59;
}
if((min==(minx+1))&&(hour==hourx))
{flag=0;}
if((min==minx)&&(hour==hourx)&&flag==0)
{
while
(1)
{
TR2=1;//启动定时器
ET2=1;//打开定时器2中断
i=0;
while(i<100)//音乐数组长度,唱完从头再来
{
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
RCAP2H=timer0h;
RCAP2L=timer0l;
time=sszymmh[i+2];
i=i+3;
song();
if(key_value==0x47)//如果读到K1为0
{key_value=0;flag=1;
TR2=0;//启动定时器
ET2=0;//打开定时器2中断
break;
}
}
break;
}
}
}
}
timer1()interrupt3
{
unsignedcharcount;
TH1=0xd8;//重新赋值
TL1=0xf0;
count++;
if(count==100)
{
count=0;
second++;//秒加1
if(second==60)
{
second=0;
min=min+1;
}
if(min==60)
{min=0;
hour=hour+1;
}
if(hour==24)
{
hour=0;
second=0;
min=0;
}
}
}
voidt2int()interrupt5
{
TR2=0;
TF2=0;
speaker=!
speaker;
TR2=1;
}
Decode.c
/******************************************************************/
/*红外遥控解码*/
/*CPU&XTAL:
89c52@12Mhz*/
/*支持的红外编码方案:
NEC6121*/
/*编码格式:
引导信号(或连发信号)+地址码+地址码+控制码+控制码反码*/
/******************************************************************/
#include"decode.h"
//#include"display.c"
#include