如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
(红-无条件转移指令,粉红-条件转移指令,绿-调用子程序,蓝-标号地址);实验板测试程序-YL(2010制作的89S51实验板)ORG0000H;复位入口LJMPMAINORG0003H;外部中断0服务子程序入口(每一次中断将小时数加1)LJMPIX0PORG000BH;定时器0中断服务子程序入口(每计数2次将分钟数加1)LJMPIT0PORG001BH;定时器1中断服务子程序入口(进行实时钟计时)LJMPIT1PORG0030HMAIN:MOVSP,#6FH;总初始化。设定栈底指针LCALLD30MS;稍加延时(30mS),以待各芯片均退出复位状态CLRP3.2;蜂鸣器响LCALLD1S;延时1SSETBP3.2;关蜂鸣器MOVP1,#00H;P1口驱动的L0-L7指示灯全亮LCALLD1S;延时1SMOVP1,#0FFH;熄L0-L7指示灯MOVA,#89H;数码管显示与矩阵键盘接口8255A(U3)初始化MOVDPTR,#0FEFFH;8255A(U3)MOVX@DPTR,A;A、B口输出驱动字段、字位,C口输入MOVA,#8BH;LED显示、开关、按键接口8255A(U5)初始化MOVDPTR,#0FDFFH;8255A(U5)MOVX@DPTR,A;A口输出驱L8-15,B口输入按键PB0-7,C口输入电平开关SW0-7MOVDPTR,#0FEFDH;DPTR指向U3-B口MOVA,#00HMOVX@DPTR,A;关显示(位驱动全为'0'无效)MOV30H,#00H;30H-37H为显示缓冲单元,初始置‘-51-2010’MOV31H,#01HMOV32H,#00HMOV33H,#02HMOV34H,#10HMOV35H,#01HMOV36H,#05HMOV37H,#10HSETBEA;开中断总允许CLRIE0;清除INT0的中断标志位(禁止此前输入的信号产生中断)SETBIT0;设INT0中断请求输入信号下降沿有效SETBEX0;开外部INT0中断允许MOV38H,#00H;38H单元为实时钟200uS计数单元,清0MOV39H,#00H;39H单元为10mS计数单元,清0MOV3AH,#45H;秒单元初值MOV3BH,#59H;分单元初值MOV3CH,#08H;时单元初值,时钟初值08:59:45MOVTMOD,#26H;初始化T1为定时方式2,T0为计数方式2。MOVTL0,#0FEH;置T0计数初值。00H-FEH=2,每计数2次请求中断MOVTH0,#0FEHSETBET0;开T0中断允许SETBTR0;启动T0计数工作MOVTL1,#48H;置T1计数初值。00H-48H=184,184×TM≈200uS(199.6527778μS)MOVTH1,#48H;即每约200uS请求中断。(TM=12×1/11.0592MHZ=1.085069444μS)SETBET1;开T1中断允许SETBTR1;启动T1定时工作LOOP:CALLCZ;调用显示内容送显缓子程序(拆字子程序)(将时分秒送右6位显示缓冲单元)LCALLKEY;调用键盘扫描子程序(扫描到按键压下时在左第3位显示键号)LCALLDISP;调用显示更新子程序(动态驱动8位数码显示器一遍,约8mS)LCALLADSUB;调用A/D子程序(采集ADC0809的AN1输入电压的A/D数据送左2位显示)LCALLDASUB;调用D/A子程序(驱动DAC0832输出周期约2.5S的满幅正向锯齿波)LCALLPB;调用独立按键PB0-7的检测且对应控制L0-L7灯子程序LCALLSWITCH;调用电平开关SW0-7的检测且对应控制L8-L15灯子程序SJMPLOOP;反复循环主流程CZ:MOVR0,#3AH;显示内容送显缓子程序(拆字子程序)。置时钟数据单元首地址(秒单元)MOVR1,#30H;置显示缓冲单元首地址(对应于最右显示位)CZ1:MOVA,@R0;取当前数据单元BCD码ANLA,#0FH;保留低4位(个位)MOV@R1,A;送显缓当前个位单元INCR1;指向显缓当前十位单元MOVA,@R0;再取当前数据单元BCD码ANLA,#0F0H;保留高4位(十位)SWAPA;交换