找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2470|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机入门程序

[复制链接]
跳转到指定楼层
楼主
ID:71407 发表于 2014-12-31 14:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;工程名称:点亮单片机P1端口所接的八盏LED ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H ;ORG是伪指令,大概的意思是程序从地址0000H处开始保存程序 MAIN: ;主程序开始的标号,标号可以自己任意定义,标号就是地址 MOV P1,#00000000B ;给P1端口送数00000000B,点亮P1端口的LED AJMP MAIN ;跳转到标号MAIN处运行,AJMP是控制短转移指令 ;AJMP在这里有循环的作用,即让单片机不断给P1端口送数 END ;汇编结束指令 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51单片机入门程序2 ;工程名称:熄灭单片机P1端口所接的八盏LED ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H ;ORG是伪指令,大概的意思是程序从地址0000H处开始保存程序 MAIN: ;主程序开始的标号,标号可以自己任意定义,标号就是地址 MOV P1,#11111111B ;给P1端口送数11111111B,熄灭P1端口的LED SJMP MAIN ;跳转到标号MAIN处运行,SJMP是无条件短转移指令 ;AJMP在这里有循环的作用,即让单片机不断给P1端口送数 END ; 汇编结束指令 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;51单片机入门程序3 ;工程名称:点亮单片机P1.0和P1.7所接的LED ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P1,#01111110B ;给P1端口送数01111110B,右边的0是P1.0脚对应的代码 ;左边的0是P1.7脚对应的代码,要记住这种对应关系 LJMP MAIN ;跳转到标号MAIN处运行,LJMP是控制长转移指令 ;AJMP在这里有循环的作用,即让单片机不断给P1端口送数 END ; 汇编结束指令 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;51单片机入门程序4 ;工程名称:让单片机P1端口的LED不断的亮灭起来 ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P1,#00000000B ;给P1端口送数00000000B,先点亮P1端口的LED ACALL YS ;调用延时子程序,让LED亮一小段时间 MOV P1,#11111111B ;给P1端口送数11111111B,熄灭P1端口的LED ACALL YS ;调用延时子程序,让LED灭一小段时间 AJMP MAIN ;跳转到标号MAIN处运行,反复让LED一亮一灭 YS: ;延时子程序YS,功能是能让LED亮起来或者灭掉一小段时间 MOV R1,#200 ;让灯亮灭时间的长短也就是延时的长短跟#号后面的数据有关 D: MOV R2,#200 ;延时长点#号后面的数据就大点,延时短点#号后面的数据 T: MOV R3,#200 ;就小点,但#号后面最大的数据是255 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行别的语句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51单片机入门程序5 ;工程名称:让单片机P1端口的LED实现跑马灯效果,循环移位点亮一盏LED ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P1,#11111110B;点亮P1.0所接的灯 ACALL YS ;调用延时子程序,让P1.0所接的灯亮一小段时间 MOV P1,#11111101B;点亮P1.1所接的灯 ACALL YS ;调用延时子程序,让P1.1所接的灯亮一小段时间 MOV P1,#11111011B;点亮P1.2所接的灯 ACALL YS ;调用延时子程序,让P1.2所接的灯亮一小段时间 MOV P1,#11110111B;点亮P1.3所接的灯 ACALL YS ;调用延时子程序,让P1.3所接的灯亮一小段时间 MOV P1,#11101111B;点亮P1.4所接的灯 ACALL YS ;调用延时子程序,让P1.4所接的灯亮一小段时间 MOV P1,#11011111B;点亮P1.5所接的灯 ACALL YS ;调用延时子程序,让P1.5所接的灯亮一小段时间 MOV P1,#10111111B;点亮P1.6所接的灯 ACALL YS ;调用延时子程序,让P1.6所接的灯亮一小段时间 MOV P1,#01111111B;点亮P1.7所接的灯 ACALL YS ;调用延时子程序,让P1.7所接的灯亮一小段时间 LJMP MAIN ;循环.这回用长调用指令LJMP,当程序比较长的时候就用LJMP YS: ;延时子程序YS,功能是能让LED亮起来或者灭掉一小段时间 MOV R1,#200 ;让灯亮灭时间的长短也就是延时的长短跟#号后面的数据有关 D: MOV R2,#200 ;延时长点#号后面的数据就大点,延时短点#号后面的数据 T: MOV R3,#200 ;就小点,但#号后面最大的数据是255 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行下一个语句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


