课程设计---红外遥控电子密码锁的设计与实现(编辑修改稿)内容摘要:

图表 22 按键扫描流程图 程序设计(见附录二) 16 4 总结: 本设计不但很好的满足了题目的要求,即终端能够接收红外遥控发射板发射的红外信号(密码)并能与已存密码作对比,而且能够在液晶上显示操作结果,还增 加了取消这一功能,从而完成了红外遥控电子密码锁的要求。 但一开始并不是这么顺利,最先将程序下载到机子里面,键盘不能工作,后经查发现键盘程序没有运行。 改过来后又发现多了一个键,没有用处,经讨论将多的键设为取消键。 原来设计的电源是直接用 USB 从电脑上引出来,后来在此解读题目时发现不能满足题目要求,所以添加了一个用 7805 稳压的小模块。 美中不足的是此设计红外遥控的距离并不太理想(一米多一点),而且取消功能并不是想象的能够取消前面自己不想要的内容,而是返回主菜单。 但这些 不足 并不能抵消此设计带来的好处。 17 5 参考文献: 侯 璐 《黑龙江大学学生学术科技创新项目申请书》 甄盈盈 《红外遥控密码锁的设计与实现》 《撰写电子设计竞赛报告参考格式》 《第 7 章 电子设计竞赛设计总结报告写作》 在此感谢以上作者、作品。 但由于部分原因没有完全列举出作者姓名或作品完整,望谅解。 18 6 附录一 整体电路结构: 图表 23 总电路图 PCB 图: 图表 24 pcb 电路图 19 7 附录二 AT24C02 模块 include sbit WP = P1^0。 sbit SCL = P1^1。 sbit SDA = P1^2。 void Delay_US(void) {。 } void Delay_10MS(void) { uchar i = 0。 uchar j = 0。 for(i = 50。 i0。 i) { for(j=200。 j0。 j)。 } } void AT24C08_unprotect() { WP = 0。 } void AT24C02_Start(void) //开始总线 { SDA = 1。 SCL = 1。 Delay_US()。 SDA = 0。 Delay_US()。 } void AT24C02_Stop(void) //停止总线 { SDA = 0。 SCL = 1。 Delay_US()。 SDA = 1。 20 Delay_US()。 } void AT24C02_Ack(void) //ACK 信号 { uchar i = 0。 //等待从机回应 SCL = 1。 Delay_US()。 while((SDA ==1) amp。 amp。 (i200))//等 侍 ACK 信号 { i ++。 } SCL = 0。 Delay_US()。 } void AT24C02_NOAck(void) //NO ACK { SCL = 1。 //主机发送给从机 Delay_US()。 SDA = 1。 SCL = 0。 Delay_US()。 } void AT24C02_Write_Byte(uchar Value)// 写 8 位数据到总线 { uchar i = 0。 for(i =0。 i8。 i++) { SCL = 0。 SDA = Value amp。 0x80。 // 1000 0000 Delay_US()。 SCL = 1。 Delay_US()。 Value = 1。 } SCL = 0。 Delay_US()。 SDA = 1。 } uchar AT24C02_Read_Byte(void)//读 8 位数据 { 21 uchar Value = 0。 uchar i = 0。 SCL = 0。 //低电平数据可以变化 Delay_US()。 for(i = 0。 i 8。 i++) { SCL = 1。 //高电平状态读数据 Delay_US()。 if(SDA) { Value |= 0x80i。 //先读高位数据 } SCL = 0。 Delay_US()。 } return Value。 } void AT24C02_Write(uchar Address,uchar Value) { AT24C02_Start()。 //起始条件 AT24C02_Write_Byte(0xA0)。 //器件地址 1010 0000//写 AT24C02_Ack()。 //等从机应答 AT24C02_Write_Byte(Address)。 // 1024 字节,其中一个字节操作 25 AT24C02_Ack()。 AT24C02_Write_Byte(Value)。 // 0x15 AT24C02_Ack()。 // AT24C02_Stop()。 Delay_10MS()。 } uchar AT24C02_Read(uchar Address) { uchar Value = 0。 AT24C02_Start()。 //开始总线 AT24C02_Write_Byte(0xA0)。 // 1010 0000 AT24C02_Ack()。 AT24C02_Write_Byte(Address)。 //读数据的地址。 //25 AT24C02_Ack()。 AT24C02_Start()。 //再次开始 AT24C02_Write_Byte(0xA1)。 // 1010 0001 AT24C02_Ack()。 Value = AT24C02_Read_Byte()。 AT24C02_NOAck()。 //主机发送给从机无应答 22 AT24C02_Stop()。 return Value。 } 红外通信模块 sbit beer=P0^4。 sbit RED_DATA=P3^2。 //红外接口 //uchar RED_ADD=0。 //红外遥控的地址 uchar RED_add=255。 //红外遥控的地址缓存区 uchar RED_key=255。 //红外摇控的键值 ,无键按下时为 255 //红外初始化 void Init_Red(void) { RED_DATA=1。 //P3^2 输出高电平 EX0=1。 //开启红外中断 P3^2 } //检测脉冲宽度 uchar Red_check(void) { uchar t=0。 uchar a=0。 while(RED_DATA) { t++。 for(a=0。 a4。 a++)。 // if(t==250) return t。 //超时溢出 } return t。 } void exter0() interrupt 0 { uchar res=0。 uchar aa=0。 bit OK=0。 bit RODATA=0。 while(1) { if(RED_DATA)//有高脉冲出现 { 23 res=Red_check()。 //获得此次高脉冲宽度 if(res==250) { break。 //非有用信号 } if(res=200amp。 amp。 res250) { OK=1。 //获得前导位 () } else if(res=70amp。 amp。 res100) //如果是宽脉冲,则 RODATA= 1 { aa++。 RODATA=1。 // } else if(res=10amp。 amp。 res50) //如果是窄脉冲,则 RODATA= 0 { aa++。 RODATA=0。 //500us } //前 18 位是遥控器地址码, 916 位是地址反码, 1724 是键值码, 2532 是是键值反码 //获取正码 if(OKamp。 amp。 (aa=0)amp。 amp。 (aa8)) { RED_add=1。 RED_add=RED_add+(uchar)RODATA。 } if(OKamp。 amp。 (aa=17)amp。 amp。 (aa25)) { RED_key=1。 RED_key=RED_key+(uchar)RODATA。 } if(aa==32amp。 amp。 RED_add==0) {。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。