logo资料库

单片机汇编实验教程.pdf

第1页 / 共78页
第2页 / 共78页
第3页 / 共78页
第4页 / 共78页
第5页 / 共78页
第6页 / 共78页
第7页 / 共78页
第8页 / 共78页
资料共78页,剩余部分请下载后查看
单片汇编教程---------------版权归硕信通所有 单片机汇编教程 实验一 流水灯………………………………2 实验二 数码管显示…………………………4 实验三 计数器实验…………………………11 实验四 数字时钟 ………………………….15 实验五 中断实验 ………………………….30 实验六 串行通信 …………………………..39 实验七 液晶 LCD1602 显示………………..45 实验八 液晶 LCD12864 显示………...…….48 实验九 产生方波………………………........59 实验十 存储器 AT24C02 读写………………61 实验十一 红外遥控器解码 ………………...70 实验十二 51 内部功能程序框架……….……75 1
单片汇编教程---------------版权归硕信通所有 实验一 流水灯 实验原理: 对于要单片机去控制外部的器件或者要单片机接受外部的信号,就要通过i/o(input/output) 口去实现了,因为单片机只能处理数字信号,所以i/o 口接受的也是数字信号,只对高低电平敏 感,当然作用在i/o 口的电平只能是ttl 标准的,否则是判断不了的,51 单片机有40 根脚,其中 有32 根i/o 口,分为4 组,每组8 根,这与51 是8 位单片机有关的,p1、p2、p3 口都有内部上 拉电阻,唯独p0 口没有,所以使用的时候对p0 口要特别的注意,当p0 口不作数据/地址总 线的时候使用时一定要记得加上外部的上拉电阻,要不你读进来的电平就有可能不是你预想 要的。关于i/o 口的驱动能力大家也是要注意的,51 的i/o 口输出能力都比较弱,除了p1 口 的输出稍为强一点外,其他的都较弱,(p1可以驱动8 个ttl 门电路,其他的只能驱动4 个)。 在连接外设的时候就要注意了,建议大家都通过额外的驱动电路去驱动外设,当然对于那些 对成本和电源很敏感的产品你就不得不精打细算了。下面我们就一起学习51 的i/o操作吧。 本章仅仅讨论对i/o 的基本功能, 实验原理图: 实验程序: ;//********************************************************* p_out equ P2 ;宏定义P1 为p_out org 00h ;程序的开始地址 ajmp main ;跳到main org 030h ;//******************主函数*************************** ;//描 述:实现在P1 口模拟一个流水灯程序 ;//入口参数:无 ;//出口参数:无 ;//设计人:ycj 2
单片汇编教程---------------版权归硕信通所有 ;//最后修改:时间(2006.5.1) 修改人(ycj) ;//**************************************************** main: ;主函数 mov sp,#50h ;设置sp 堆栈的初始位置 mov a,#0feh ;初始化acc main_1: mov p_out,a ;点亮一个灯 mov r1,#250 ; mov r0,#250 ; call delay_time;调用时间延迟子程序,上面两句是设置延迟时间 mov p_out,#0ffh;熄灭灯 rl a ;循环左移一位准备点亮下一个灯 jmp main_1 ;跳到main_1 循环 ;//******************时间延迟函数********************** ;//描 述:用指令实现延时一段时间 ;//入口参数:r1 为高位,r0 为低位,都是十六进制表示 ;//出口参数:无 ;//设计人:ycj ;//最后修改:时间(2006.5.1) 修改人(ycj) ;//**************************************************** delay_time: push acc ;acc 入栈 push psw ;psw 入栈 mov a,r0 ;把r0 赋给acc inc r1 ;r1 加1,因为djnz 是先减1 再比较是否为零,如果不加1 ;当r1 的初值为0 的时候,减1 后变成了0x0ff,改变了当 ;初预想的延迟时间计数值 inc r0 ;道理和inc r1 一样,当然r0 和r1 的初值不能为0x0ff loop: nop nop nop nop nop nop djnz acc,loop ; mov a,r0 ; djnz r1,loop ; pop psw ;psw 出栈 pop acc ;acc 出栈 ret end 3
单片汇编教程---------------版权归硕信通所有 实验二 数码管显示 实验原理: 如果说键盘输入是单片机的耳朵,用来接收人的指令的话,那么显示则是单片机的嘴,用来 告诉我们一些重 要的信息。在我们使用单片机系统的时候,我们很想知道这个系统的工作情况,例如一些设 定的参数和现在运行 的数据,而最直观的就是把这些重要的信息显示出来,让我们一目了然。那么显示可以用发 光二极管的亮灭表示, 可以用七段数码管显示一些英文和数字,甚至用点阵的lcd 显示中文。而我们现在先来讨论 最常用的七段数码管。由上图我们可以看出p0 口为数据输入,p2.0,p2.1 是位选线。我想 在操作七段数码管前应该要知道其工作原理, 其实单个数码管是由八个发光二极管组成的,a-g 是长条形的,h 只是一个点,通常是用做 小数点的,例如当p0.0 输入一个低电平的时候,相应的a 段就会发光。七段数码管分共阴和共阳两种,共阴和共阳 是指其公共端接地还 是接高电平。上图用的是共阳的七段数码管。多位的数码管还分扫描和静态两种,所谓扫描 是指公用数据线,独立的位选线,而静态的无论是数据线还是位选线都是独立的,当位数多 了,连到数码管上的线会越来越庞大,占 用的i/o 很多,但他占用的cpu 会小一些。而扫描的数码管必须要不停地扫描,但由于它占 用的i/o 口少,实际上 应用的大多数都是扫描型的数码管。好了,现在我们想一下实现下面的功能应该怎么来编程 吧: P0 口接4×4 的键盘,p1 口接数码管的数据线,p2.0,p2.1 接数码管的位选线,现在我们 在键盘上按一下键,在 数码管上显示相应的键值,例如按下 K0 键,就显示“00”,按下 K15 就显示“15”。 实验原理图: 4
单片汇编教程---------------版权归硕信通所有 实验程序: ;//**************************************************** ;//实现功能:把键盘输入的键盘码,用led 显示出来 ;//**************************************************** p_key equ P1 led_date equ P1 choose_p equ P2 display_num_h equ 31h display_num_l equ 30h org 00h ajmp main org 30h main: mov sp,#50h mov display_num_h,#0;//初始化display_num_h 为0 mov display_num_l,#0;//初始化display_num_l 为0 main_1: call read_key;//调用键盘扫描子程序 5
单片汇编教程---------------版权归硕信通所有 mov r7,#0; mov r6,a call display;调用扫描显示子程序 ajmp main_1;循环 ;//******************按键扫描函数********************** ;//描 述:对4*4 键盘进行扫描,程序只适合4*4 键盘使用, ;// 键盘占用一组完整的i/o 口,在使用这个程序前 ;// 要宏定义p_key 为用户实际连接键盘的i/o 口 ;// #define p_key Pn;//(n=0、1、2、3) ;//入口参数:无 ;//返回参数:若有检测到按键就返回按键的编号,否则返回0xff ;// 由a 返回 ;//设计人:ycj ;//最后修改:时间(2006.4.26)修改人(ycj) ;//**************************************************** read_key: push b push psw mov p_key,#0ffh mov p_key,#0f0h mov a,p_key ;判断是否有键按下 cjne a,#0f0h,rk1 ;没有则返回0xff ajmp no_key ;有按键按下,延时去抖 rk1: mov r1,#20 call delay_time mov p_key,#0f0h mov a,p_key ;确认是否有键按下 cjne a,#0f0h,rk2 ;没有则返回0xff ajmp no_key ;确认是有按键按下, 判断哪行按键按下 rk2: jnb ACC.4,rk4 jnb ACC.5,rk5 jnb ACC.6,rk6 jnb ACC.7,rk7 ;没有检测到按键 ajmp no_key rk4: 6
单片汇编教程---------------版权归硕信通所有 mov b,#0 mov p_key,#0efh ajmp rk_next rk5: mov b,#4 mov p_key,#0dfh ajmp rk_next rk6: mov b,#8 mov p_key,#0bfh ajmp rk_next rk7: mov b,#12 mov p_key,#07fh rk_next: mov a,p_key jnb ACC.0,rk_next_0 jnb ACC.1,rk_next_1 jnb ACC.2,rk_next_2 jnb ACC.3,rk_next_3 ;没有检测到按键 ajmp no_key rk_next_0: mov a,#0 ajmp get_key rk_next_1: mov a,#1 ajmp get_key rk_next_2: mov a,#2 ajmp get_key rk_next_3: mov a,#3 ;返回检测到的按键编号 get_key: add a,b pop psw pop b ret ;没检测到按键,返回0xff no_key: mov a,#0ffh pop psw pop b 7
单片汇编教程---------------版权归硕信通所有 ret ;//******************时间延迟函数********************** ;//描 述:用指令实现延时一段时间 ;//入口参数:r1,为时间延迟参数,延时(r1*500+r1*2)*机器周期 ;//出口参数:无 ;//设计人:ycj ;//最后修改:时间(2006.4.26) 修改人(ycj) ;//**************************************************** delay_time: push acc push psw mov a,#250 loop1: djnz acc,loop1 mov a,#250 djnz r1,loop1 pop psw pop acc ret ;//***************七段数码管显示函数******************* ;//描 述:对四位的扫描型七段数码管进行扫描显示,在使 ;// 用前要定义两个个全局变量display_num_h(显示 ;// 值的高位(0~99))和display_num_l(显示值的低 ;// 位(0~99)); ;// display_num_h equ 31h ;// display_num_l equ 30h ;//入口参数: r7,r6,要显示的数字(0-9999),r7 为高位(0~99), ;// r6 为低位(0~99). ;//返回参数:无 ;//设计人:ycj ;//最后修改:时间(2006.4.26)修改人(ycj) ;//**************************************************** display: push acc push b push psw mov a,r7 subb a,#100 jnc dp1;//判断高位有没有超过99 mov a,r6 subb a,#100 jnc dp1;//判断低位有没有超过99 mov display_num_h,r7;//条件符合刷新display_num_h mov display_num_l,r6;//条件符合刷新display_num_l 8
分享到:
收藏