;51单片机入门程序6 ;工程名称:实现跑马灯效果,循环移位点亮一盏LED,运用左移指令 ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV A,#11111110B ;先把数11111110B送到累加器A, LOOP: MOV P1,A ;把A里面的数11111110B送到P1端口输出显示 ACALL YS ;显示一小段时间 RL A ;把A里的数11111110B左移一位 AJMP LOOP ;回到LOOP处循环,即把左移后得到新的数码再显示,再刷新A YS: ;延时子程序YS,功能是能让LED亮起来或者灭掉一小段时间 MOV R1,#200 ;让灯亮灭时间的长短也就是延时的长短跟#号后面的数据有关 D: MOV R2,#200 ;延时长点#号后面的数据就大点,延时短点#号后面的数据 T: MOV R3,#200 ;就小点,但#号后面最大的数据是255 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行下一个语句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


;51单片机入门程序7 ;工程名称:让单片机P0和P2端口所接的灯同时全亮全灭 ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P0,#00000000B ;同时点亮两个端口的LED的时候, MOV P2,#00000000B ;两个MOV语句间不用调用延时子程序 LCALL YS ;调用延时子程序,让P0 P2口的LED同时亮一小段时间 MOV P0,#11111111B ;同时熄灭两个端口的LED的时候, MOV P2,#11111111B ;两个MOV语句间不用调用延时子程序 LCALL YS ;调用延时子程序,让P0 P2口的LED同时灭一小段时? LJMP MAIN ;循环 YS: ;延时子程序YS,功能是能让LED亮起来或者灭掉一小段时间 MOV R1,#200 ;让灯亮灭时间的长短也就是延时的长短跟#号后面的数据有关 D: MOV R2,#200 ;延时长点#号后面的数据就大点,延时短点#号后面的数据 T: MOV R3,#200 ;就小点,但#号后面最大的数据是255 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行下一个语句的 END ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;51单片机


入门程序8 ;工程名称:让单片机P0、P1、P2和P3端口所接的灯同时全亮全灭 ;编写日期:2009.7.4 ;编写者:蓝柳柳 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0000H MAIN: MOV P0,#00000000B MOV P2,#00000000B MOV P1,#00000000B MOV P3,#00000000B LCALL YS ;调用延时子程序 MOV P0,#11111111B MOV P2,#11111111B MOV P1,#11111111B MOV P3,#11111111B LCALL YS ;调用延时子程序 LJMP MAIN ;循环 YS: ;延时子程序YS,功能是能让LED亮起来或者灭掉一小段时间 MOV R1,#200 ;让灯亮灭时间的长短也就是延时的长短跟#号后面的数据有关 D: MOV R2,#200 ;延时长点#号后面的数据就大点,延时短点#号后面的数据 T: MOV R3,#200 ;就小点,但#号后面最大的数据是255 DJNZ R3,$ DJNZ R2,T DJNZ R1,D RET ;子程序返回指令,子程序的设计一般都是因为主程序要调用它, ;调用完是要返回到主程序继续运行下一个语句的 END ;补充说明:AJMP、SJMP、LJMP都是控制转移类指令,功能都是一样的, ; 但是当你所编写的程序比较长的时候就要用LJMP。 ; ; ACALL和LCALL都是调用指令,当程序很长的时候就用LCALL ; ; 延时子程序内部的运作比较复杂,大家只知道延时子程序的 ; 功能是能延时一小段时间。CUP那些内部部件把数码送出端口之后 ; 碰到了ACALL和LCALL这些指令后CPU就暂时不往端口送数了 ; 而是转来运行延时子程序,子程序运行过程大概是这样: ; 先把一些数分别送到一些寄存器里面去,然后进行减1判断不为0的工作 ; 就象我们我们把一些水果送到一些房间里面去,然后在里面把这些水果吃 ; 完,再去做正式的工作 ,吃水果的过程是花费时间滴,呵呵! ; 延时子程序基本上是固定不变的,只要是要延长时间都把这段子程序输进去就可以了!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:71407 发表于 2014-12-31 14:40 | 只看该作者
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.数码管的静态显示一般是指给数码管的公共端一个恒定的有效电平,数码管就一直 ;处于显示状态。数码管的动态显示是指虽然数码管的公共端的有效电平 ;时有改变,但是改变的速度太快,利用人眼的视觉暂留效果我们看到的是不变动的 ;显示。其实不管是静态显示还是动态显示,只要大家能够把硬件接好 ;然后会编出相应的程序出来就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表