51单片机汇编语言a)单个与多个LED灯,位操作与字节操作—输出ORG 0000HSTART:CLR CMOV P0.0,CMOV P1.1,CMOV P2.2,CMOV P3.3,CCLR ACPL AMOV P0,AMOV P1,AMOV P2,AMOV P3,AEND程序说明:可以用7段数码管来代替各端口的8个LED灯,硬件的这种显示方式使得数字表达成为实用。
数字显示由数码管的硬件结构与工作原理(7个LED灯的几何变形组合)和数字表达的数据格式确定。
如:共阳极数码管显示数字3,则有P1口送数据#4FH;MOVP1, #0B0H共阴极数码管显示数字8,则有P1口送数据#80H;MOVP1, #7F H用数据表表示则有:TABshuziyang: //阳极管(共阴极管取反即可)DB(数字0~F)C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C 6H,A1H,86H,8EHTABshuziyin: //阴极管(共阳极管取反即可)DB(数字0~F)3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,3 9H,5EH,79H,71Hb)单个与多个LED灯闪烁—延时子程序—注意定时器前边已经看到,通过改变位或字节的赋值,可以使得LED灯亮或灭,以此形成闪烁效果。
但是硬件的响应时间太短,使得效果不佳。
虽然可以通过改变单片机的时钟设置来改变效果。
但时钟的改变极其不方便,因此需要利用延时指令(注意定时器功能)获得理想的效果。
延时效果是利用单片机空转来实现的。
ACALLDELAY;调延时子程序************************************************* ************************DELAY:;延时子程序—这是一个非常有用、而且常见的一个子程序MOV R5,#04H;将16进制数04H传递给寄存器R5F3:MOV R6,#0FFH;将16进制数0FFH传递给寄存器R6F2:MOV R7,#0FFH;将16进制数0FFH传递给寄存器R7F1:DJNZR7, F1;寄存器R7减1非0跳转到F1,直到减为0顺序执行下一指令DJNZR6, F2;寄存器R6减1非0跳转到F2,直到减为0顺序执行下一指令DJNZR5, F3;寄存器R5减1非0跳转到F3,直到减为0顺序执行下一指令RET;子程序结束,返回子程序入口处ACALLDELAY;调延时子程序************************************************* **************************应用实例MAIN:CLR CMOV P0.0,CMOV P1.1,CMOV P2.2,CMOV P3.3,CACALLDELAY;调延时子程序;CLR ACPL AMOV P0,AMOV P1,AMOV P2,AMOV P3,AACALL DELAY;调延时子程序SJMP MAIN ;相对转移时间短,用AJMP绝对转移时间长,RET是用于子程序的返回DELAY:;延时子程序-这是一个非常有用、而且常见的一个子程序MOV R5,#04H;将16进制数04H传递给寄存器R5F3:MOV R6,#0FFH;将16进制数0FFH传递给寄存器R6F2:MOV R7,#0FFH;将16进制数0FFH传递给寄存器R7F1:DJNZR7, F1 ;寄存器R7减1非0跳转到F1,直到减为0顺序执行下一指令DJNZR6, F2 ;寄存器R6减1非0跳转到F2,直到减为0顺序执行下一指令DJNZR5, F3 ;寄存器R5减1非0跳转到F3,直到减为0顺序执行下一指令RET;子程序结束,返回子程序入口处ACALLDELAY;调延时子程序END程序说明:注意延时子程序中的DJNZR7, F1;DJNZR6, F2;DJNZR5, F3;通过增加或减少循环数目控制或改变延时时间c)单个与多个LED灯流动—位循环、字节循环与延时子程序ORG 0000HMAIN:;****************位循环—扫描—流水灯—逐级增加灯的数目*******************CLR CMOV P0.0,CACALLDELAY;调延时子程序MOV P0.1,CACALLDELAY MOV P0.2,CACALLDELAY MOV P0.3,CACALLDELAYMOV P0.4,CACALLDELAYMOV P0.5,CACALLDELAYMOV P0.6,CACALLDELAY MOV P0.7,CACALLDELAY;注意前面各位状态一直持续。
P0口各位电平保持不变;****************位循环—流水灯—逐个改变灯亮与灭*******************CLR CMOV P0.0,CACALLDELAY;调延时子程序CPL CMOV P0.0,CACALLDELAY CLR CMOV P0.1,C ACALLDELAY CPL CMOV P0.1,CACALLDELAYCLR CMOV P0.2,CACALLDELAYCPL CMOV P0.2,CACALLDELAYCLR CMOV P0.3,CACALLDELAYCPL CMOV P0.3,CACALLDELAYCLR CMOV P0.4,CACALLDELAYCPL C MOV P0.4,CACALLDELAYCLR C MOV P0.5,CACALLDELAYCPL C MOV P0.5,CACALL DELAY;注意前面各位状态—电平、输出状态变化……、……;*******************字节循环—逐级增加输出口的数目********************CPL AMOV P0,AACALLDELAYMOV P1,AACALLDELAYMOV P2,AACALLDELAYMOV P3,AACALLDELAY;*******************字节循环—流水灯—逐渐改变灯的亮灭状态*************MOV P2,#01H;注意:#01H #02H #04H #08H #80H #40H #20H #10H阳极管ACALLDELAYMOV P2,#02H;注意:#FEH #FDH #FBH #F7H #7FH #BFH #DFH #EFH阴极管ACALLDELAYMOV P2,#04HACALLDELAYMOV P2,#08HACALLDELAYMOV P2,#10HACALLDELAY MOV P2,#20H ACALLDELAYMOV P2,#40HACALLDELAYMOV P2,#80H ACALLDELAY;****************字节循环—数码管—字符(数字、字母等)**************MOV P1,#40H;改变字节中各位的电平状态,以便控制输出、显示所要求的内容ACALLDELAYMOV P1,#79HACALLDELAYMOV P1,#24H ACALLDELAYMOV P1,#30HACALLDELAYMOV P1,# 19H ACALLDELAYMOV P1,#12HACALLDELAYMOV P1,#02H ACALLDELAY MOV P1,#78HACALLDELAYSJMP MAIN ;相对转移时间短,用AJMP绝对转移时间长,RET是用于子程序的返回;*******************延时子程序***************************DELAY:;延时子程序—去除一个循环,时间变短了。
MOV R6,#04H ;将16进制数04H传递给工作寄存器R6。
改变#04H为#3FH时间变长F2:MOV R7,#0FFH;将16进制数0FFH传递给工作寄存器R7 F1:DJNZR7, F1 ;寄存器R7减1非0跳转到F1,直到减为0顺序执行下一指令DJNZR6, F2 ;寄存器R6减1非0跳转到F2,直到减为0顺序执行下一指令RET;子程序结束,返回子程序入口处ACALLDELAY;调延时子程序END;********字节循环—数码管—字符(数字、字母等)—数表与指针***********MAIN:CLR AMOV P3,#00HMOV P0,#00HMOV P2,#00HMOV R0,#00H;寄存器中放数值0MOV DPTR,#TABZshuzi ;指针PC指向数表DISP:;段标记MOV A,R0 ;将寄存器中的数值转移到累加器中MOVC A,A+DPTR;以DPTR作为基础,与累加器相加得到新地址给累加器MOV P3,A;将累加器的地址给P3口MOV P0,ASETB p2.3 ;一位数显示位控制;个位SETB p2.7ACALL DELAY;调延时子程序ACALL DELAYINC R0 ;寄存器R0加1CJNE R0,#16H,DISP ;寄存器与立即数18比较,不相等则转移到DISP循环。
相等则顺序执行TABshuziyang://阳极管DBC0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C 6H,A1H,86H,8EH,0FFHTABshuziyin://阴极管DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH ,39H,5EH,79H,71H,0FFHEND;*************字节循环—数码管—字符(数字、字母等)—移位控制***********RL A将累加器的值左移一位RLC A将累加器含进位C左移一位RR A将累加器的值右移一位RRC A将累加器含进位C右移一位1.单个按键,单个与多个LED灯—最小系统—位输入与位、字节输出—判断与子程序a)单个按键与单个LED灯(位操作—输入与输出)—判断与子程序b)单个按键与多个LED灯(位操作—输入与字节操作—输出)c)单个按键与多个LED灯(位操作—输入与位、字节操作—输出)d)单个按键与单个电机控制—开环控制1.单个按键,单个与多个LED(位操作—输入与位、字节操作—输出)—最小系统a)单个按键,单个LED灯(位操作与位输入、输出)—有、无判断而传送数据通过三个方面(程序指令、虚拟仿真、实体电路)探讨单输入与单输出:主要是理解位数据传送,包括汇编语言的数据传送指令实践、实际虚拟电路的数据传送响应,以体现抽象与具体的可理解性。