基于AT89S52单片机的遥控器设计.docx
《基于AT89S52单片机的遥控器设计.docx》由会员分享,可在线阅读,更多相关《基于AT89S52单片机的遥控器设计.docx(26页珍藏版)》请在冰豆网上搜索。
基于AT89S52单片机的遥控器设计
单片机系统开发与应用工程报告
选题名称:
基于AT89S52单片机的遥控器设计
系(院):
计算机工程学院
专业:
计算机科学与技术(嵌入式系统软件设计)
班级:
姓名:
学号:
指导教师:
学年学期:
2009~2010学年第2学期
2010年5月30日
摘要:
单片机的广泛应用促进了设备和产品的微型化,数字化,自控化,和智能化。
单片机的应用加深了计算机于自动化控制技术的结合,从而在自动控制领域里引发了一场对传统控制技术的革命,也就是单片机正从根本上改变着传统的控制设计思想和设计方法,是以往必须由模拟或数字电路实现的控制功能,现在可以通过软件方法实现了。
红外遥控是一种被广泛使用的计算机技术,特别是在家电方面给人们带来了方便快捷的生活。
红外遥控用到许多中断技术,计算机系统中,中断可以由各种硬件设备产生,以便请求服务或报告故障报警等。
此外,中断也可以由处理器自身产生。
外部中断请求有两种信号方式有电平方式和脉冲方式。
电平方式的中断请求时低电平有效,脉冲的中断请求是脉冲的下降沿有效。
我通过在图书馆查阅有关资料,并且设计出了合适的电路图,经过仔细研究并对电路图做了多次修改,满足了课题的要求,实现了红外遥控的目的。
最后通过仿真器输入程序,手动中断,中断结束后,程序从断点处继续执行。
中断的应用具有重要的意义,它大大提高了计算机效率。
关键词:
单片机;遥控器;AT89S52;红外遥控
目录
1引言…………………………………………………………………………………4
2系统开发与应用工程实习要求及相关知识………………………………………4
2.1系统开发与应用工程实习的重要意义4
2.2预期目标4
2.3单片机相关知识5
3电路框图设计………………………………………………………………………9
3.1遥控发射单元的框图设计9
3.2遥控接收单元的框图设计10
4电路原理图总体设计……………………………………………………………12
4.1遥控发射单元原理图12
4.2遥控接收单元原理图14
4.3红外遥控程序流程图15
5总结………………………………………………………………………………18
6附录一……………………………………………………………………………19
7附录二……………………………………………………………………………22
8参考文献…………………………………………………………………………25
1引言
以单片机为核心的控制系统,因为其实时控制功能强,可靠性高,实用性强,应用范围广等优点,得到了极为广泛的应用。
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中红外遥控就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
使用红外遥控器作为控制系统的输入设备,具有成本低,灵活方便的特点。
因此了解单片机知识,掌握单片机的应用技术具有重大的意义。
它的理论性和实践性都很强,我们在理论课学习中主要学习单片机的基本构造,各部分的工作原理以及指令系统,然而,光是理论的学习是远远不够的,最重要的是把理论和实践相结合。
所以此次实习,通过设计一个基于AT89S52单片机的遥控器设计,以增进对单片机电路的感性认识,加深对理论方面的理解和巩固,了解和掌握软硬件设计过程、方法及实现,增强自己的动手和实践能力,为以后在工作和学习中,设计和实现应用系统打下良好基础。
2单片机系统开发与应用工程实习要求及相关知识
2.1单片机系统开发与应用工程实习的重要意义
单片机是计算机技术、大规模集成电路技术和控制技术的综合产物。
现在,凡是电脑控制的设备和产品,必有单片机嵌入其中,它早已成为人类生活中不可或缺的助手。
单片机体积小、重量轻,具有很强的灵活性而且价格便宜。
单片机主要用于工业环境的实时控制、智能化仪器仪表、家用电器等各个不同的领域。
不同领域对单片机的使用有不同的要求,诸如环境温度、湿度、电源波动、电磁场扰动、噪声、冲击、红外遥控等等,都直接影响着单片机应用系统的总体设计。
无论哪一种单片机应用系统,在总体设计中都必须把工作环境的制约当作重要因素对待。
单片机应用系统设计不但要熟练掌握单片机程序语言和编程技术,而且还要具备扎实的单片机硬件方面的理论和实践知识。
2.2预期目标
实现基于AT89S52单片机遥控系统,此系统分为遥控发射系统和遥控接收系统单元,用发射单元控制接收单元的8个二极管的显示,用二进制数的形式显示发射单元的按下键盘的数码值的大小。
2.3单片机相关知识
(1)本次实习所使用的单片机是Atmel公司的AT89S52芯片,此芯片的功能强大,可以实现我们日常生活中接触到的大部分家电的自动控制功能和实现对家电的远程遥控。
AT89S52的引脚图如2-1所示:
图2-1AT89S52引脚图
(2)系统复位
通过某种方式,使单片机内各寄存器的值变为初始状态的操作称为复位。
51单片机在时钟电路工作以后,在RST/VPD端持续给出2个机器周期的高电平就可以完成复位操作(一般复位正脉冲宽度大于10ms)。
复位分为上电复位和外部按键复位两种方式。
51单片机复位后,程序计数器PC和特殊功能寄存器复位的状态如表2-1所示。
复位不影响片内RAM存放的内容,而ALE在复位期间将输出高电平。
由表2-1可以看出:
(1)(PC)=0000H表示复位后程序的入口地址为0000H;
(2)(PSW)=00H,其中RS1(PSW.4)=0,RS0(PSW.3)=0,表示复位后单片机选择工作寄存器0组;
(3)(SP)=07H表示复位后堆栈在片内RAM的08H单元处建立;
(4)P0口~P3口锁存器为全1状态,,说明复位后这些并行接口可以直接作输入口,无须向端口写1。
表2-1
(3)时钟电路
单片机的时钟电路由振荡电路和分频电路组成,其振荡电路由反相器以及并联外接的石英晶体和电容组成,用于产生振荡脉冲。
分频电路用于把振荡脉冲分频,以的到所需要的时钟信号。
振荡电路如图2-2所示:
图2-2振荡电路
其输入端为引脚XTAL1,输出端为引脚XTAL2。
通过这两个引脚在芯片外并接石英晶体振荡器和两只电容,石英晶体为一感性原件,与电容构成振荡回路,为片内放大器提供正反馈和振荡的相移条件,从而构成一个稳定的自激振荡器。
振荡器的频率主要取决于晶体的振荡频率,一般晶体可在1.2~12MHz之间任选,电容C1、C2可在5~30pF之间选择,电容的大小对振荡频率有微小的影响,可起频率微调作用。
振荡脉冲经二分频后作为系统的时钟信号,时钟信号经过三分频产生ALE信号,
ALE信号用于控制把P0口的低8位地址送入锁存器锁起来,以实现低地址和数据的分时传送,ALE还可作为外部时钟或外部脉冲使用。
时钟信号经六分频得到机器周期信号。
(4)中断系统
A中断的概念
当CPU与外设交换信息时,由于外设的速度比较慢,若用查询的方式,则CPU就要浪费很多时间去等待外设。
这样就存在一个快速的CPU与慢速的外设之间的矛盾。
为了解决这个问题,就发展了中断的概念。
CPU正在处理某一程序时,发生了另一突发事件请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作,转到需要处理的中断源的服务程序的入口(中断响应),一般在入口处执行一跳转指令转去处理中断事件(中断服务);待CPU将中断事件处理完毕后,再回到原来程序被中断的地方继续处理执行程序(中断返回),这一处理过程称为中断。
51单片机的中断系统提供5个中断源:
外部中断0和外部中断1,定时/计数器(T0)和(T1)的溢出中断,串行接口的接收和发送中断。
本程序中只用到了外部中断1。
B中断控制
1中断允许寄存器IE(A8H)
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器(IE)控制的。
IE各位的定义如表2-2所示:
表2-2
位地址
0AFH
0AEH
0ADH
0ACH
0ABH
0AAH
0A9H
0A8H
位符号
EA
/
/
ES
ET1
EX1
ET0
EX0
EA——中断允许总控制位
EA=0中断总禁止,禁止所有中断
EA=1中断总允许,总允许后中断的禁止或允许由各中断源的中断允许控制位设置。
EX0和EX1——外部中断允许控制位
EX0(EX1)=0禁止外部中断
EX0(EX1)=1允许外部中断
ET0和ET1——定时器/计数器中断允许控制位
ET0(ET1)=0禁止定时器/计数器中断
ET0(ET1)=1允许定时器/计数器中断
ES——串行中断允许控制位
ES=0禁止串行中断
ES=1允许串行中断
2中断优先级控制寄存器(IP)
各中断的优先级通过中断优先级控制寄存器IP来设定,其未定义及位地址如表2-3所示:
表2-3
位地址
0BFH
0BEH
0BDH
0BCH
0BBH
0BAH
0B9H
0B8H
位符号
/
/
/
PS
PT1
PX1
PT0
PX0
PX0——外部中断0优先级设定位;
PT0——定时中断0优先级设定位;
PX1——外部中断1优先级设定位;
PT1——定时中断1优先级设定位;
PS——串行中断优先级设定位。
3定时器控制寄存器(TCON)
该寄存器用于保存外部中断请求以及定时器的计数溢出。
进行字节操作时,寄存器地址为88H。
按位操作时,各位的地址为88H~8FH。
寄存器的内容及位地址表示如表2-4所示:
表2-4
位地址
8FH
8EH
8DH
8CH
8BH
8AH
89H
88H
位符号
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
IE0和IE1——外中断请求标志位。
当CPU采样到INT0(或INT1)端出现有效中断请求时,IE0(IE1)位由硬件置“1”。
当中断响应完成转向中断服务程序时,由硬件把IE0(或IE1)清零。
TR0和TR1——定时器运行控制位:
TR0(TR1)=0定时器/计数器不工作
TR0(TR1)=1定时器/计数器开始工作
TF0和TF1——计数溢出标志位。
当计数器产生计数溢出时,相应的溢出标志位
硬件置“1”。
并自动产生定时中断请求。
3电路框图设计
3.1遥控发射单元的框图设计
遥控发射单元由单片机最小系统和按键电路、红外发射器电路等组成,遥控发射单元框图如图3-1所示。
电源电路
图3-1红外遥控单元发射框图
3.2遥控接收单元的框图设计
遥控接收单元由单片机最小系统和红外接收器、控制对象电路等组成,遥控接收单元框图如图3-2所示。
晶振电路
图3-2红外遥控接收单元框图
4电路原理图及程序流程图
4.1遥控发射单元原理图
(1)遥控发射单元由单片机最小系统和按键电路、红外发射器电路等组成,遥控发射单元原理图如图4-1所示。
图4-1遥控发射单元原理图
(2)遥控发射单元PCB图如图4-2所示,
图4-2遥控发射单元PCB图
4.2遥控接收单元原理图
(1)遥控接收单元由单片机最小系统和红外接收器、控制对象电路等组成,遥控接收单元原理图如图4-3所示。
图4-3遥控接收单元原理图
(2)遥控接收单元PCB图如图4-4所示,
图4-4遥控接收单元PCB图
4.3红外遥控程序流程图
(1)程序开始是对单片机进行初始化设置,循环扫描判断是否有键按下,如果有键按下就发射相应的红外信号,遥控发射程序流程图如图4-5所示,
图4-5遥控发射程序流程图
(2)程序开始是对单片机进行初始化设置,循环扫描判断是否有键按下,如果有键按下就发射相应的红外信号,遥控发射程序流程图如图4-6所示,
图4-6遥控发射程序流程图
总结
通过这两周的单片机系统开发与应用工程实习加深了对单片机的了解,对单片机这门课的认识进一步加深了。
从一个刚入门的学习者,渐渐的爱上了这门技术,虽然说对于单片机技术方面的知识还有很多要学习和提高,但是在这两周中我还是感受到这门课程的魅力所在。
我学会了Protel电路板的绘图操作,并通过上网搜索资料,查阅课本及课外书籍,对电路各部分组成器件的工作原理加深了解。
学会了仿真环境KEIL使用方法,动手设计电路组成器件以及器件之间的布局与连接,焊电路板,加强了动手能力。
这是一个磨练意志的过程。
从课题的选择开始,到硬件和软件系统的设计,这其中经历了很多困难,但是更重要的是在这个过程中我得到了很大的锻炼。
一方面通过C52单片机等一些器件的设计让我学习和掌握了单片机技术的基础知识和技术要点,也使以前学的很多知识都得到了运用;另一方面在用Protel99SE软件画电路图,这个过程中让我掌握了计算机辅助的设计技术。
当然,这是一个需要不断的尝试,不断的校核,不断的修改,最后完成一个合理的设计的过程。
需要的是细心和耐心。
在很大程度上培养了我拼搏的工作精神。
使我受益匪浅,更加明确了自己专业的方向。
这次时间是短暂的,但这我想我们学到的应该不仅仅是专业技术等表面上的东西,更深一层的是对人生的感悟,对未来的想法,年轻人的桀骜不驯在此时已经不在有意义,取而代之的是理性的思维。
我们应该具备什么样的能力,我们适合什么样的人生,我们应该在怎样的岗位上实现自己的人生价值。
实习是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程,通过课程设计我们能够比较系统的了解理论知识,把理论和实践相结合,并且用到生活当中。
在做设计的过程中总会出现各种问题,在这种情况下我们都会努力寻求最佳路径解决问题,无形间提高了我们的动手,动脑能力,并且同学之间还能相互探讨问题,研究解决方案,增进大家的团队意识。
实习是短暂的,影响却是长远的。
通过实习让我体会了团队合作的益处,在团队中一起发现问题、讨论问题,共同进步、共同提高。
硬件实习主要是我们理论知识的延伸,它的目的主要是要在设计中发现问题,并且自己要能找到解决问题的方案,形成一种独立的意识。
我们还能从设计中检验我们所学的理论知识到底有多少,巩固我们已经学会的,不断学习我们所遗漏的新知识,把所学的知识学的更加扎实。
附录1:
/****************************************************************
*文件名:
红外遥控发射端2
****************************************************************/
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcount=0;
/****************************************************************
*名称:
delay_1ms()
*功能:
延时子程序,延时时间为1ms*x
*输入:
x(延时一毫秒的个数)
****************************************************************/
voiddelay_1ms(uinti)
{
ucharx,j;
for(j=0;j
for(x=0;x<=148;x++);
}
/***************************************************************
*名称:
time0_init()
*功能:
定时器的初始化,定时10ms
****************************************************************/
voidtime0_init()
{
TMOD=0x01;
IE=0x82;
TH0=0x15;
TL0=0xA0;
}
/****************************************************************
*名称:
time0_int()
*功能:
定时器中断
****************************************************************/
voidtime0_int()interrupt1
{
count++;
TH0=0x15;
TL0=0xA0;
}
/****************************************************************
*名称:
keyscan()
*功能:
实现按键的读取
****************************************************************/
ucharkeyscan(void)
{
uchari,j,temp,buffer[4]={0xef,0xdf,0xbf,0x7f};
for(j=0;j<4;j++)
{
P1=buffer[j];
/*以下三个_nop_();作用为让P1口的状态稳定*/
_nop_();
_nop_();
_nop_();
temp=0x01;
for(i=0;i<4;i++)
{
if(!
(P1&temp))
{
return(i+j*4);//返回取得的按键值
}
temp<<=1;
}
}
}
/****************************************************************
*名称:
main()
*功能:
主函数
****************************************************************/
voidmain(void)
{
ucharkey_value;//读出的键值
while
(1)
{
P1=0xf0;
if(P1!
=0xf0)
{
delay_1ms(15);//按键消抖
if(P1!
=0xf0)
{
key_value=keyscan()+1;//key_value是键码加1
}
time0_init();
TR0=1;
while
(1)
{
uchari;
for(;count<10;)//发射首部
P2=0x00;
count=0;
for(;count<10;)
P2=0xff;
count=0;
for(i=0;i{
for(;count<5;)
P2=0x00;
count=0;
for(;count<5;)
P2=0xff;
count=0;
}
TR0=0;
break;
}
}
}
}
附录2:
/****************************************************************
*文件名:
红外遥控接收端2
****************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcount=0;//定时器计时
uchartime=0;//脉冲计时
ucharnum=0;//键码值
ucharreceiv=0;//为0时不是接收状态,为1时为正在接收数据状态
voidreceive();
/****************************************************************
*名称:
delay()
*功能:
延时,延时时间为
****************************************************************/
voiddelay(uintk)
{
uinti,j;
for(i=0;ifor(j=0;j<1800;j++)
;
}
/****************************************************************
*外部中断0初始化inter0_init()
****************************************************************/
voidinter0_init()
{
EA=1;
PX0=0;
IT0=1;//下降沿触发
}
/****************************************************************
*外部中断0inter0_int()
****************************************************************/
voidinter0_int()interrupt0
{
TR0=1;
while(P3^1==0);
TR0=0;
time=5*count;
if(time>450&&time<750)
{
receiv=1;//等于1开始接收数据
EX0=0;
num=0;
}
count=0;
}
/****************************************************************
*定时器0初始化
****************************************************************/