《软件工程程序清单.docx》由会员分享,可在线阅读,更多相关《软件工程程序清单.docx(8页珍藏版)》请在优知文库上搜索。
1、这是一个频率计的主控程序,单片机晶振频率11.0592MHz。被测信号为H1.电平的矩形波,信号频率小于500kHz,从TO输入。显示采用8个1.ED数码管,动态驱动方式。闸门时间为1秒,测量间隔为5秒。闸门1.ED灯用P1.O驱动,低电平点亮。C0M8255EQU8003HPA_8255EQU8000HPB_8255EQU8001HPC_8255EQU8002HOVEREQU21H;TO计数溢出次数计次单元BUFFEREQU22H;显示缓冲区占用4个字节,22H-25HBINEQU26H;二进制数的字节数存放单元BCDEQU27H;BCD数的个位地址BIN1.EQU28H;二进制数最低字节存
2、放地址TESTBIT00H;测量标志TESTENDBITOlH;测量结束标志SEC_5BIT02H;5秒到标志ORG01.JMPSTARTORGOBHINCOVER;To溢出次数加1RETIORGIBH1.JMPTlSORG30HSTART:MOVSP,#60HMOVDPTR,#COu8255;指向8255命令口MOVA,#80H;PA、PB、PC设为基本输出模式MOV)(DPTR,AMOVTMOD,#15H;设Tl为定时器,TO为计数器MOVTHO,#0MOVT1.O,#0MOVTHl,tt4CH;T1定时50m,晶振频率11.0592MHzMOVT1.l,ttOOHSETBPTl;T1为高
3、级中断SETBETO;允许To中断SETBETl;允许TI中断SETBTRl;启动TI计数SETBEA;开中断MOVOVER,#0;溢出计次单元清零MOVBUFFER,#0;显缓区清零MOVBUFFER+1,#0MOVBUFFER+2,HOMOVBUFFER+3,#0MOVOAH,#20;1区R2,1秒中断计次MOVOBH,#100;1区R3,5秒中断计次C1.RTESTC1.RTESTENDC1.RSEC_5MAIN:JBSEC_5,1.OOP1;5秒到则开始测量1.CA1.1.DISP;显示SJMPMAIN1.OOPl:C1.RSEC_5SETBTESTC1.RP1.O;点亮闸门灯1.00
4、P2:JBTESTEND,1.00P3;测量结束则去计算1.CA1.1.DISPSJMP1.00P21.00P3:MOVR4,#0;取溢出次数乘以10000H的结果MOVR5,OVERMOVR6,#0MOVR7,#0MOVR3,THO;取TO的计数值MOVA,T1.O1.CA1.1.MADD;4字节+2字节MOV36H,R7;4字节结果转换成6字节BCD码MOV37H,R6MOV38H,R5MOV39H,R4MOVBIN1.,#36H;指向待转换数据低位MOVBIN,#4;待转换数据为4字节MOVBCD,#30H;指向转换结果的低位地址1.CA1.1.HTOB;将4字节16进制数转成6字节BC
5、D码MOVBUFFER,33H;转换的BCD码送显MOVBUFFER+1,32H;实际只有.4个字节有效MOVBUFFER+2,31HMOVBUFFER+3,30HMOVOVER,no;测量数据相关单元清零,为下次测量做初始化MOVTHO,#0MOVT1.O,#0C1.RTESTENDSJMPMAIN一主程序结束Tl中断服务程序TlS:MOVT1.l,#00H;送50ms初值MOVTHl,tt4CHPUSHPSWSETBRSO;选择1区工作寄存器JBTEST,TTlDJNZR3,TlEXITMOVR3,#100SETB:SETBSJMPTTl:DJNZC1.RTROSETBSEC_5TROTl
6、EXIT;5秒中断计数值;置5秒到标志;启动TO计数R2,TlEXIT;1秒闸门时间未到则返回;停止TO计数TESTENDC1.RTESTMOVR2,#20SETBP1.0TlEXIT:POPPSWRETI;置测量结束标志;清测量标志;送1秒中断计数值;熄灭闸门灯动态显示子程序使用寄存器:R0,R2,R3,A,DPTRDISP:MOVDPTR,#PB_8255;消隐数码管,实际实验箱上不需要MOVA,三FH;消隐数码管,实际实验箱上不需要MOVX三PTR,A;消隐数码管,实际实验箱上不需要MOVR0,#BIJFFER+3;指向显缓区最后一个字节MOVR3,#4;显示字节数为4字节MoVR2,#
7、OFEH;位码初值,点亮最右边的数码管1.OOP:MOVA,R0AN1.A,#OFH;取出低4位MOVDPTR,#TABMOVCA,A+DPTRMOVDPTR,#PA_8255MOVXDPTR,A;段码送8255的A口MOVA,R2INCDPTR;指向8255的B口MOVXDPTR,A;位码送8255的B口R1.A;位码左移MOVR2,A;存位码1.CA1.1.DE1.AY2MS;延时2msMOVDPTR,#PB_8255;消隐数码管,实际实验箱上不需要MOVA,ttOFFH;消隐数码管,实际实验箱上不需要MOVXDPTR,A;消隐数码管,实际实验箱上不需要MOVA,R0AN1.A,#OFOH
8、;取出高4位SWAPAMOVDPTR,#TABMOVCA,A+DPTRMOVDPTR,#PA_8255MOVXDPTR,A;段码送8255的A口MOVA,R2INCDPTR;指向8255的B口MOVXDPTR,A;位码送8255的B口R1.A;位码左移MOVR2,A;存位码1.CA1.1.DE1.AY2MS;延时2msMOVDPTR,#PB_8255;消隐数码管,实际实验箱上不需要MOVA,三FH;消隐数码管,实际实验箱上不需要MOVXDPTR,A;消隐数码管,实际实验箱上不需要DECRODJNZR3,1.OOPMOVA,#0FFHMOVXDPTR,A;熄灭所有数码管RETTAB:DBOCOH
9、,0F9H,0A4H,OBOH,99H,92H,82H,0F8HDB080H,90H,88H,83H,0C6H,OAlH,86H,8EH,OFFH2ms延时子程序使用寄存器:R7对于11.0592MHz晶振,实际延时2174微秒=2.174msDE1.AY2MS:MOVR7,#250DDl:NOPNOPNOPNOPNOPNOPDJNZR7,DDlRET;多字节加法程序;4字节加2字节程序;被加数在R4R5R6R7中,加数在R3和A中;和在R4R5R6R7中MADD:ADDA,R7MOVR7,AMOVA,R3ADDCA,R6MOVR6,AC1.RAADDCA,R5MOVR5,AC1.RAADDC
10、A,R4MOVR4,ARET;多字节二进制数转换成BCD数子程序;入口参数:待转换的二进制数的字节数存放在BlN单元中;待转换的二进制数从BIN1.单元内容指定的RAM单元开始存放,低位在前。;出口参数:转换后的BCD数从BCD单元内容指定的RAM单元开始存放,低位在前。HTOB:C1.RAMOVRl,BCD;指向BCD数存放的个位单元MOVR2,BIN;取二进制数的字节数INCR2;转后的BCD数的字节数可能比二进制数多2INCR2BO:MOVR1,A;清BCD数单元INCRlDJNZR2,B0MOVA,BINMOVB,#8MU1.AB;计算二进制数的位数MOVR3,A;存二进制数的位数B3:MOVR2,BIN;取二进制数的字节数MOVR0,BIN1.;取二进制数最低位地址C1.RCBl:MOVA,R0R1.CAMOVRO,AINCRODJNZR2,B1;实现二进制数整体左移一位,最高位移入Cy中MOVR2,BININCR2;计算出BCD数的字节数INCR2MOVRl,BCD;取BCD数的个位存放地址B2:MOVA,R1ADDCA,R1;实现BCD数乘2并且加上biDAAMOVR1,AINCRlDJNZR2,B2DJNZR3,B3RETEND