




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机课程设计报告 电子密码锁 姓 名: 刘彦 班 级: 电气自动化 学 号: 20093024101 指导老师: 蔡文龙 日期: 2011.6.202011.6.24 一 设计目的 课程设计是一个综合应用课程知识的教学环节,要求学生能够将课程知识系统的联系起来,根据任务要求,科学合理地选择相应理论知识,培养学生应用课程知识解决实际问题的能力,提高对课程内容的认识和理解,培养学生分析问题、解决问题的思维能力。提高学生全局考虑问题、综合应用专业知识的能力。要完成设计任务,学生必须全局考虑单片机的软件、硬件知识,学习相应功能的实现方法,掌握简单的外部电路功能,了解单片机和外部电路的接口电路,设计接口协议,合理分配硬件、软件资源,综合利用专业知识。单片机课程设计要求学生进一步了解单片机的硬件结构。根据设计任务和单片机的功能,分析用单片机的功能实现设计任务的方法,充分考虑单片机的各种功能,最大限度的利用单片机软件、硬件资源,考虑硬件、软件资源的分配,力求以最低的成本实现设计任务要求的功能。通过单片机课程设计要求学生能够更好的理解单片机的组成,理解单片机各个组成部分的功能和应用,了解单片机的广泛应用,学习单片机的应用方法。通过单片机课程设计,可以提高学生的编程能力。课程设计的题目都是日常生活中经常见到的内容,学生容易接受和理解设计任务的要求,如何科学合理的应用单片机知识实现设计任务是单片机课程设计的主要目的。根据设计任务全面考虑课程知识,按照设计要求将任务分解,设计控制流程,体现了模块化设计的基本思想。组织学过的各种语句实现相应的功能控制,既可以学习程序编制方法,又可以进一步加深对每个语句的理解,巩固各条语句的使用语法,提高学生的编程水平。单片机课程设计可以提高学生的实际操作水平。电路板包含了单片机最小系统和课程设计各项目所需的主要元件,学生需要根据电路板上提供的元件进行硬件选择,分配硬件资源和软件资源,画出硬件原理图和连接图,根据硬件原理图和题目要求编写设计框图和相关程序,用仿真软件进行调试和连接,调试成功后用编程器将程序烧写到单片机的内部ROM中,进行硬件和软件的分别调试和统一调试,提高学生实际操作能力。通过本次课设使学生能够掌握用单片机进行实际产品开发的基本过程,加强模块化设计思想的培养,养成良好的设计、编程习惯,同时也增加了学生对本专业的兴趣,培养学生实际操作和编程技能,为今后专业课程的学习和走向工作岗位打下良好的基础。二、设计任务和要求1、根据所选题目和相应的设计要求,提出设计方案,画出系统组成框图2、根据系统组成框图和提供的多功能电路板原理图画出相应的硬件电路原理图。所需的主要元件,学生可以根据电路板上提供的元件进行硬件选择,分配硬件资源和软件资源,画出硬件原理图和连接图。3、根据硬件原理图和题目要求编写,编写相关程序。用编程仿真软件进行软件调试和连接。4、通过软硬件的反复调试最终实现设计要求。l 保密性好,编码量多。l 随机开锁成功率几乎为零。l 密码可变。用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。l 误码输入保护。当输入密码多次错误时,报警系统自动启动。l 操作简单易行,一学即会。三、设计原理分析 用户使用电子密码锁开锁的步骤为:用户输入数字密码,输入完毕后按确认键。如果密码正确,再按开锁键,即可开锁。如果密码错误则报警,如果密码错误多次,还会锁定键盘。这里需要蜂鸣器提示用户按键已按下,开锁需要继电器开关。液晶显示器则直观显示系统当前状态和提示用户需要做的操作。用户修改密码步骤为:首先输入旧密码,输入完毕后按确认键。如果密码正确再按改密键。输入两次新密码并确认。如果两次密码输入长度一致,则密码修改成功。如果两次输入不一致,则密码修改失败。失败后只能重新输入旧密码才能继续改密。为防止系统发生异常,还应提供复位开关,在系统无法正常运转时手动复位。 根据上面结构设计思路,具体设计中选用一块20cm*10cm的通用PCB板做为系统焊接板。单片机为Atmel公司的AT89S52,电源部分为直流4.5V,3节5号电池供电,实验时也可以用直流5V电源供电。键盘输入部分为4*4矩阵薄膜键盘,不需上拉电阻,但扫描时需先给行线或列线供电。液晶显示器选用1602,可以显示两行,每行16个字符。蜂鸣器为有源5V。继电器为5脚5V。密码存储选用串行AT24C02芯片,256B空间,足够存储密码,采用串行传输可以极大减少连线数目。系统原理电路图如图3-1所示。四、硬件原理图图3-1 系统原理电路图五、程序框图、流程图(见附录)六、程序清单BUFF EQU 6FH ;当前输入的密码TIMERS2 EQU 6EH ;密码输入错误的次数TIMERS EQU 6DH ;输入数字的位数;密码输入缓冲区PS1 EQU 6CHPS2 EQU 6BHPS3 EQU 6AHPS4 EQU 69HPS5 EQU 68HPS6 EQU 67HPS7 EQU 66HPS8 EQU 65HPS9 EQU 64HPS10 EQU 63HPS11 EQU 62HPS12 EQU 61HPS13 EQU 60HPS14 EQU 5FHPS15 EQU 5EHPS16 EQU 5DH;AT24C02读取缓冲区AT1 EQU 5CHAT2 EQU 5BHAT3 EQU 5AHAT4 EQU 59HAT5 EQU 58HAT6 EQU 57HAT7 EQU 56HAT8 EQU 55HAT9 EQU 54HAT10 EQU 53HAT11 EQU 52HAT12 EQU 51HAT13 EQU 50HAT14 EQU 4FHAT15 EQU 4EHAT16 EQU 4DH;新密码输入缓冲区NEW1 EQU 4CHNEW2 EQU 4BHNEW3 EQU 4AHNEW4 EQU 49HNEW5 EQU 48HNEW6 EQU 47HNEW7 EQU 46HNEW8 EQU 45HNEW9 EQU 44HNEW10 EQU 43HNEW11 EQU 42HNEW12 EQU 41HNEW13 EQU 40HNEW14 EQU 3FHNEW15 EQU 3EHNEW16 EQU 3DHPS_NEW1 BIT 20H ;新密码第一次标志位PS_NEW2 BIT 21H ;新密码第二次标志位PSW_F BIT 22H ;密码是否正确的标志位RD_F BIT 23H ;读取密码是否成功标志WR_F BIT 24H ;写入密码是否成功标志;LCD1602控制位E BIT P3.0 ;使能端,读操作时,高电平有效;写操作时,下降沿有效RW BIT P3.1 ;读操作为0,写操作为1RS BIT P3.2 ;寄存器选择输入端;AT24C02控制位SCL BIT P3.6SDA BIT P3.7ORG 0000HAJMP STARTORG 0030H;*START: ;初始化MOV SP, #70HMOV TMOD, #11HMOV TH0, #3CHMOV TL0, #0B0HMOV TH1, #3CHMOV TL1, #0B0HMOV P0,#01H ;清除屏幕,地址计数器AC=0,自动增一模式LCALL ENABLEMOV P0,#38H ;8位数据总线,显示两行LCALL ENABLEMOV P0,#38HLCALL ENABLEMOV P0,#38HLCALL ENABLEMOV P0,#06H ;显示模式,AC自动增一,显示不位移LCALL ENABLEMOV P0,#0CH ;开显示,不显示光标LCALL ENABLESETB P2.0 ;低电平开锁CLR P2.1 ;低电平蜂鸣器响MOV BUFF,#0FFH MOV TIMERS2,#00HCLR PSW_FCLR RD_FCLR WR_FLCALL INITPS ;初始化密码LCALL INITATLCALL INITNEWLCALL SECSETB P2.1 ;关蜂鸣器LCALL AT_RD ;读取AT24C02中存储的密码JB RD_F,SETLCDLCALL SETAT ;读取密码失败则载入初始密码SETLCD:NOPMOV DPTR,#SHOW_PSLCALL LCDLCALL T100MSD;*MAIN: ;程序开始MOV BUFF,#0FFHLCALL KS ;检查有没有按键按下JNZ LK1 ;有按键按下则跳转LCALL T500MSDAJMP MAIN ;没有则继续检查LK1:LCALL T10MSDLCALL SBIE ;按键识别子程序MOV R4, BUFFCJNE R4, #0FFH,CH_KF ;识别到按键则跳转LCALL T100MSDAJMP MAIN ;否则继续检查键盘;*CH_KF: ;重新定位按键NOPCLR P2.1 ;密码输入一位,鸣叫一声LCALL T100MSDSETB P2.1LCALL T100MSDLCALL T100MSDMOV R4,BUFF;输入开锁键,开锁!CJNE R4, #03H,RI_KEY_CHMOV BUFF, #0F1HAJMP OPENRI_KEY_CH: ;输入修改密码键CJNE R4, #07H,RI_KEY_ADMOV BUFF, #0F2HAJMP PS_CHRI_KEY_AD: ;未设置功能的按键CJNE R4, #0BH,RI_KEY_DEMOV BUFF, #0F3HAJMP ER_KEYRI_KEY_DE: ;未设置功能的按键CJNE R4, #0FH,RI_KEY_ENMOV BUFF, #0F4HAJMP ER_KEYRI_KEY_EN: ;输入确认键CJNE R4, #0CH,RI_KEY_REMOV BUFF, #0F5HAJMP PS_ENRI_KEY_RE: ;输入删除键,重来CJNE R4, #0EH,RI_KEY_1MOV BUFF, #0F6HAJMP PS_RERI_KEY_1:CJNE R4, #00H,RI_KEY_2MOV BUFF, #01HAJMP KEY_DIGRI_KEY_2:CJNE R4, #01H,RI_KEY_3MOV BUFF, #02HAJMP KEY_DIGRI_KEY_3:CJNE R4, #02H,RI_KEY_4MOV BUFF, #03HAJMP KEY_DIGRI_KEY_4:CJNE R4, #04H,RI_KEY_5MOV BUFF, #04HAJMP KEY_DIGRI_KEY_5:CJNE R4, #05H,RI_KEY_6MOV BUFF, #05HAJMP KEY_DIGRI_KEY_6:CJNE R4, #06H,RI_KEY_7MOV BUFF, #06HAJMP KEY_DIGRI_KEY_7:CJNE R4, #08H,RI_KEY_8MOV BUFF, #07HAJMP KEY_DIGRI_KEY_8:CJNE R4, #09H,RI_KEY_9MOV BUFF, #08HAJMP KEY_DIGRI_KEY_9:CJNE R4, #0AH,RI_KEY_0MOV BUFF, #09HAJMP KEY_DIGRI_KEY_0:CJNE R4, #0DH,ER_KEYMOV BUFF, #00HAJMP KEY_DIGER_KEY: ;无法识别按键NOPAJMP MAIN ;不起任何作用;*KEY_DIG: ;保存输入的密码并照顺序存放LCALL T100MSDINC TIMERS ;输入数字的位数MOV A,TIMERSCLR CSUBB A,#11HJZ PS_LONGMOV R2,TIMERSMOV R0,#PS1INC R0MOV A,BUFFDIG1:DEC R0DJNZ R2,DIG1MOV R0,AAJMP DIG2PS_LONG: ;超出缓冲区MOV DPTR,#SHOW_TLLCALL LCDLCALL SECAJMP RINGDIG2:;根据位数显示*号MOV R4,TIMERSMOV A,#11HCLR CSUBB A,R4MOV R4,AMOV DPTR,#SHOW_STADD_STAR:INC DPTRDJNZ R4, ADD_STARLCALL LCDAJMP MAIN;*PS_EN: ;确认键CLR CMOV A,BUFFSUBB A,#0F5HJZ EN1AJMP PS_ERREN1:CLR CMOV A,TIMERSJZ PS_SHORTDEC AJZ PS_SHORTDEC AJZ PS_SHORT ;两位及其以下密码太短JNB PS_NEW1,EN2;R0源地址,R1目的地址,R2位数MOV R2,#10HMOV R0,#PS1MOV R1,#NEW1LCALL SAVE_NEW ;保存第一次输入的新密码LCALL INITPSMOV DPTR,#SHOW_PSNLCALL LCDCLR PS_NEW1SETB PS_NEW2AJMP MAINEN2:JNB PS_NEW2,EN3AJMP MATCH_NEW ;对比两次新密码EN3:;R0源地址,R1目的地址,R2位数MOV R2,#10HMOV R0,#PS1MOV R1,#AT1LCALL C_PSW ;校验密码JB PSW_F,PS_RIGHTAJMP PS_WRONGPS_RIGHT:MOV DPTR,#SHOW_PSRLCALL LCDCLR P2.1LCALL T100MSDSETB P2.1LCALL T100MSDCLR P2.1LCALL T100MSDSETB P2.1LCALL SECLCALL SECMOV DPTR,#SHOW_ABLCALL LCDAJMP MAIN;*PS_SHORT:MOV DPTR,#SHOW_TSLCALL LCDLCALL SECAJMP RING;*PS_WRONG:MOV DPTR,#SHOW_PSWLCALL LCDRING:INC TIMERS2MOV A,TIMERS2CLR CSUBB A,#05HJZ D0MOV R5,TIMERS2 ;错误几次响几声AJMP HOLDSD0:MOV R5,#0AH ;错误5次及以上,响10声HOLDS:CLR P2.1LCALL SECSETB P2.1LCALL T500MSDDJNZ R5,HOLDSLCALL INITPSJB PS_NEW1,CHANGE4JB PS_NEW2,CHANGE4AJMP SETLCDCHANGE4:MOV A,TIMERS2CJNE A,#05H,CHANGE3CLR P2.1MOV DPTR,#SHOW_CFLCALL LCDLCALL SECLCALL SECCLR PS_NEW1CLR PS_NEW2MOV TIMERS2,#00HLCALL INITNEWSETB P2.1AJMP SETLCD;*OPEN: ;开锁CLR CMOV A,BUFFSUBB A,#0F1HJZ OPEN1AJMP PS_ERROPEN1:JB PSW_F,OPEN2AJMP PS_WRONGOPEN2:MOV DPTR,#SHOW_SULCALL LCDCLR P2.0CLR P2.1LCALL SECLCALL SECSETB P2.1LCALL SECLCALL SECCLR P2.1LCALL SECLCALL SECSETB P2.1LCALL SECLCALL SECCLR P2.1LCALL SECLCALL SECSETB P2.1SETB P2.0LCALL INITPSCLR PSW_FAJMP SETLCD;*PS_CH: ;修改密码CLR CMOV A,BUFFSUBB A,#0F2HJZ CHANGE1AJMP PS_ERRCHANGE1:JB PSW_F,CHANGE2AJMP PS_WRONGCHANGE2:LCALL INITPSLCALL INITNEWSETB PS_NEW1CLR PS_NEW2CLR PSW_FCHANGE3:MOV DPTR,#SHOW_PSNLCALL LCDAJMP MAIN;*MATCH_NEW: ;校验两次输入是否一致MOV R2,#10HMOV R0,#PS1MOV R1,#NEW1LCALL C_PSWJB PSW_F,MATCH_RCLR P2.1MOV DPTR,#SHOW_PSW ;两次密码不一致LCALL LCDLCALL SECSETB P2.1AJMP MATCH_EXITMATCH_R: ;两次密码一致CLR PSW_FCLR P2.1MOV DPTR,#SHOW_PSRLCALL LCDLCALL SECSETB P2.1WR_NEWP:LCALL AT_WR ;新密码存入AT24C02JB WR_F,RD_NEWPLCALL AT_WR ;再写一次JB WR_F,RD_NEWPLCALL SETAT ;写失败则调用初始密码AJMP MATCH_EXITRD_NEWP:LCALL AT_RD ;读出新密码JB RD_F,MATCH_TESTLCALL AT_RD ;再读一次JB RD_F,MATCH_TESTLCALL SETAT ;读失败则调用初始密码AJMP MATCH_EXITMATCH_TEST: ;对比读出密码是否正确;R0源地址,R1目的地址,R2位数MOV R2,#10HMOV R0,#AT1MOV R1,#NEW1LCALL C_PSWJNB PSW_F,MATCH_FAILCLR P2.1MOV DPTR,#SHOW_CSLCALL LCDLCALL SECSETB P2.1LCALL SECAJMP MATCH_EXITMATCH_FAIL:CLR P2.1MOV DPTR,#SHOW_ERLCALL LCDLCALL SECSETB P2.1LCALL SETAT ;读出密码错误则调用初始密码MATCH_EXIT:CLR PSW_FLCALL INITPSLCALL INITNEWAJMP SETLCD;*PS_RE:CLR CMOV A,BUFFSUBB A,#0F6HJZ RE1AJMP PS_ERRRE1:JB PS_NEW1,RE2JB PS_NEW2,RE2LCALL INITPSAJMP SETLCDRE2:LCALL INITPSMOV DPTR,#SHOW_PSNLCALL LCDAJMP MAIN;*PS_ERR: ;程序跑飞MOV DPTR,#SHOW_ERLCALL LCDLCALL SECLCALL SECLCALL SECAJMP START;*;*各类子程序*;*INITPS: ;初始化密码PUSH ACCPUSH PSWMOV PS1, #0FFHMOV PS2, #0FFHMOV PS3, #0FFHMOV PS4, #0FFHMOV PS5, #0FFHMOV PS6, #0FFHMOV PS7, #0FFHMOV PS8, #0FFHMOV PS9, #0FFHMOV PS10, #0FFHMOV PS11, #0FFHMOV PS12, #0FFHMOV PS13, #0FFHMOV PS14, #0FFHMOV PS15, #0FFHMOV PS16, #0FFHMOV TIMERS,#00HPOP PSWPOP ACCNOPRET;*INITAT: ;初始化AT24C02读取缓冲区;不能跟PS一致,以免直接进行比较PUSH ACCPUSH PSWMOV AT1, #0F0HMOV AT2, #0F0HMOV AT3, #0F0HMOV AT4, #0F0HMOV AT5, #0F0HMOV AT6, #0F0HMOV AT7, #0F0HMOV AT8, #0F0HMOV AT9, #0F0HMOV AT10, #0F0HMOV AT11, #0F0HMOV AT12, #0F0HMOV AT13, #0F0HMOV AT14, #0F0HMOV AT15, #0F0HMOV AT16, #0F0HPOP PSWPOP ACCNOPRET;*SETAT: ;初始密码,开始密码读取或修改失败时使用PUSH ACCPUSH PSWMOV AT1, #01HMOV AT2, #03HMOV AT3, #04HMOV AT4, #07HMOV AT5, #04HMOV AT6, #04HMOV AT7, #06HMOV AT8, #06HMOV AT9, #09HMOV AT10, #00HMOV AT11, #08HMOV AT12, #0FFHMOV AT13, #0FFHMOV AT14, #0FFHMOV AT15, #0FFHMOV AT16, #0FFHCLR P2.1MOV DPTR,#SHOW_INLCALL LCDLCALL SECSETB P2.1POP PSWPOP ACCNOPRET;*INITNEW: ;初始化密码PUSH ACCPUSH PSWMOV NEW1, #0FFHMOV NEW2, #0FFHMOV NEW3, #0FFHMOV NEW4, #0FFHMOV NEW5, #0FFHMOV NEW6, #0FFHMOV NEW7, #0FFHMOV NEW8, #0FFHMOV NEW9, #0FFHMOV NEW10, #0FFHMOV NEW11, #0FFHMOV NEW12, #0FFHMOV NEW13, #0FFHMOV NEW14, #0FFHMOV NEW15, #0FFHMOV NEW16, #0FFHCLR PS_NEW1CLR PS_NEW2POP PSWPOP ACCNOPRET;*LCD:PUSH ACCPUSH PSWMOV P0,#01HLCALL ENABLELCALL T10MSDLCALL WR_ENLCALL LCD_WRPOP PSWPOP ACCRET;*;以00H作为每句话的结尾.SHOW_PS: DB 50H,61H,73H,73H,77H,6FH,72H,64H,3AH,00HSHOW_PSR: DB 50H,61H,73H,73H,77H,6FH,72H,64H,0A0H,52H,69H,67H,68H,74H,21H,00HSHOW_PSW: DB 50H,61H,73H,73H,77H,6FH,72H,64H,0A0H,57H,72H,6FH,6EH,67H,21H,00HSHOW_PSN: DB 4EH,65H,77H,0A0H,50H,61H,73H,73H,77H,6FH,72H,64H,3AH,00HSHOW_SU: DB 53H,75H,63H,63H,65H,64H,21H,00HSHOW_ER: DB 45H,72H,72H,6FH,72H,21H,00HSHOW_RD: DB 52H,65H,61H,64H,00HSHOW_WR: DB 57H,72H,69H,74H,65H,00HSHOW_CS: DB 43H,68H,61H,6EH,67H,65H,0A0H,53H,75H,63H,63H,65H,64H,21H,00HSHOW_CF: DB 43H,68H,61H,6EH,67H,65H,0A0H,46H,61H,69H,6CH,65H,64H,21H,00HSHOW_ST: DB 2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,2AH,00HSHOW_IN: DB 49H,4EH,49H,54H,0A0H,50H,61H,73H,73H,77H,6FH,72H,64H,21H,00HSHOW_TL: DB 54H,6FH,6FH,0A0H,4CH,6FH,6EH,67H,21H,00HSHOW_TS: DB 54H,6FH,6FH,0A0H,53H,68H,6FH,72H,74H,21H,00HSHOW_AB: DB 41H,3FH,0A0H,6FH,72H,0A0H,42H,3FH,00H;*LCD_WR: ;LCD显示子程序PUSH ACCPUSH PSWMOV R1,#00HA1:MOV A,R1MOVC A,A+DPTRCLR CSUBB A,#00H ;以00H做字符串结束标志JZ WR_ENDACALL LCD_WR2INC R1AJMP A1WR_END:POP PSWPOP ACCRETLCD_WR2: ;送单个字符MOV P0,ASETB RSCLR RWCLR ECALL T10MSDSETB ERETENABLE: ;写数据到指令寄存器IRPUSH ACCPUSH PSWCLR RSCLR RWCLR EACALL T10MSDSETB EPOP PSWPOP ACCRETWR_EN: ;写数据到数据寄存器DRPUSH ACCPUSH PSWCLR RSCLR RWCLR EACALL T10MSDSETB ESETB RSPOP PSWPOP ACCRET;*SBIE: ;按键识别子程序PUSH ACCPUSH PSWLCALL T10MSDACALL KSJZ KENDMOV R4, #00HMOV P1, #0FHNOPMOV A, P1LZER: ;第0列JB ACC.0,LONEMOV R4, #00HAJMP RZERLONE: ;第1列JB ACC.1,LTWOMOV R4, #04HAJMP RZERLTWO: ;第2列JB ACC.2,LTHRMOV R4, #08HAJMP RZERLTHR: ;第3列JB ACC.3,KENDMOV R4, #0CHRZER:;*MOV P1, #0F0HNOPMOV A, P1NOP;*JB ACC.4,RONEMOV A,R4AJMP KNDRONE:JB ACC.5,RTWOMOV A,R4INC AAJMP KNDRTWO:JB ACC.6,RTHRMOV A,R4ADD A, #02HAJMP KNDRTHR:JB ACC.7,KENDMOV A,R4ADD A, #03HAJMP KNDKEND:MOV A, #0FFHKND:MOV BUFF,APOP PSWPOP ACCRET;*KS: ;检查有没有按键按下MOV P1, #0FHNOPMOV A, P1CPL AANL A, #0FHNOPRET;*C_PSW: ;密码校验子程序PUSH PSWPUSH ACCC_P:CLR CMOV A,R0SUBB A,R1JNZ RETURDEC R0DEC R1DJNZ R2,C_PNOPSETB PSW_F ;密码正确,标志位置1MOV TIMERS2,#00H ;清除密码输入错误次数AJMP EXIT7RETUR:CLR PSW_F ;密码错误,标志位置0EXIT7:LCALL INITPS ;清除输入的密码POP ACCPOP PSWRET;*;R0源地址,R1目的地址,R2位数SAVE_NEW: ;保存输入的新密码PUSH PSWPUSH ACCS_N:CLR CMOV A,R0MOV R1,ADEC R0DEC R1DJNZ R2,S_NLCALL INITPS ;清除输入的密码POP ACCPOP PSWRET;*;*AT24C02读写程序*;*AT_RD:PUSH PSWPUSH ACCMOV DPTR,#SHOW_RDLCALL LCDLCALL T500MSDMOV R0,#AT1 ;CPU RAM首地址MOV R6,#10H ;16字节MOV R5,#08H ;8位MOV R7,#00H ;24C02首地址LCALL READ ;读数据NOTEST:POP ACCPOP PSWRET;*AT_WR:PUSH PSWPUSH ACCMOV DPTR,#SHOW_WRLCALL LCDLCALL T500MSDMOV R0,#NEW1 ;CPU RAM首地址MOV R6,#10H ;16字节MOV R5,#08H ;8 BITMOV R7,#00H ;24C02首地址LCALL WRT ;写数据NOPPOP ACCPOP PSWRET;*;读串行器件 R0:RAM的起始地址,R5:位计数器,;R6:读的字节数,R7:读的起始地址READ:NOPNOPLCALL START0 ;送总线开始信号MOV A,#0A0H ;被控器AT24C02总线地址写模式LCALL WRBYT ;发送被控器地址LCALL CHKJB F0,RD_FAIL ;出错返回MOV A,R7 ;取存储地址LCALL WRBYT ;发送存储地址LCALL CHKJB F0,RD_FAIL ;出错返回LCALL START0 ;发送IC总线重复起始条件MOV A,#0A1H ;24C02总线地址取总线读操作数LCALL WRBYT ;发送被控制总线地址LCALL CHKJB F0,RD_FAIL ;出错返回RD_N:NOPNOPLCALL RDBYTMOV R0,ADJNZ R6,GO_ACKLCALL N_ACKNOPMOV DPTR,#SHOW_SULCALL LCDLCALL T500MSDSETB RD_FAJMP RD_SUCEEDRD_FAIL:CLR RD_FCLR P2.1MOV DPTR,#SHOW_ERLCALL LCDLCALL SECSETB P2.1RD_SUCEED:LCALL STOPMOV A,#0FFHRET;*GO_ACK: NOPDEC R0LCALL ACKJMP RD_N;*;写串行器件 R0:RAM的起始地址;R5:位计数器;R6:写的字节数(页);R7:写的起始地址WRT:NOPNOPLCALL START0 ;送总线开始信号MOV A,#0A0H ;被控器AT24C02总线地址写模式LCALL WRBYT ;发送被控器地址LCALL CHKJB F0,WR_FAILMOV A,R7 ;写的起始地址LCALL WRBYT ;发送单元地址LCALL CHKJB F0,WR_FAILWR_N:NOPNOPMOV A,R0LCALL WRBYTLCALL CHKJB F0,WR_FAILDEC R0DJNZ R6,WR_NNOPMOV DPTR,#SHOW_SULCALL LCDLCALL T500MSDSETB WR_FAJMP WR_SUCEEDWR_FAIL: ;写失败CLR WR_FCLR P2.1MOV DPTR,#SHOW_ERLCALL LCDLCALL SECSETB P2.1WR_SUCEED:LCALL STOPMOV A,#0FFHRET;*START0:;启动I2C总线子程序发送I2C起始条件NOPNOPSETB SDA ;发送起始条件数据信号SETB SCL ;发送起始条件的时钟信号NOPNOPNOPNOP ;起始条件锁定时间大于4.7USCLR SDA;发送起始信号NOPNOPNOPNOP ;起始条件锁定时间大于4.7USCLR SCL ;钳住总线,准备发送或接收数据NOPNOPRET;*STOP:;停止I2C总线子程序发送I2C总线停止条件NOPNOPCLR SDASETB SCLNOPNOPNOPNOPSETB SDANOPNOPNOPNOPCLR SCLNOPNOPRET;-ACK: ;读应答NOPNOPCLR SDASETB SCLNOPNOPNOPNOPCLR SCLSETB SDANOPRET;-N_ACK: ;读不应答NOPNOPSETB SDASETB SCLNOPNOPNOPNOPCLR SCLCLR SDANOPRET;-CHK: ;写应答NOPNOPSETB SDA ;8位发送完后释放数据线准备收应答位NOPNOPNOPNOPSETB SCL ;开始接受应答信号NOPNOPNOPNOPCLR F0 ;预先清发送数据出错标志MOV C,SDA ;应答信号SDAMOV F0,C ;未受到应答置位F0NOPNOPCLR SCL ;发送结束钳住总线准备下一步发送或接受数据RET;-RDBYT:NOPSETB SDA ;置数据线为输入方式MOV R5,#8 ;要读的数据长度为8位RD_B:NOPNOPCLR SCL ;准备接受数据NOPNOPNOPNOPSETB SCL ;读数据NOPNOPNOPNOPMOV C,SDA ;接受的数据位放入ACCRLC ANOPNOPCLR SCLDJNZ R5,RD_BNOPRET;*;一字节数据发送子程序WRBYT:MOV R5,#08H ;要传送的数据长度为8位CLR C ;清进位标志CLR SCL ;时钟线,先钳位为0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 气管插管培训课件
- 2025年住院医师规培-新疆-新疆住院医师规培(外科)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-重庆-重庆防疫员四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-重庆-重庆水利机械运行维护工四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-重庆-重庆放射技术员一级(高级技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-重庆-重庆地图绘制员五级(初级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-重庆-重庆兽医防治员二级(技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-北京-北京食品检验工四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-北京-北京热处理工一级(高级技师)历年参考题库典型考点含答案解析
- 健康管理与疾病监控专业面试题集
- 慢性鼻窦炎诊断和治疗指南(2024)解读
- 厂内专用垃圾转运方案(3篇)
- 2025年地质勘探与资源矿产管理技术考试试题及答案
- 2024-2025学年人教版八年级数学上册《全等三角形》综合训练练习题(含答案解析)
- 肾内科常见病诊疗与管理
- 口腔医生岗前培训课件
- 小学一年级升二年级暑假数学作业-58套计算
- 驾考题库及答案大全
- 康复科疾病护理
- 地下通道水泵房管理制度
- 溺水患者急救培训
评论
0/150
提交评论