单片机综合设计

上传人:xt****7 文档编号:113353011 上传时间:2022-06-25 格式:DOC 页数:20 大小:303KB
返回 下载 相关 举报
单片机综合设计_第1页
第1页 / 共20页
单片机综合设计_第2页
第2页 / 共20页
单片机综合设计_第3页
第3页 / 共20页
点击查看更多>>
资源描述
大连理工大学本科设计报告题目:基于7290的LED时钟系统设计 课程名称: 单片机综合设计 学院(系): 电子信息与电气工程学部专 业: 电子信息工程 班 级 电子0804 学 号: 200801204 学生姓名: 宋陆阳 成 绩: 2011 年 05 月 23 日题目:基于7290的LED时钟系统设计1 设计要求1)显示功能:a.用开关K1K2切换用8位数码管显示当前“时-分-秒”;b.用开关K1K2切换用8位数码管显示当前“年-月-分”;c.用开关K1K2切换用8位数码管显示报警“日.时-分”。2)修改功能: a.能够通过按键操作修改当前时、分、秒并显示;b.能够通过按键操作修改报警时、分并显示。3) 错误提示功能:当输入修改值不符合时间合法数值时即时大于24,分大于60,秒大于60,提示Error错误,并返回正常走表。4)报警功能:a.整点报时功能:59分55秒开始每秒响一下,且00秒频率提高;b.定时报警:当当前走表时间与所设置的报警时间一致时,驱动蜂鸣器产生“DO.RA.MI.FA.SO.LA.XI.DUO.”的铃音进行定时报警。2 设计分析及系统方案设计1. 主程序结构:无限循环结构.完成初始化功能:进行7290复位,初始化PCF8563T的时间数据,对中断INT0,INT1进行工作方式设置,开中断,并进入无限循环且等待中断产生.2.中断INT0:顺序结构每秒钟PCF8567的CLKOUT产生一个中断,从PCF8563T中读入数据进行调整拆分送入内存,时钟秒加一并显示,当K1=1,K2=1时,8位数码管显示当前“时-分-秒”;当K1=0时,8位数码管显示当前“年-月-分”;K1=1,K2=0时,8位数码管显示报警“日.时-分”.判断当前时间是否为整点,若是,则从分秒开始每秒钟驱动蜂鸣器每秒响1000HZ铃音0.5秒,秒频率提高;判断当前时间是否与所设置报警时间相同,若满足要求,则驱动蜂鸣器产生一个“DO.RA.MI.FA.SO.LA.XI.DUO.”的铃声。.中断INT1:顺序结构当有按键操作时产生中断。读取键值,当按链介于“AE”选择需修改的内容:A:修改当前时间“时”;B:修改当前时间“秒”;C:修改当前时间“分”;D:修改报警时间“时”;E:修改报警时间“分”,然后等待输入2次按键0-9所修改数据,当输入数据部符合时间格式时,即时大于24,分大于60,秒大于60,显示提示“Error”并返回主程序,当输入数据符合正常时间格式时,回显,并退出中断;若输入其它键则无操作退出中断.3系统电路图ZLG7290BPCF8563T4 外围接口模块硬件电路功能描述P3.2接PC8567的CLKOUT,每秒产生一次中断;P3.3接ZLG7290B,当有按键操作时产生中断;P1.3接蜂鸣器;P1.2接开关K1,选择切换显示当前“时分秒”或“年月日”;P1.4接开关K2,选择切换显示当前时间或报警“日时分”;P1.7接ZLG7290复位键;P1.0接I2C通讯线SDA;P1.1接I2C通讯线SCK。89C51:89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 ZLG7290B:ZLG7290B是广州周立功单片机发展有限公司自行设计的数码管动态显示驱动、建键盘扫描管理芯片。能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键(S1-S56、F0-F7)的扫描识别。其中8只健(F0-F7)可以作为功能键使用就像电脑键盘上的Ctrl、Shift、Alt键一样。另外ZLG7290B 内部还设置有连击计数器,能够使某些按键按下后不松手而连续有效。接口采用I2C结构。该芯片为工业级芯片,被广泛运用于仪器仪表等工业测量领域的电路设计中。特点:直接驱动1英寸以下的8位LED共阴极数码管或独立的64位LED ;能够管理多达64只按键。具有自动去抖,其中8只按键可直接作为功能键使用;段电流可达20mA。位电流可达100mA以上;利用外接功率驱动器可以驱动一英寸以上的大型数码管;具有闪烁、段点亮、段熄灭、功能键、连击计数等功能;提供10种数字、21种字母的译码显示功能,也可以将字形码写入显示寄存器直接显示数据;系统仅使用键盘电路时,工作电流为1mA;与主控器之间采用I2C 接口,仅需两条信号线;工作电压范围:+3.3+5.5V;工作温度范围:-40+85;封装:DIP24(窄体) 或SOP-24.PCF8563T:PCF8563T 是低功耗CMOS实时时钟/日历芯片,它具有一个可编程的时钟输出,一个中断输出和掉电检测电路,与外部主控器之间通过I2C总线连接。最大总线速度为400KHZ。每次对其的读写操作内部的地址寄存器都会自动产生增量。PCF8563T内部具有16个8位的寄存器;一个可自动增量的地址寄存器;一个32.768KHZ的振荡器(具有集成的补偿电容),一个用与为实时时钟RTC提供时钟源的分频器;一个可编程的时钟输出电路;一个定时器;一个报警器;一个掉电检测电路和一个400KHZ的I2C总线接口5 主程序中主要变量定义变量名称RAM单元/寄存器功能当前时间值10H-1DH程序初始时存储初始时间,当运行后存当前时间PC8563时间20H-29H存储从PC8563中读出当前的时间参数当前时间130H-37H存储处理无效位后当前日、月、年信息当前时间238H-3FH存储处理无效位后当前秒、时、分信息报警时间40H-47H存储处理无效位后报警日、时、分信息Data50H-57H存储“Error”的查表信息数据个数R7I2C操作时读入数据个数目标地址R0I2C操作时目标数据块首址器件地址R2I2C操作时器件内部从地址写地址R3I2C写操作时地址读地址R4I2C读操作时地址6系统软件中各个子程序的功能描述子程序名称入口参数出口参数功能 描述INT_RCT无无走表中断子程序,并且判断整点闹铃以及报警INT_7290无无按键中断子程序,修改当前“时分秒”或者报警“时分”可以进行输入错误提示,回显等功能ALARM无无产生0.5秒1000HZ音频ALARM1R5、R6无产生指定频率音频0.5秒CHAFEN20H-2AH30H-47H对20H-2AH数据进行拆分CFAR3、R4把A拆分成独立BCD码ADJUST20H-26H20H-26H屏蔽PCF8563读出无关位DIS_ERR无无LED显示“Error”RDKEY无A读按键值WR8563写8563操作DELAY无无延时子程序7 主程序程序流程图开辟一个数据区10H-1DH存储时间、data-data+7存储显示命令参数等待中断主程序流程图主程序将10H-1DH存储时间、命令参数送PCF8563T中A键?查询按键?按键定义A键:修改小时B键:修改分;C键:修改秒;D键:修改按键时;E键:修改按键分;YYNYINT1读取键值查询按键?N读取键值送小时的位RETINC键?B键?当前分钟处理( 同小时 处理 )当前秒处理 ( 同小时处理 )开中断YN关中断YYN调拆分、查表送28H-2FH 送7290调显示N将51的10H-1DH的数据送PCF8563TD键?报警时处理 ( 同小时处理 )D键?报警时处理 ( 同小时处理 )NYYN数据合法NY读取键值送小时的时位数据合法YN调程序显示Error按键中断INT_7290利用RDADD从PCF8563T中读出时间参数送20H-2AH利用ADJUST屏蔽掉参数中的无用的位中断服务NINTernetINTernet调CHAFEN子程序将时间分别送28H-2FH、38H-3FH缓冲区P1.2=1?RETI显示时分秒显示年月日NY报警时间到整点时间到P1.4=1?显示报警日时分产生报警闹铃产生整点闹铃YYNN终端服务INT0闹铃1000HZ,0.5ms ALARM:程序入口PUSH PSWPUSH 07HT0.T1初始化R710启动T0.T1NTF0=1?YT0初值,TF00驱动BUZZNYTF1=1?T1初值,TF10NR7-1R7 R7=0?Y关闭T0.T1POP 07HPOP PSW8程序清单SDABITP1.0;定义I2C信号引脚SCLBITP1.1 WSLAEQU070HRSLAEQU071HDISDAEQU20H;源数据块首地址DISCONEQU08H;写入数据个数DATA_1EQU50H;变量区首地址WSLA_8563EQU0A2H;PCF8563口地址RSLA_8563EQU0A3HWSLA_7290EQU70H;ZLG7290口地址RSLA_7290EQU71HORG8000HLJMP8100H ORG8003HLJMPINT_RCTORG8100HORG8013HLJMPINT_7290ORG8100HSTART: MOVSP,#60HCLRP1.7 ;7290复位LCALLDELAYSETBP1.7;*;设定PCF8563的时间和命令参数(参数和控制命令缓冲区10H-1DH);*MOV10H,#00H;启动控制字MOV11H,#1FH;设置报警及定时器中断MOV12H,#55H ;秒单元MOV13H,#37H;分单元MOV14H,#10H;小时单元MOV15H,#26H ;日期单元MOV16H,#03H ;星期单元MOV17H,#05H ;月单元 MOV18H,#10H;年单元MOV19H,#36H ;设定分报警MOV1AH,#10H;设定小时报警MOV1BH,#26H ;设定日报警MOV1CH,#03H;设定星期报警MOV1DH,#83H;设定CLKOUT的频率(1S)MOVDATA_1, #13H;变量缓冲区(显示 Error )MOVDATA_1+1,#13H;注意:MOVDATA_1+2,#13H ;变量取值范围0-FMOVDATA_1+3,#11HMOVDATA_1+4,#12HMOVDATA_1+5,#11HMOVDATA_1+6,#11H MOVDATA_1+7,#10H;*MOVR7,#0EH;写入参数个数(时间和控制字) MOVR0,#10H ;参数和控制命令缓冲区首地址MOVR2,#00H;从器件内部从地址MOVR3,#WSLA_8563;准备向PCF8563T写入数据串LCALLWRNBYT;写入时间、控制命令到8563 SETBEAMOVTCON,#00HSETBEX0CLRIT0SETBEX1SETBIT1SJMP$ ;等待中断;*;中断服务INT_RCT子程序;*INT_RCT:MOVR7,#0AH;读出数个数MOVR0,#20H ;目标数据块首址MOVR2,#02H;从器件内部从地址MOVR3,#WSLA_8563MOVR4,#RSLA_8563;准备读PCF8563T的时间参数LCALLRDADD;调读数据子程序,将读出的数据;存放于单片机20-26H中LCALLADJUST;调时间调整子程序MOV12H,20HMOV13H,21HMOV14H,22HMOV19H,27HMOV1AH,28HMOV1BH,29HLCALLCHAFEN ;调拆分子程序(包含查表) MOVA,22H;判断是否到定时时间CJNEA,28H,MMBUYMOVA,21HCJNEA,27H,MMBUYMOVA,#00HCJNEA,20H,MJ_1MOVR5,#21HMOVR6,#0F9HCALLALARM1MJ_1:MOVA,#01HCJNEA,20H,MJ_2MOVR5,#0E0HMOVR6,#0F9HCALLALARM1MJ_2:MOVA,#02HCJNEA,20H,MJ_3MOVR5,#8BHMOVR6,#0FAHCALLALARM1MJ_3:MOVA,#03HCJNEA,20H,MJ_4MOVR5,#0D7HMOVR6,#0FAHCALLALARM1MJ_4:MOVA,#04HCJNEA,20H,MJ_5MOVR5,#67HMOVR6,#0FBHCALLALARM1MJ_5:MOVA,#05HCJNEA,20H,MJ_6MOVR5,#0E8HMOVR6,#0FBHCALLALARM1MJ_6:MOVA,#06HCJNEA,20H,MJ_7MOVR5,#5BHMOVR6,#0FCHCALLALARM1MJ_7:MOVA,#07HCJNEA,20H,MMBUYMOVR5,#8EHMOVR6,#0FCHCALLALARM1MMBUY:MOVA,#59H;判断是否整点CJNEA,21H,LCMOVA,#55HCJNEA,20H,LC_1LCALLALARMLC_1:MOVA,#56HCJNEA,20H,LC_2CALLALARMLC_2:MOVA,#57HCJNEA,20H,LC_3CALLALARMLC_3:MOVA,#58HCJNEA,20H,LC_4CALLALARMLC_4:MOVA,#59HCJNEA,20H,LCCALLALARMLC:MOVA,#00HCJNEA,21H,LCCCJNEA,20H,LCCMOVR5,#44HMOVR6,#0FEHCALLALARM1LCC:MOVR7,#08HMOVR2,#10HMOVR3,#WSLA_7290JNBP1.2,YEARS;使用P1.2控制显示内容JNBP1.4,BAOJINMOVR0,#38H;显示小时、分钟和秒SJMPDISPYEARS:MOVR0,#30H ;显示年、月和日期SJMPDISPBAOJIN:MOVR0,#40HDISP:LCALLWRNBYT;调7290显示JNBP3.2,$RETI;*;ALARM;*ALARM:PUSHPSW;产生0.5秒1000HZ音频PUSH07HMOVTMOD,#11HMOVTL0,#33HMOVTH0,#0FEHMOVTL1,#0FCHMOVTH1,#4BHSETBTR0SETBTR1LOOPC:JNBTF0,$MOVTL0,#33HMOVTH0,#0FEHCLRTF0CPLP1.3JBTF1,LOOPCMOVTL1,#0FCHMOVTH1,#4BHCLRTF1DJNZR7,LOOPCCLRTR0CLRTR1POP07HPOPPSWRETALARM1:PUSHPSW;产生指定频率音频0.5秒PUSH07HMOVTMOD,#11HMOVTL0,R5MOVTH0,R6MOVTL1,#0FCHMOVTH1,#4BHSETBTR0SETBTR1LOOPD:JNBTF0,$MOVTL0,R5MOVTH0,R6CLRTF0CPLP1.3JBTF1,LOOPDMOVTL1,#0FCHMOVTH1,#4BHCLRTF1DJNZR7,LOOPDCLRTR0CLRTR1POP07HPOPPSWRET;*;各子程序;* ORG8300H CHAFEN:PUSHPSW ;对20H-2AH单元的参数拆分,PUSHACC;查表后送28H-2FH(年月日) PUSH 03H ;和38H-3FH (时分秒)PUSH04HMOVA,20H;取秒参数LCALLCF ;拆分、查表在R4(H)、R3中MOV38H,R3;送秒的个位MOV39H,R4;送秒的十位MOV3AH,#02H;送分隔符-MOVA,21H;取分参数LCALLCF ;拆分、查表在R4(H)、R3中MOV3BH,R3;送分的个位MOV3CH,R4;送分的十位MOV3DH,#02H;送分隔符-MOVA,22H;取小时参数LCALLCF ;拆分、查表在R4(H)、R3中MOV3EH,R3;送小时的个位MOV3FH,R4;送小时的十位MOVA,23H;取日起参数LCALLCFMOVA,R3ORLA,#01HMOVR3,AMOV30H,R3MOV31H,R4MOVA,25H;取月参数LCALLCFMOVA,R3ORLA,#01HMOVR3,AMOV32H,R3MOV33H,R4MOVA,26H;取年参数LCALLCFMOVA,R3ORLA,#01HMOVR3,AMOV34H,R3MOV35H,R4MOV36H,#0FCH;年的高两位处理MOV37H,#0DAHMOVA,27H;报警分LCALLCFMOV40H,R3MOV41H,R4MOV42H,#02HMOVA,28H;报警时LCALLCFMOV43H,R3MOV44H,R4MOV45H,#01MOVA,29H;报警日LCALLCFMOV46H,R3MOV47H,R4POP04HPOP03HPOPACCPOPPSW;*CF:PUSH02H ;将A中的数据拆分为两个独立的PUSHDPH; BCD码并查表PUSHDPL; 结果分别存于R4、R3中MOVDPTR,#LEDSEGMOVR2,AANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANLA,#0FHMOVCA,A+DPTRMOVR4,APOPDPLPOPDPHPOP02HRET;*;将20H -26H中从PCF8563中读出的7个字节参数的无关位屏蔽掉(参见表8.7);*ADJUST:PUSHACCMOVA,20H ;处理秒单元ANLA,#7FHMOV20H,AMOVA,21H;处理分单元ANLA,#7FHMOV21H,AMOVA,22H;处理小时单元ANLA,#3FHMOV22H,AMOVA,23H;处理日期单元ANLA,#3FHMOV23H,AMOVA,24H;处理星期单元ANLA,#07HMOV24H,AMOVA,25H;处理月单元ANLA,#1FHMOV25H,APOPACCRET;*;中断服务INT_7290子程序;*INT_7290:PUSH00HPUSH02HPUSH03HPUSH04HPUSH07HPUSHACCPUSHPSWLCALLRDKEY;读取第一个按键值(功能键)CJNEA,#0AH,MINUTE;判断是A键吗?;是A键时开始处理小时数据AKEY_1:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(小时的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,X_1SJMPXXX_1:CJNEA,#10H,X_2SJMPXXX_2:CJNEA,#20H,X_3SJMPXXX_3:LJMPDIS_ERRXX:ANL14H,#0FHORL14H,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(小时的个位数)CJNEA,#00H,Y_1LJMPYYY_1:CJNEA,#01H,Y_2LJMPYYY_2:CJNEA,#02H,Y_3LJMPYYY_3:CJNEA,#03H,Y_4LJMPYYY_4:CJNEA,#04H,Y_5LJMPYYY_5:LJMPDIS_ERRYY:ANL14H,#0F0H;处理输入的数据(个位)ORL14H,ALCALLWR8563LJMPBACKMINUTE:CJNEA,#0BH,SECOND;判断是B键吗?是B键时开始处理分数据AKEY_2:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(分钟的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,Z_1SJMPZZZ_1:CJNEA,#10H,Z_2SJMPZZZ_2:CJNEA,#20H,Z_3SJMPZZZ_3:CJNEA,#30H,Z_4SJMPZZZ_4:CJNEA,#40H,Z_5SJMPZZZ_5:CJNEA,#50H,Z_6SJMPZZZ_6:LJMPDIS_ERRZZ:ANL13H,#0FHORL13H,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(分钟的个位数)ANL13H,#0F0H;处理输入的数据(个位)ORL13H,ALCALLWR8563;将修改后的时间参数送PCF8563LJMPBACKSECOND:CJNEA,#0CH,HOUR_1;判断是C键吗?是C键时开始处理秒数据AKEY_3:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(秒的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,Q_1SJMPQQQ_1:CJNEA,#10H,Q_2SJMPQQQ_2:CJNEA,#20H,Q_3SJMPQQQ_3:CJNEA,#30H,Q_4SJMPQQQ_4:CJNEA,#40H,Q_5SJMPQQQ_5:CJNEA,#50H,Q_6SJMPQQQ_6:LJMPDIS_ERRQQ:ANL12H,#0FHORL12H,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(秒的个位数)ANL12H,#0F0H;处理输入的数据(个位)ORL12H,ALCALLWR8563;将修改后的时间参数送PCF8563LJMPBACKHOUR_1:CJNEA,#0DH,MIN_1;判断是D键吗?;是D键时开始处理报警小时数据AKEY_4:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(小时的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,E_1SJMPEEE_1:CJNEA,#10H,E_2SJMPEEE_2:CJNEA,#20H,E_3SJMPEEE_3:LJMPDIS_ERREE:ANL1AH,#0FHORL1AH,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(小时的个位数)CJNEA,#00H,F_1LJMPFFF_1:CJNEA,#01H,F_2LJMPFFF_2:CJNEA,#02H,F_3LJMPFFF_3:CJNEA,#03H,F_4LJMPFFF_4:CJNEA,#04H,F_5LJMPFFF_5:LJMPDIS_ERRFF:ANL1AH,#0F0H;处理输入的数据(个位)ORL1AH,ALCALLWR8563SJMPBACKMIN_1:CJNEA,#0EH,BACK;判断是E键吗?;是E键时开始处理报警分数据AKEY_5:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(分钟的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,S_1SJMPSSS_1:CJNEA,#10H,S_2SJMPSSS_2:CJNEA,#20H,S_3SJMPSSS_3:CJNEA,#30H,S_4SJMPSSS_4:CJNEA,#40H,S_5SJMPSSS_5:CJNEA,#50H,S_6SJMPSSS_6:LJMPDIS_ERRSS:ANL19H,#0FHORL19H,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(分钟的个位数)ANL19H,#0F0H;处理输入的数据(个位)ORL19H,ALCALLWR8563;将修改后的时间参数送PCF8563SJMPBACKBACK:CJNEA,#0FH,DOWNDOWN:CLRIE0;清标志POPPSWPOPACCPOP07HPOP04HPOP03HPOP02HPOP00HRETI;*;DISPAY Error;*DIS_ERR:PUSH07HPUSH00HPUSH01HPUSH02HPUSH03HMOVDPTR,#LEDSEG ;开始对变量查表MOVR7,#DISCON;写入数据个数MOVR0,#DISDA ;源数据块首地址MOVR1,#DATA_1LOOP1:MOVA,R1MOVCA,A+DPTR ;查表得对应的字形码MOVR0,A ;送显示缓冲区INCR1INCR0DJNZR7,LOOP1 MOV28H,#00HLOOP:MOVR7,#DISCONMOVR2,#10HMOVR3,#WSLAMOVR0,#DISDA LCALLWRNBYT;调显示子程序LCALLDELAY LCALLDELAYPOP03HPOP02HPOP01HPOP00HPOP07HSJMPDOWN;*;读键值子程序 (;出口参数累加器A-获取到的键值) ;*RDKEY:MOVR0,#1FH;键值缓冲单元MOVR7,#01H;取一个数据(键值)MOVR2,#01H ;指向内部数据键值寄存器地址MOVR3,#WSLA_7290;取器件地址(写)MOVR4,#RSLA_7290;取器件地址(读) LCALLRDADD;读出7290的01H单元中的键值MOVA,1FH;取健值送缓冲单元DECARET;*;向日历芯片写入时间参数子程序;将RAM的10H-1DH中的时间参数(含控制字)写入芯片的00H-0DH单元;*WR8563:MOVR7,#0EH;写入参数个数(时间和控制字) MOVR0,#10H ;参数和控制命令缓冲区首地址MOVR2,#00H;从器件内部从地址MOVR3,#WSLA_8563;准备向PCF8563T写入数据串LCALLWRNBYT;写入时间、控制命令到8563 RET;*;*LEDSEG:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4HDB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EHDB9EH,18H,3AH,00H ;E,r,o;*; 延时子程序;*DELAY:PUSH00HPUSH01HMOVR0,#00HDELAY1:MOVR1,#00HDJNZR1,$DJNZR0,DELAY1POP01HPOP00HRET;*;由汇编语言编制的I2C通讯子程序;*;通用的I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);*WRNBYT:PUSHPSWPUSHACCWRADD:MOVA,R3;取外围器件地地址(包含r/w=0)LCALLSTA;发送起始信号S LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应MOVA,R2LCALLWRBYT;发送内部寄存器首地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应答不正确返回重来 WRDA:MOVA,R0LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应答不正确返回重来INCR0DJNZ R7,WRDALCALLSTOP POPACCPOPPSWRET ;*;(2)带有内部单元地址的多字节读操作子程序 RDADD ;*;通用的I2C通讯子程序(多字节读操作);入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);相关子程序WRBYT、STOP、CACK、STA、MNACK ;*RDADD: PUSHPSW;从PCF8563的02H单元读入7个参数PUSHACC;存放于20H-26H单元RDADD1:LCALLSTA MOVA,R3;取器件地址(写)LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,RDADD1;如果应答不正确返回重来MOVA,R2;取内部地址LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,RDADD1;如果应答不正确返回重来LCALLSTAMOVA,R4;取器件地址(读)LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,RDADD1;如果应答不正确返回重来RDN:LCALLRDBYT MOVR0,ADJNZR7,ACKLCALLMNACKLCALLSTOPPOPACCPOPPSWRETACK:LCALLMACKINCR0SJMPRDN ;3)I2C各个信号子程序;*;启动信号子程序S ;*STA:SETBSDA;启动信号SSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSDANOP;产生4.7US延时NOPNOPNOPNOP CLRSCLRET ;*;停止信号子程序P ;*STOP:CLRSDA ;停止信号PSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPSETBSDANOP;产生4.7US延时NOPNOPNOPNOPCLRSCLCLRSDARET ;*;应答信号子程序 MACK;*MACK:CLRSDA;发送应答信号ACKSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLSETBSDARET;*;非应答法信号子程序MNACK;*MNACK:SETBSDA;发送非应答信号NACKSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLCLRSDARET;*;应答检测子程序CACK;*CACK:SETBSDA;应答位检测子程序SETBSCL CLRF0MOVC,SDA;采样SDAJNCCEND;应答正确时转CENDSETBF0;应答错误时F0置一CEND:CLRSCLRET;*;发送一个字节子程序WRBYT;*WRBYT:PUSH06HMOVR6,#08H;发送一个字节子程序 WLP:RLCA ;(入口参数A)MOVSDA,CSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLDJNZR6,WLPPOP06HRET;*;接收一个字节子程序RDBYT ;*RDBYT: PUSH06HMOVR6,#08H;接收一个字节子程序RLP:SETBSDASETBSCL; *NOP;!产生大于15微秒的延时!NOP ;注意这是专门为ZLG7290NOP ;添加的20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP; *MOVC,SDAMOVA,R2RLCAMOVR2,ACLRSCLDJNZR6,RLP ;(出口参数R2)POP06HRET END9系统调试运行结果说明、分析所出现得问题,设计体会与建议系统调试硬件环境:单片机综合仿真实验仪 型号:DP-51PROC51仿真器 型号:TKSMonitor系统调试软件环境:KeilC51 Vsion2系统设计语言:汇编语言系统调试中遇到的主要问题和解决方法:1,整点报时:当判断分为59秒为55秒时进行报时,但是00秒总地法有响声,后来发现是因为当00秒时,分已经不再是59,无法进入判断的程序,增加00,00报时后即解决了问题;2,存储区交叉:因为定义变量增
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑工程


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!