51单片机汇编程序范例

合集下载

第三章MCS51单片机的指令系统和汇编语言程序示例(第5.

第三章MCS51单片机的指令系统和汇编语言程序示例(第5.

第三章MCS51单片机的指令系统和汇编语言程序示例(第5、6、7节)1.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1)MOV A,#19HADD A,#66H(2)MOV A,#5AHADD A,#6BH2.已知:A=85H,R0=30H,(30H)=11H, (31H)=0FFH,C=1,试计算单片机执行下列指令后累加器A和C中的值各是多少?(1)ADDC A,R0, (2)ADDC A,31H(3) ADDC A,@R0, (4) ADDC A,#85H3.已知M1和M2中分别存放两个16位无符号数的低8位,M1+1和M2+1中分别存放两个16位无符号数的高8位,计算两数之和(低8位存放在M1,高8位存放在M1+1,设两数之和不超过16位)。

4.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?CLR CMOV A,#52HSUBB A,#0B4H5.已知:A=0DFH,R1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC @R16.试写出能完成85+59的BCD加法程序,并对工作过程进行分析。

7.已知:两个8位无符号乘数分别放在30H和31H单元中,编程实现他们乘积的低8位存放在32H,高8位存放在33H。

8.已知:R0=30H,(30H)=0AAH,试分析执行下列指令后累加器A和30H单元的内容是什么?(1)MOV A, #0FFH ANL A, R0(2)MOV A, #0FH ANL A, 30H(3)MOV A, #0F0H ANL A, @R0(4)MOV A, #80H ANL 30H, A9.设:A=0AAH和P1=0FFH,试编程把累加器A的低四位送入P1口的低四位,P1口的高四位保持不变。

51单片机汇编程序5

51单片机汇编程序5

§5.3.2系统软件设计#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int/* IC卡信号输入输出 */sbit scl=P1^7;sbit sda=P1^6;/* I/O口定义*/sbit ICOUT=P3^2; /* 拔卡信号*/sbit ICIN=P3^3; /* 插卡信号,与上同接卡座微动开关*/sbit COMM=P3^4; /* 正在通信指示*/sbit BELL=P3^5; /* 蜂鸣器控制*/sbit PWR=P1^4; /* IC卡座电源控制*//* 波特率选择 */sbit BAUD=P1^2; /* 0:2400;1:4800 *//* 24c01-24c16读写驱动程序,*/sbit a0=ACC^0; /*定义ACC的位,利用ACC操作速度最快*/sbit a1=ACC^1;sbit a2=ACC^2;sbit a3=ACC^3;sbit a4=ACC^4;sbit a5=ACC^5;sbit a6=ACC^6;sbit a7=ACC^7;/* 读写数据缓冲区,24C01最多为128字节*/uchar buf[16]; /* 这里定义有效读入数据最多为16字节,用户根据需要定*/ uchar flag; /* 全局标志字节*//* 标志定义*/sbit IC_WR=flag^0; /* IC卡在读写状态标志*/sbit ONCOMM=flag^1; /* 系统与上位机在通信状态标志*/ sbit RST=flag^2; /* 系统热复位标志*/void start_ic(void){sda=1;scl=1;delay(2);sda=0; /* scl为高状态下,sda的下降调变启动*/ delay(6);scl=0;delay(6);}void stop_ic(void){sda=0;scl=1;delay(6);sda=1; /* 在scl=1,sda的0到1跳变结束*/delay(6);scl=0;sda=0;}void ack_ic(void)sda=0;delay(3);scl=1;delay(3);scl=0;sda=1;}/* 读字节函数,无应答信号*/ unsigned char rd24(void) {sda=1;scl=1;a7=sda;scl=0;scl=1;a6=sda;scl=0;scl=1;a5=sda;scl=0;scl=1;a4=sda;scl=0;scl=1;a3=sda;scl=0;scl=1;a2=sda;scl=0;scl=1;a1=sda;scl=0;scl=1;a0=sda;scl=0;sda=1;scl=1; scl=0;return(ACC);}/* 写字节函数*/void wd24(unsigned char dd) { ACC=dd;sda=a7;scl=1;scl=0;sda=a6;scl=1;scl=0;sda=a5;scl=1;scl=0;sda=a4;scl=1;scl=0;sda=a3;scl=1;scl=0;sda=a2;scl=1;scl=0;sda=a1;scl=1;scl=0;sda=a0;scl=1;scl=0;sda=1; scl=1;while(sda==1); /* 等待EEPROM应答*/SCL=0;}/* 随机地址读字节函数,address 为欲读单元地址*/uchar read_byter(uchar address){uchar x;start_ic();wd24(0a0);wd24(address);start_ic();wd24(0a1);x=rd24();stop_ic();return(x);}/* 从指定地址开始顺序地址读块数据,数据存入全局缓冲区buf中,n为数据字节数*/uchar read_bytes(uchar address,uchar n ){uchar a,y;for(y=0;y<n;y++){a=read_byter(address+y);buf[y]=a;}}/* *//* 字节写入模式写函数,其中address为单元地址,dd为数据*/ void write_byte(uchar address,uchar dd){start_ic();wd24(0a0);wd24(address);wd24(dd);stop_ic();}/* 串行通讯子程序 *//* 拨特率2400,8位数据、1停止位、无校验*//* 先用握手字节y,然后发送x个数据*//* 待发送数据在trdata缓冲区中*/void comm(uchar x,uchar y){uchar i,a;uint j;while(1){ l1: while(RI==0);RI=0;a=SBUF;if(a!=y) goto l1;for(i=0;i<x;i++){ SBUF=trdata[i];while(TI==0);TI=0;}for(j=0;j<12500;j++);}}/* 主程序初始化函数*/void init(void){RST=0; /* 系统热复位标志清除,只有拔卡才能置位*/ PWR=1; /* 关闭IC卡电源*/IC_WR=0;/* 清有卡标志*/ONCOMM=0; /* 清正在通信标志*/EX0=1; /* 允许INT0中断*/TMOD=0x20;SCON=0x50; /* 串行口工作方式,*/TH1=0xf3;TL1=0xf3;if(BAUD==0){PCON=0x80; /* 波特率设置为2400*/}else{PCON=0x00; /* 波特率设置为4800*/}TR1=1;EA=1; /* 开放中断*/}/* 将缓冲区数据16字节发往上位机*//* 拨特率2400,8位数据、1停止位、无校验*/ /* 待发送数据在buf缓冲区中*/void transfer(void){uchar i;uint j;for(i=0;i<16;i++){ SBUF=buf[i];while(TI==0);TI=0;for(j=0;j<1000;j++);}}/* 接收16字节存入缓冲区*//* 拨特率2400,8位数据、1停止位、无校验*/ /* 缓冲区为buf*/void receive(void){uchar i,a;for(i=0;i<16;i++){ while(RI==0);RI=0;a=SBUF;buf[i]=a;}/* 将缓冲区中的n字节写入IC卡address开始的区域*/void write_ic(uchar address,uchar n){uchar x,y;for(y=0;y<n;y++){write_byte(address+y,buf[y]);delay(10); /* 写之间的延时时间间隔,以保证写入*/}}/* 拔卡中断程序,主要完成IC卡下电及读写器软复位*/void int_0(void) interrupt 0 using 1{while(!ICOUT); /* 延时去抖*/delay(10);if(!ICOUT) /* 确实拔卡则进行以下处理*/{if(IC_WR|ONCOMM){PWR=1; /* 关闭IC卡电源*/BELL=0; /* 否则,则蜂鸣一声返回*/delay(10);BELL=1;RST=1; /* 设置热复位标志,以便热复位*/}}/* 延时函数,延时ms数由N决定,但不同的系统需要调整相应参数*/ void delay(uchar n){uchar i,j,k;for(k=0;k<n;k++)for(i=0;i<100;i++)for(j=0;j<255;j++) ;}void main(void){uchar a;fuwei: init(); /* 系统初始化*/while(!ICIN); /* 等待IC卡插入*/delay(10); /* 软件去抖并等待IC卡稳定*/while(!ICIN); /* 确认IC卡插入*/IC_WR=1; /* 设置读写卡标志(有卡,以便避免带电插拔)*/ /* 开始读IC卡16字节并存入缓冲区*/PWR=0;/* IC卡上电,以便读卡*/read_bytes(0,16);PWR=1;/* 关IC卡电源*//* 等待与上位机建立通信联系*/ONCOMM=1; /* 设置正在通信标志*/while(RI==0);RI=0;a=SBUF;switch(a){ case 0xaa: SBUF=0xaa;while(!TI); /* 向上位机回送AA*/TI=0;transfer(); /* 将缓冲区数据发往上位机*/break;case 0xbb: SBUF=0xbb;while(!TI); /* 向上位机回送BB*/TI=0;/* 上位机在发送前必须适当延时,以等待下位机准备好*/ receive(); /* 接收数据存放在缓冲区*/PWR=0;/* IC卡上电*/write_ic(0,16); /* 将数据写入IC卡,并回读比较*/PWR=1;/* IC卡下电*/break;default: SBUF=0xcc; /* 如果握手信号不是AA、BB,则*/while(!TI); /* 向上位机回送CC*/TI=0;}ONCOMM=0; /* 清正在通信标志*/while(!RST);goto fuwei; /* 等待拔卡中断以软复位*/}§5.4上位PC机通讯接口软件library Mycomdll;uses SysUtils,Classes;ConstCOM1:=$3f8;COM2:=$2f8;VarCOM:Word;{DLL中全局变量}Procedure Outb(Const Port:Word;Const Dbyte:Byte );pascal; BeginAsmMOV DX,PortMOV AL,DbyteOUT DX,ALEnd;End;Function Inb(Const Port:Word ):Byte;pascal;BeginAsmMOV DX,PortIN AL,DXMOV @Result,ALEnd;End;{串行口初始化,COM1、COM2可选,波特率2400、4800可选} Procedure CommInit(Const Port:Byte;Const Baud:String);Stdcall; VarBAUDL,BAUDH:Byte;BeginIf Port=1 thenCOM:=COM1;ElseCOM:=COM2;If BAUD=’2400’ thenBeginBAUDL:=$30;BAUDH:=$00;End;ElseBeginBAUDL:=$18;BAUDH:=$00;End;Outb(COM+3,$80);{设置波特率因子}Outb(COM,BAUDL);Outb(COM+1,BAUDH);Outb(COM+3,$03);{8位数据,1停止位,无校验} End;{发送一字节}Procedure SendByte(Const Dbyte:Byte);Stdcall; VarStatus:Byte;BeginRepeatStatus:=Inb(COM+5);Until((Status and $20)=$20);Outb(COM,Dbyte);End;Function ReceiveByte:Byte;Stdcall;VarStatus,Res:Byte;BeginRepeat:Status:=Inb(COM+5);Until((Status and $01)=$01);Res:=Inb(COM);ReceiveByte:=Res;End;{以下用EXPORT引出输出过程或函数} Export CommInit;Export SendByte;Export ReceiveByte;BeginEnd.。

3-1 MCS-51单片机汇编语言程序设计举例

3-1 MCS-51单片机汇编语言程序设计举例
INC R1 DJNZ R5, SUB1 RET
二、 乘法运算程序
在计算机中, 常将乘法采用移位和加法来实现。 例8 将(R2R3)和(R6R7)中双字节无符号数相乘, 结果存入 R4R5R6R7。 此乘法可以采用部分积右移的方法来实现, 其程序框图 如图 4.6 所示, 程序如下: NMUL: MOV R4, #0 MOV R5, #0 CLR C MOV R0, #16 ; 初始化
MOV HEX, A
RET
ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H
DB 46H
在这个程序中, 查表指令MOVC A, @A+PC到表格首地 址有两条指令, 占用 3 个字节地址空间, 故修改指针应加 3。
低位字节相加
MOV 20H, A MOV A, 21H ADDC A,R4 MOV 21H, A POP ACC POP PSW RET
结果送20H单元
高位字节相加
3 运算程序
一、 加、 减法程序
例 7 将40H开始存放的 10 个字节的数与 50H开始存放的
10 个字节的数相减(假设被减数大于减数)。
ADD A, R2 ; 表中一个额定值为2个字节 MOV 31H, A MOV DPTR, #TAB ; 表首址
MOVC A, @A+DPTR; 查表读取第一个字节 XCH A, 31H ; 第一个字节内容存入31H INC DPTR MOVC A, @A+DPTR; 查表读取第二个字节 MOV 32H, A ; 第二字节的内容存入32H TAB: DW 1230H, 1450H, ... DW 2230H, 2440H, ... DW 3120H, 3300H, ...

51单片机经典流水灯汇编程序

51单片机经典流水灯汇编程序

51单片机经典流水灯汇编程序(共8页)单片机流水灯汇编程序设计流水灯汇编程序8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

;用最直接的方式实现流水灯ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第二个的L ED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#B LC ALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELA Y MOV P1,#B ;完成第一次循环点亮,延时约秒 AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250msPUSH PSW ;现场保护指令(有时可以不加)MOV R4,#2 L3: MOV R2 ,#00HL1: MOV R3 ,#00HL2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L 2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--51单片机汇编程序集(二)2008年12月12日星期五 10:27辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD 整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7;二进制整数(2位)转换为十进制整数(分离BCD码);入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV@R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码);入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOVR0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOVB,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZR7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码);入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINCR0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码);入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0PUSH AMOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321POP AMOVR0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOVR0,ADJNZ R7,IBD322RET第七个试验:流水灯数字显示综合练习----51单片机汇编语言试验教程收藏该程序运行结果为个位数码管轮流现实0,1,2,3,4,5,6,7,8然后十位数码管轮流现实0,1,2,3,4,5,6,7,8反复循环,, ,, ,, ,, 依次点亮然后轮流点亮小喇叭不停发出滴答声:注意该程序配套为我站的倚天版开发套件:如果是标准版:因他的数码管接法不同。

第三章MCS51单片机的指令系统和汇编语言程序示例(第5范文

第三章MCS51单片机的指令系统和汇编语言程序示例(第5范文

第三章MCS51单片机的指令系统和汇编语言程序示例(第5、6、7节)1.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1)MOV A,#19HADD A,#66H(2)MOV A,#5AHADD A,#6BH2.已知:A=85H,R0=30H,(30H)=11H, (31H)=0FFH,C=1,试计算单片机执行下列指令后累加器A和C中的值各是多少?(1)ADDC A,R0, (2)ADDC A,31H(3) ADDC A,@R0, (4) ADDC A,#85H3.已知M1和M2中分别存放两个16位无符号数的低8位,M1+1和M2+1中分别存放两个16位无符号数的高8位,计算两数之和(低8位存放在M1,高8位存放在M1+1,设两数之和不超过16位)。

4.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?CLR CMOV A,#52HSUBB A,#0B4H5.已知:A=0DFH,R1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC @R16.试写出能完成85+59的BCD加法程序,并对工作过程进行分析。

7.已知:两个8位无符号乘数分别放在30H和31H单元中,编程实现他们乘积的低8位存放在32H,高8位存放在33H。

8.已知:R0=30H,(30H)=0AAH,试分析执行下列指令后累加器A和30H单元的内容是什么?(1)MOV A, #0FFH ANL A, R0(2)MOV A, #0FH ANL A, 30H(3)MOV A, #0F0H ANL A, @R0(4)MOV A, #80H ANL 30H, A9.设:A=0AAH和P1=0FFH,试编程把累加器A的低四位送入P1口的低四位,P1口的高四位保持不变。

51单片机实用汇编程序库(精品)

51单片机实用汇编程序库(精品)

51单片机实用汇编程序库51 单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOVP1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0 口产生高低电平地形成方波//////////////ACALLDELAYSETBP1.0ACALL DELAY10CLRP1.0AJMPMAIN;//////////////////////////////////////////////////DELAY:MOV R1,#0FFHDJNZR1,$RETEND五、定时器功能实例5.1 定时1 秒报警程序介绍:定时器1 每隔1秒钟将p1.o的输出状态改变1次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H;时间秒标志,判是否到50个0.2秒,即50*0.2=1 秒MOV TMOD,#00000001B;定时器0 工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20 次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒////////////////////////////////////////INCC: INCTFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;//////////////////////////////////////////////////RE:MOV TL0,#0AFHMOV TH0,#3CH;设定时时间为0.05 秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51使用12M 晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ 的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

51单片机汇编程序2

51单片机汇编程序2

51单片机汇编程序2§2.3.2软件结构及程序设计一、主程序及其说明ORG 0000HAJMP MAIN ;主程序ORG 0003HAJMP X0S ;外部中断入口ORG 000BHLJMP T0S ;定时器T0中断入口ORG 001BHAJMP T1S ;定时器T1中断入口ORG 0023HLJMP SSV ;串行中断入口ORG 0030HMAIN: CLR EAMOV SP, #50HMOV A, 48H ;48H、49H单元为冷热启动标志单元CJNE A, #0AAH, LRE ;如等于0AAH、55H,则说明为热启动MOV A, 49H ;否则,为冷启动,则进行自检CJNE A, #55H, LRESJMP HRELRE: LCALL ZJ ;冷启动,则自检SETD: MOV 48H,#0AAH ;自检完后,设置为热启动标志字节MOV 49H,#55HHRE: MOV A, P1 ;读判采样周期档位ANL A, #0FHXRL A, #09HJZ M17 ;数据掉电保护故不进行采样,分析原数据 SJMP M18 M17: CLR P3.5AJMP M19M18: MOV R7, #00H ;非掉电保护方式,则将所有采样数据单元 MOV DPTR,#8020H ;清0MOV R6, #00HMOV A, R6M20: MOVX @DPTR,AINC R7INC DPTRCJNE R7,#00H, M20M21: MOV R7,#19HMOV DPTR, #8000HMOV A, #14HM1: MOVX @DPTR, AINC DPTRDJNZ R7,M1SETB IT0CLR P3.5MOV TMOD,#11HM0: MOV A, P1ANL A, #0FHJNZ M2MOV TH0,#0FFH ;由T0设置采样周期MOV TL0,#0F6HMOV 3EH,#02HAJMP M10M2: JB ACC.3,M10JB ACC.2,M8JB ACC.1,M7MOV TH0,#0FFHMOV TL0,#0CEHMOV 3EH,#00HM8: JB ACC.1,M6 JB ACC.0,M5 MOV TH0,#0FCH MOV TL0,#18H MOV 3EH,#10H AJMP M9M7: JB ACC.0,M4 MOV TH0,#0FFH MOV TL0,#9CH MOV 3EH,#01H AJMP M9M6: JB ACC.0,M3 MOV TH0,#0ECH MOV TL0,#78H MOV 3EH,#13H AJMP M9M5: MOV TH0,#0F8H MOV TL0,#30H MOV 3EH,#12H SJMP M9M4: MOV TH0,#0FEH MOV TL0,#0CH MOV 3EH,#03H SJMP M9M3: MOV TH0,#0D8H MOV TL0,#0F0H MOV 3EH,#11H SJMP M9M10: LCALL ERRM9: MOV 3CH,TL0MOV 3DH,TH0MOV A, 3EHMOV DPTR,#8019HMOVX @DPTR,AMOV IE, #8BHMOV IP, #02HCLR 00H ;等待INT0采样中断M11: JNB 00H,M11MOV IE, #88HM23: MOV DPTR,#0E000HMOVX A, @DPTRMOV A, P1ANL A, #0F0HMOV DPTR,#801AHMOVX @DPTR,AM19: MOV IE, #88HACALL ST2 ;建立TB2显示内容表ACALL CALS ;计算信号峰值、均值、脉宽 LCALL TRS ;工程量转换M12: MOV DPTR,#0F000HMOVX A, @DPTRMOV A, P1 ;读显示方式开关JB ACC.4, M13ACALL SD ;固定显示SJMP M12M13: JB ACC.5, M14LCALL XPD ;分页显示SJMP M12M14: JB ACC.6, M15LCALL SLD ;滑移显示SJMP M12M15: JB ACC.7, M16ACALL DCH ;字符显示,将分析结果显示在示波器上SJMP M12M16: JB P3.4, M12 ;是否通信?=0,说明要通信JB P3.3, M16 ;开始通信?=0,说明开始通信;数据通信,以便在上位机上进行数据硬拷贝、FFT分析等LCALL SENT ;数据向上位机发送通信SJMP M12外部中断INT0中断服务程序清单如下:X0S: MOV DPTR, #2000H ;启动A/D转换MOVX @DPTR, ASETB TR0 ;启动T0定时MOV 3AH, #20H ;存储区首地址0020HMOV 3BH, #00HMOV R7, #00H ;存储计数器送初值1024MOV R6, #04HCLR 70H ;系统自检标志清除,即为正常的工作程序而非自检X0S0: CLR 01HX0S1: JNB 01H, X0S1 ;等待T0定时中断CJNE R6, #00H, X0S0 ;1024个数据全部采样完成?CJNE R7, #00H, X0S0 ;否,则继续采集CLR TR0 ;是,则停T0CLR EX0 ;关外中断INT0SETB 00HRETI定时器TIMER0中断服务程序清单如下:T0S: JNB 70H, T0S1 ;判是否为系统自检(其中的中断系统)CLR 70H ;是,则清标志后直接返回RETIT0S1: SETB 01HCLR TR0 ;停止T0MOV TH0, 3DH ;送T0原时间常数MOV TL0, 3CHSETB TR0 ;启动T0定时MOVX A, @DPTR ;读入A/D结果MOV DPH, 3BH ;按指针存储MOV DPL, 3AHMOVX @DPTR, AINC DPTR ;指向下一个单元MOV 3BH, DPH ;指针保护MOV 3AH, DPLMOV DPTR, #2000H ;指向A/D接口DEC R7 ;存储计数器减1CJNE R7, #0FFH, T0S2DEC R6T0S2: RETI2.显示字符与汉字的程序实现;******************************************************************* **** ;显示字符示例子程序,程序中的TB1、TB2、TB3三表分别为;TB1:各字符的显示点阵在字库中的首地址表,在内部EEPROM中;TB2:各字符的代码表,在外部RAM中,由子程序建立,例如:0AH代表“峰”;TB3:各字符的位置坐标,在内部EEPROM中;******************************************************************* **** DCH: MOV R0, #00H ;当前显示字符序号指针DCH1: MOV DPTR, #0000H ;查TB2表得当前显示字符的代码MOV A, DPLADD A, R0MOV DPL,AJNC DCH2INC DPHDCH2: MOVX A, @DPTR ;送存30H单元MOV 30H,ACJNE A, #14H, DCH3 ;非空格码转DCH3AJMP DCH7 ;是空格码转DCH7DCH3: MOV A, R0 ;查TB3表得显示字符的位置坐标ADD A, 0E0HPUSH ACCMOV DPTR, #0630HMOVC A, @A+DPTRMOV 31H,A ;位置X坐标送存31HPOP ACCMOVC A, @A+DPTRMOV 32H,A ;位置Y坐标送存32HMOV A, 30H ;查TB1表得字符点阵在字库中的地址ADD A, 30HPUSH ACCMOV DPTR, #0600HMOVC A, @A+DPTRMOV 33H,A ;地址高字节送33HPOP ACCINC ACCMOVC A, @A+DPTRMOV 34H,A ;地址低字节送34HMOV DPH,33H ;取本字符光点数送R1MOV DPL,34HMOV A, #00HMOVC A, @A+DPTRMOV R1, ADCH4: INC DPTR ;取光点坐标数据MOV A, #00HMOVC A, @A+DPTR ;光点X坐标送R7ANL A, #0F0HSW AP AADD A, 31HMOV R7, AMOV A, #00H ;光点Y坐标送R6MOVC A, @A+DPTRANL A, #0FHADD A, 32HMOV R6, APUSH DPLMOV DPTR, #4000H ;输出光点X坐标MOV A, R7MOVX @DPTR,AMOV DPTR, #6000H ;输出光点Y坐标MOV A, R6MOVX @DPTR,AMOV DPTR, #8000H ;X、Y同时输出至CRTMOVX @DPTR, ADEC R1 ;光点计数器减1CJNE R1, #00H, DCH5 ;本字符显示完未成,转显示下个点SJMP DCH6DCH5: POP DPLPOP DPHAJMP DCH4DCH6: POP DPL ;恢复指针POP DPHDCH7: INC R0 ;序号指针增1CJNE R0, #19H, DCH8 ;一帧未完成转显示下个字符RET ;一帧完成,则返回DCH8: AJMP DCH15.程序设计示例;******************************************************************* ****** ;滑移显示子程序,具有暂停功能,在CRT右上角显示对应页号.;******************************************************************* ****** SLD:MOV DPTR,#0020H ;数据指针初值0020HMOV TH1, #0FFH ;送T1时间常数,每点50usMOV TL1, #0EEHMOV 46H, #0FFHMOV 45H, #0EEHSETB ET1 ;开放T1中断SLD0:MOV R7,#00H ;每帧点数计数器清零PUSH DPH ;保护数据指针PUSH DPLSETB TR1 ;启动T1SLD1:CLR 02HSLD2:JNB 02H,SLD2 ;等待T1中断MOVX A,@DPTR ;按指针取数PUSH DPHPUSH DPLMOV DPTR,#6000H ;向Y轴输出MOVX @DPTR, AMOV A, R7MOV DPTR, #4000H ;向X轴输出MOVX @DPTR, AMOV DPTR, #8000H ;同时联合输出到CRTMOVX @DPTR, APOP DPLPOP DPHINC DPTR ;指向下个数据INC DPTR ;计数器减1INC R7CJNE R7, #00H, SLD1 ;本帧(256个数据)未完成则循环SLD3: POP DPL ;恢复数据指针POP DPHMOV A, DPL ;判是否已到数据末地址(即最后一个数据)CJNE A, #20H, SLD4 ;未到,修改数据指针初值转显示下帧MOV A, DPHCJNE A, #04H, SLD4CLR ET1 ;滑移显示完成,关T1LR TR1RETSLD4: JNB P3.0, SLD0 ;是暂停?是则转SLD0INC DPTR ;否则继续滑移显示SJMP SLD0串行通信中断服务子程序清单及其说明如下:SSV: CLR TI ;清发送中断标志DEC R7 ;计数器减1CJNE R7, #0FFH, SSV1DEC R6SSV1: CJNE R6, #00H, SSV2 ;计数器非0,则转SSV2 CJNE R7, #00H, SSV2CLR ES ;为0,则发送完成,关串行中断SJMP SSV3SSV2: INC DPTR ;指向下一个数据MOVX A, @DPTR ;取数LCALL XSS ;补校验位后发送SSV3: RETI补校验位并发送子程序清单:XSS: ADD A, #00H ;加入校验位MOV C, PMOV TB8, CMOV SBUF, A ;发送RET。

51单片机流水灯汇编与c语言程序

51单片机流水灯汇编与c语言程序

ALEA B C D E F G DPALE A B C D E F G D P1234ALE 2134XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX 2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52234567891RP1RESPACK-8D02D13D24D35D46D57D68D79Q019Q118Q217Q316Q415Q514Q613Q712LE 11OE 1U274HC573R1R2R3R4R5R6R7R8D1LED-REDD2LED-YELLOW D3LED-GREEND4LED-GREEND5LED-REDD6LED-YELLOWD7LED-GREEND8LED-GREEND02D13D24D35D46D57D68D79Q019Q118Q217Q316Q415Q514Q613Q712LE 11OE 1U374HC573R171kR181kR191kR201k/*******flowing water light*********///晶振:12M ,P0口接8个led进行流水灯显示,74HC573驱动,8位led共阴接法ORG 0000HLJMP MAINORG 0030H //主程序从程序存储器0030H单元开始存放MAIN: MOV P0,#0FFH //P0口初始化MOV A,#01H //共阴接法,点亮最低位LEDLOOP: MOV P0,ALCALL DELAY_1S //延时1sRL A //循环左移一次,点亮下一位SJMP LOOP //跳转到LOOP处执行,死循环// 3层嵌套软件延时子程序,延时1sDELAY_1S: MOV R1,#10 //最外层循环体执行10次DELAY0: MOV R2,#200 //中间层循环体执行200次DELAY1: MOV R3,#248 //最内层循环体执行248次DJNZ R3,$ //循环子程序最内层,执行时间248*2=496usNOP //空操作,为了凑到准确的500us执行时间DJNZ R2,DELAY1 //中间层循环体(1+496+1+2)*200=100000us=100msDJNZ R1,DELAY0 //最外层循环体(100ms+2us)*10=1000.02msRETEND/*******flowing water light*********/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时函数void Delay_ms(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主函数void main(){P0=0xff; //P0口初始化P0=0x01; //共阴接法,点亮最低位LEDwhile(1){Delay_ms(1000); //延时约1sP0=_crol_(P0,1); //P0 的值向左循环移动,_crol_()函数在头文件intrins.h中}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。

程序可见:/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/6154551f93ba5614403417 32.html中的HEX2BCD子程序。

.说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。

做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。

但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。

上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。

.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。

为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的1/4!.近来,在网上发现了一个链接:/news/Article/uc/uc8051/200803/4751.html,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。

这篇文章提到的程序,一直也没有找到,也难辩真假。

这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。

比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。

51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。

.下面说说做而论道的编程思路。

;-----------------------------------------------------------------------;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。

;那么可以写成:; n = [b15 ~ b0];把16位数分解成高8位、低8位来写,也是常见的形式:; n = [b15~b8] * 256 + [b7~b0];那么,写成下列形式,也就可以理解了:; n = [b15~b12] * 4096 + [b11~b0];式中高4位[b15~b12]取值范围为0~15,代表了4096的个数;;上式可以变形为:; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]};用x代表[b15~b12],有:; n = x * 4000 + {x * (100 - 4) + [b11~b0]};即:; n = 4*x (千位) + x (百位) + [b11~b0] - 4*x;写到这里,就可以看出一点BCD码变换的意思来了。

