51单片机入门程序9 ;工程名称:用位指令CLR和SETB指令实现P2.0所接LED的亮灭(用12MHZ晶振) ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: CLR P2.0 ;清零位指令CLR,即让P2.0恒定输出0,位指令是针对一根引脚的指令 LCALL YS ;调用延时子程序,让LED亮起来1秒种 SETB P2.0 ;置1位指令SETB,即让P2.0恒定输出1,位指令是针对一根引脚的指令 LCALL YS ;调用延时子程序,让LED灭掉1秒种 LJMP MAIN YS: MOV R1,#10 D: MOV R2,#200 T: MOV R3,#248 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行下一个语句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51单片机入门程序10 ;工程名称:用查表指令MOVC A,@A+DPTR实现P1端口LED的全亮全灭 ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV R7,#0 ;查表程序要用到软件计数器来计调出表中数据的次数(或个数) ;但是在用软件计数器前先清零,这是给软件计数器R7清零 MOV DPTR,#LIULIU ; 把表格的首地址放入寄存器DPTR, ;注意了DPTR里的地址是永恒不变的 LOOP:MOV A,R7 ;把软件计数器里的数据送给累加器A,为查表作些准备 MOVC A,@A+DPTR ;查表,把查到的数据送到A MOV P1,A ;把A里的数送到P1端口显示 ACALL YS ;调用延时子程序,显示一小段时间 INC R7 ;软件计数器自动加1 CJNE R7,#2,LOOP ;R7里的数到2了没,到了顺序往下运行,没到转移到LOOP处 MOV R7,#0 ;软件计数器清零,也就是上面程序已经调出表里的最后一个数据 AJMP LOOP ;回到LOOP处重新把表里的第一个数调出来显示 LIULIU: DB 00000000B,11111111B ;DB 00H ,0FFH 注意了如果是用十六进制表示时,#号后面不能 ;直接跟十六进制里面的那几个英文字母,要用0隔开 YS: ;延时子程序,如果是用12MHZ作为时钟电路的话,那么延时时间为1秒 MOV R1,#10 D: MOV R2,#200 T: MOV R3,#248 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行下一个语句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51单片机入门程序11 ;工程名称:让单个数码管显示5这个数字 ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: CLR P2.7 ;数码管的硬件连接参看课本第六章,这个语句是让数码管亮起来的条件 MOV P0,#92H ;这个语句是让数码管显示5,92H是数码管显示5的代码,参看课本79页 AJMP MAIN ;循环 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51单片机入门程序12 ;工程名称:个位数码管计数显示0-9(数码管静态显示,结合仿真板) ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: CLR P2.7 ;先让数码管能够亮起来 MOV R7, #0 ;查表程序要用到软件计数器来计调出表中数据的次数(或个数) ;但是在用软件计数器前先清零,这是给软件计数器R7清零 MOV DPTR, #LIULIU ;把表格的首地址放入寄存器DPTR, ;注意了DPTR里的地址是永恒不变的 LOOP:MOV A, R7 ;把软件计数器里的数据送给累加器A,为查表作些准备 MOVC A,@A+DPTR ;查表,把查到的数据送到A MOV P0,A ;把A里的数送到P0端口显示 ACALL YS ;调用延时子程序,显示一小段时间 INC R7 ;软件计数器自动加1 CJNE R7,#10,LOOP ;R7里的数到10了没,到了顺序往下运行,没到转移到LOOP处 MOV R7,#0 ;软件计数器清零,也就是上面程序已经调出表里的最后一个数据 AJMP LOOP ;回到LOOP处重新把表里的第一个数调出来显示 LIULIU:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ; 0 1 2 3 4 5 6 7 8 9 YS: ;延时子程序,如果是用12MHZ作为时钟电路的话,那么延时时间为1秒 MOV R1,#10 D: MOV R2,#200 T: MOV R3,#248 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行下一个语句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51单片机入门程序13 ;工程名称:让数码管显示数字12(数码管动态显示,结合仿真板和课本第七章电路图) ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H ;伪指令,规定下面的指令保存在程序存储器的0000H单元 AJMP MAIN ;跳转到主程序,以保留0003H开始的中断入口地址 ORG 0050H ;伪指令 MAIN: SETB P2.7 ; 十位数码管熄灭 CLR P2.6 ;个位数码管亮 MOV A,#02H ;个位要显示的数据送累加器A MOV DPTR,#TABLE1 ; DPTR用于保存表的首地址 MOVC A,@A+DPTR ; 查表指令,取出DPTR所对应表中的第A个数据(此处A为累加器, ;同时应注意数据的序号从0开始编号),即取出要显示数据的段码A4H MOV P0,A ;将取得的段码A4H送到P0口显示 ACALL YS ; 调用延时程序 SETB P2.6 ; 个位数码管熄灭 CLR P2.7 ; 十位数码管亮 MOV A,#01H ;十位要显示的数据送累加器A MOV DPTR,#TABLE1 ; DPTR用于保存表的首地址(即到哪一个表中取数) MOVC A,@A+DPTR ; 查表指令,取出DPTR所对应的表中的第A个数据(此处A为累加器,;同时应注意数据的序号从0开始编号),即取出要显示数据的段码F9H MOV P0,A ;将取得的段码F9H送到P0口显示 ACALL YS ;调用延时程序 AJMP MAIN ;跳回交替继续显示 ;0 1 2 3 4 5 6 7 8 9 TABLE1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳数码管段码表 YS: ;延时子程序,如果是用12MHZ作为时钟电路的话,那么延时时间为1秒 MOV R1,#10 D: MOV R2,#200 T: MOV R3,#248 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行下一个语句的 END ;补充说明: ;1.数码管显示时一定要看好硬件连接,还要考虑数码管公共端要有恒定的有效电平 ;2.用到查表指令的程序一般思路是这样,首先编写出只运行一次的条件,如软件计数器 ;清零,把表的首地址放入DPTR和设置数码管公共端的有效电平等。然后是把软件计数器 ;里的数送到A,然后查表,接着就显示延时,再接着就是计数器自动加1,跟着就是 ;CJNE判断,后面就是循环了 ;3.数码管的静态显示一般是指给数码管的公共端一个恒定的有效电平,数码管就一直 ;处于显示状态。数码管的动态显示是指虽然数码管的公共端的有效电平 ;时有改变,但是改变的速度太快,利用人眼的视觉暂留效果我们看到的是不变动的 ;显示。其实不管是静态显示还是动态显示,只要大家能够把硬件接好 ;然后会编出相应的程序出来就可以了 |