参考单片机基于at89s52单片机的遥控器设计毕业论文内容摘要:

设计 16 遥控接收单元的 电路 图设计 遥控接收单元由单片 机最小系统和红外接收器、控制对象电路等组成,遥控接收单元框图如图 44 所示。 图 44 红外 遥控接收单元框图 接收控制器 由 一个 AT89S52芯片作为控制中心 ,与接收电路和各自的控制电路共同构成。 其中接收电路使用一体化红外接收头 HS0038, HS0038工作频率为 38 kHz,能对收到遥控信号进行放大、检波、整形、解调 ,得到 TTL 电平的编码信号 ,再送给单片机 ,经单片机解码并执行相关控制程序 ,对外只有 3 个引脚 :VS、 GND和 1个脉冲信号输出引脚 ,使用方便 ,性能可靠。 图 45 为该遥控器的接收器原理图,其中 P0 口作为数码管的二进制数据输出,显示按键号, 第 9 脚为单片机复位脚,采用复位电路如图所示, 18 19 脚为12MHZ 晶振。 AT89S52 单片机 电源 控制对象 红外接收器 复位电路 晶振电路 基于 AT89S52 单片机的遥控器设计 17 图 45遥控 接收 单元原理图 图 46遥控 接收单元 PCB图 江苏信息职业技术学院毕业设计 18 5 红外遥控 程序流程图 程序开始是对单片机进行初始化设置,循环扫描判断是否有键按下 ,如果有键按下就发射相应的红外信号,遥控发射程序流程图如图 45所示。 图 51 遥控发射程序流程图 开始 键按下 初始化 调用按键 扫描程序 扫描 按键信号发送程序 发送完毕 发送 N Y 基于 AT89S52 单片机的遥控器设计 19 程序开始是对单片机进行初始化设置, 使用显示程序 , 循环扫描判断信号是否有效, 如果有 效就接收 , 接收后调用相应功能程序, 遥控 接收 程序流程图如图46 所示。 图 52 遥控发射程序流程图 开始 初始化 调用显示程序 接收 接收完毕 得键号 调用相应功能程序 判断信号是否有效 N Y 中断触发 返回 中断返回 江苏信息职业技术学院毕业设计 20 6 软件设计 :红外遥控发射端软件设计 /**************************************************************** * 文件名 : 红外遥控发射端 2 ****************************************************************/ include include define uint unsigned int define uchar unsigned char uchar count = 0。 /**************************************************************** * 名称 : delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数 ) ****************************************************************/ void delay_1ms(uint i) { uchar x,j。 for(j=0。 ji。 j++) for(x=0。 x=148。 x++)。 } /*************************************************************** * 名称 : time0_init() * 功能 : 定时器的初始化,定时 10ms ****************************************************************/ void time0_init() { TMOD = 0x01。 IE = 0x82。 TH0 = 0x15。 TL0 = 0xA0。 } /**************************************************************** * 名称 : time0_int() * 功能 : 定时器中断 基于 AT89S52 单片机的遥控器设计 21 ****************************************************************/ void time0_int() interrupt 1 { count++。 TH0 = 0x15。 TL0 = 0xA0。 } /**************************************************************** * 名称 : keyscan() * 功能 : 实现按键的读取 ****************************************************************/ uchar keyscan(void) { uchar i,j, temp, buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}。 for(j=0。 j4。 j++) { P1 = buffer[j]。 /*以下三个 _nop_()。 作用为让 P1 口的 状态稳定 */ _nop_()。 _nop_()。 _nop_()。 temp = 0x01。 for(i=0。 i4。 i++) { if(!(P1 amp。 temp)) { return (i+j*4)。 //返回取得的按键值 } temp = 1。 } } } /**************************************************************** * 名称 : main() * 功能 : 主函数 ****************************************************************/ void main(void) { uchar key_value。 //读出的键值 while(1) { P1 = 0xf0。 江苏信息职业技术学院毕业设计 22 if(P1 != 0xf0) { delay_1ms(15)。 //按键消抖 if(P1 != 0xf0) { key_value = keyscan() + 1。 //key_value 是键码加 1 } time0_init()。 TR0 = 1。 while(1) { uchar i。 for(。 count 10。 ) //发射首部 P2 = 0x00。 count = 0。 for(。 count 10。 ) P2 = 0xff。 count = 0。 for(i = 0。 i key_value。 i++) //发射数据 { for(。 count 5。 ) P2 = 0x00。 count = 0。 for(。 count 5。 ) P2 = 0xff。 count = 0。 } TR0 = 0。 break。 } } } } 基于 AT89S52 单片机的遥控器设计 23 : 红外遥控接收端软件设计 /**************************************************************** * 文件名 : 红外遥控接收端 2 ****************************************************************/ include include define uchar unsigned char define uint unsigned int uchar count = 0。 //定时器计时 uchar time = 0。 //脉冲计时 uchar num = 0。 //键码值 uchar receiv = 0。 //为 0 时不是接收状态,为 1 时为正在接收数据状态 void receive()。 /**************************************************************** * 名称 : delay() * 功能 : 延时 ,延时时间为 ****************************************************************/ void delay(uint k) { uint i,j。 for(i=0。 ik。 i++) for(j=0。 j1800。 j++)。 } /**************************************************************** * 外部中断 0 初始化 inter0_init() ****************************************************************/ void inter0_init() { EA = 1。 PX0 = 0。 IT0 = 1。 //下降沿触发 } /**************************************************************** * 外部中断 0 inter0_int() ****************************************************************/ void inter0_int() interrupt 0 { TR0 = 1。 江苏信息职业技术学院毕业设计 24 while(P3^1 == 0)。 TR0 = 0。 time = 5 * count。 if(time 450 amp。 amp。 time 750) { receiv = 1。 //等于 1 开始接收数据 EX0 = 0。 num = 0。 } count = 0。 } /**************************************************************** * 定时器 0 初始化 ****************************************************************/ void time0_init() { EA = 1。 ET0 = 1。 PT0 = 1。 TH0 = 0xEC。 TL0 = 0x78。 } void time0_int() interrupt 1 { TH0 = 0xEC。 TL0 = 0x78。 count++。 } /**************************************************************** * 键码接收 ****************************************************************/ void receive() { TR0 = 1。 while(P3^1 == 0)。 //计时高电平的时 TR0 = 0。 time = 5 * count。 if(time 180 amp。 amp。 time 420) { num++。 count = 0。 基于 AT89S52 单。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。