;;上式中后面的位:[b11~b0] - 4*x,如果小于256,那就太简单了,马上就可以去按照常规转换BCD了。

;如果数值较大,就要把[b11~b7]看成128的个数y;在百位中加上y、在十位加上3*y、并在[b6~b0]中减去2*y。

;那么就有:; n = 4*x (千位) + x (百位) + [b11~b0] - 4*x; n = 4*x (千位) + (x + y) (百位) + 3*y (十位) + [b6~b0] - 2*y;由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。

;剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。

;-----------------------------------------------------------------------从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。

编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。

做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。

感兴趣的网友可以留言,写出自己编写的程序。

51单片机把4位16进制数转成10进制数的方法2010-02-10 23:33, 2位16进制转10进制,用除以10求商跟余数的方法,即可。

4位16进制数呢?DIV指令只可以对2位16进制数进行除法运算啊,求高手解答。

例如把TH1 TL1的数值转成十进制, 分别存入R4 R3 R2 R1 R0。

我要的是汇编的方法,C语言还没学到。

悬赏分:30 - 解决时间:2010-2-10 22:47;------------------------------------------------------------------最佳答案:两个字节的二进制数转换成BCD码,必须编写程序来解决。

下面把这段转换程序,写成子程序的结构,便于网友移植。

;程序经过仿真调试通过,如下所示:;------------------------------------------------------------------;MOV R0, TH1MOV R1, TL1CALL HEX2BCD ;调用子程序把R0 R1中的数字,转换成压缩的BCD码,送到R2 R3 R4;-------下面,把万千百十个位,分别存入R4 R3 R2 R1 R0MOV A, R4 ;先分离R4中的压缩型BCD码,包含的是十位与个位的数MOV B, #16DIV AB ;除以16,目的是分离出高、低四位MOV R1, A ;存放十位MOV R0, B ;存放个位;MOV A, R2 ;万位数不超过6,即R2中的压缩型BCD码只有一个,直接放到万位R4中MOV R4, A ;存放万位;MOV A, R3 ;分离R3中的压缩型BCD码,其包含的是千位和百位数MOV B, #16 ;半字节分离DIV ABMOV R3, AMOV R2, BSJMP $ ;到此,完成了题目要求;------------------------------------------------------------------;两个字节的二进制数转换成BCD码的程序如下:;功能:16位二进制数变换成为BCD 码;;入口:R0 R1 中是16 位二进制数,其中R0中是高8 位;;出口:R2 R3 R4 中是BCD 码,其中R2中是万位,R3中是千、百位,R4中是十、个位。

HEX2BCD:CLR AMOV R2, A ;先对要放入转换后的压缩型BCD码的寄存器通通清零MOV R3, AMOV R4, AMOV R5, #16 ;共转换十六位数LOOP:CLR CMOV A, R1 ;从待转换数的高端移出一位到Cy(从低8位R1开始转换) RLC AMOV R1, AMOV A, R0RLC AMOV R0, AMOV A, R4 ;送到BCD码的低端ADDC A, R4 ;带进位加。

自身相加,相当于左移一位DA A ;十进制调整,变成BCD码MOV R4, AMOV A, R3ADDC A, R3DA AMOV R3, AMOV A, R2ADDC A, R2MOV R2, ADJNZ R5, LOOP ;共转换十六位数RET将A中的二进制数转换为3位的BCD码,其中百位数存放......2010-01-11 09:13请各位懂得帮写下这个程序片段。

将A中的二进制数转换为3位的BCD码。

其中百位数存放到31H中,十位和个位数压缩后,存放到30H中。

悬赏分:80 - 解决时间:2009-10-19 09:59最佳答案:;------------------------------------------看来这个题目是属于MCS-51单片机的。

下面用51单片机的汇编语言来求解。

MOV B, #100DIV ABMOV 31H, A ;存百位数MOV A, #10XCH A, BDIV ABSW AP A ;十位数换到高四位ADD A, B ;加上个位数MOV 30H, A ;保存R0中的8位二进制数转换成3位BCD码-单片机编程2010-01-10 23:18单片机的不难编程题!急!!!!!!将R0中的8位二进制数转换成3位BCD码,结果存入外部RAM的1002H~1000H(从高位到低位)单元中。

例如:地址:R0 执行后:1002H 1001H 1000H数据:81H 01 02 09悬赏分:15 - 解决时间:2009-10-15 19:10提问者:stefine_ - 一级最佳答案:;-------------------------------------------------------呵呵,楼上的程序,使用了DEC DPTR,要知道,51单片机指令系统里面,是没有DEC DPTR 指令的。

按照下面的思路做,还可以再简练些。

R0中的8位二进制数转换成3位BCD码:MOV DPTR, #1000H ;个位的地址MOV A, R0MOV B, #10DIV ABXCH A, BMOVX @DPTR, AINC DPTRMOV A, #10XCH A, BDIV ABXCH A, BMOVX @DPTR, AINC DPTRXCH A, BMOVX @DPTR, ARET仅用了24字节16位二进制转BCD码--单片机2010-01-03 14:19要求:编写一段程序,把计数器中T0中计的数(TH0和TL0)转成8421BCD码。

并且高8位给p1口,低8位给p0口,要是转成BCD码超过16位,则给p2.0高电平。

我是做单片机课设的,这段程序实在编不明白了,向各位大侠请教了!无比感谢中!答对有额外加分啊!!!!悬赏分:200 - 解决时间:2010-1-3 13:03最佳答案:16bit 表示:65536,万位不超6――――――――――――――――――――――――――程序如下:MOV R0, TL0 ;MOV R1, TH0 ;待转换的16bit数分别放入(由高到低)R1R0中;CLR AMOV R2, A ;先清零MOV R3, AMOV R4, AMOV R5, #16 ;共转换16位数LOOP:CLR C ;c=0MOV A, R0 ;从待转换低8bit数的高端移出一位到Cy(转换最先由低8位开始)RLC A ;R0中的最高位移入到A中MOV R0, AMOV A, R1 ;(高8位二进制数)RLC A ;此时C中的由低8位所移入的数重新移入高8位的低端MOV R1, A ;相当于16bit的高端移出了1bit到C中了MOV A, R4 ;送到BCD码的低端ADDC A, R4 ;带进位加。

相关文档
最新文档