求一个51单片机汇编语言 串口输出一行中文的程序

作者&投稿:蒋泊 (若有异议请与网页底部的电邮联系)
51单片机汇编语言写串口程序~

ORG 0000H
SJMP 0050H
ORG 0023H
LJMP S_INT
TAB:DB 20H,49H,20H,47H,45H,54H,20H,'NULL'
ORG 0050H
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1
SETB SM1
CLR SM0
SETB EA
SETB ES
MOV R0,#30H
MOV A,#1H
MAIN:SETB REN
ACALL DELAY
JNZ MAIN
MOV R2,#0
MOV DPTR,#TAB
MOV R7,#7
SEND:MOV A,R2
MOVC A,@A+DPTR
CLR ES
MOV SBUF,A
JNB TI,$
CLR TI
INC R2
DJNZ R7,SEND
MOV R0,#30H
SHOW:MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
CJNE A,#40H,SHOW
SETB ES
MOV A,#1
MOV R0,#30H
SJMP MAIN





S_INT:CLR RI

MOV A,SBUF
MOV @R0,A
CJNE A,#40H,NEXT
MOV A,#0
NEXT:INC R0
RETI
DELAY:MOV 7DH,#200
LOOP1:MOV 7EH,#40
DJNZ 7EH,$
DJNZ 7DH,LOOP1
RET
END
这个是方式一的

这么简单的要求,不用大动干戈。

看看下面的程序,是不是最简单:

ORG 0000H
SETB TR0 ;启动T0
MOV R2, #250 ;定时计数初值
LOOP:
MOV TH0, #(8192 - 8000) / 32 ;定时8ms
MOV TL0, #(8192 - 8000) MOD 32
JNB TF0, $ ;等待8ms
CLR TF0
DJNZ R2, LOOP ;每隔8ms,R2减一次一
CPL P1.0 ;R2为0则LED亮灭转换
LJMP 0000H
END

本程序,已经实验成功。

程序如下,只需要修改MSG中需要发送的中文字符就可以了

ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV SCON,#40H ;设置串行口工作方式1
MOV PCON,#0 ;设置波特率4800
MOV TMOD,#20H ;波特率可根据需要自己修改
MOV TL1,#0FAH
MOV TH1,#0FAH
SETB TR1

MOV DPTR,#MSG ;DPTR指向待输出字符串首地址
NEXT: MOV A,#0
MOVC A,@A+DPTR
CJNE A,'$',NEXT1 ;字符串结尾?
AJMP NEXT2
NEXT1: CLR TI
MOV SBUF,A ;发送
JNB TI,$ ;等待发送完成
INC DPTR ;指向下一字符
AJMP NEXT

NEXT2: SJMP $ ;动态暂停

MSG DB '中华人民共和国' ;定义中文字符串
MSGEND DB '$' ;定义字符串结尾字符,自定义

END

;下载程序以后,联接好串口线
;然后打开串口调试软件,按照您连接的串口,设置好串口特性(注意波特率)
;然后发送数据给下面的机器,并接受下面发送上来的数据!

beep bit p3.7 ;蜂鸣器定义

org 00h
jmp main
org 23h ;串行中断入口地址
jmp com_int ;串行中断服务程序

;*********** 主程序开始 *******************
org 30h
main: mov sp,#30h ;设置堆栈
lcall rest ;初始化
lcall comm ;串口初始化
jmp $ ;原地等待

; ************* 初始化 *********************
rest: mov p0,#00h ;禁止数码管显示
mov p2,#255
clr beep ;禁止蜂鸣器
mov p1,#255 ;禁止LED显示
RET ;返回

; ************** 串口初始化 *****************
;设置串行口工作方式1,定时器1作为波特率发生器
;波特率设置为 2400 ;

comm: mov tmod,#20h ;设置定时器T1工作方式2
mov tl1,#0f4h ;定时器计数初值,波特率 2400
mov th1,#0f4h ;定时器重装值
setb ea ;允许总的中断
setb es ;允许串行中断
mov pcon,#00h ;波特率不倍增
mov scon,#50h ;设置串口工作方式1,REN = 1 允许接收
setb tr1 ;定时器开始工作
ret ;返回
;*************** 串口中断服务程序 ***********
; 如果接收 0FF 表示上位机需要联机信号,单片机发送 0FFH作为
; 应答信号,如果接收到 数字 1~ n,表示相应的功能;
; 这里,如果收到 1 ,则单片机向计算机发送字符 'H';
; 如果收到 2 ,则单片机向计算机发送字符 'e';
; 如果收到其他的数据,则发送 'J';
com_int: clr es ;禁止串行中断
clr ri ;清除接收标志位
mov a,sbuf ;从缓冲区取出数据
mov p1,a
mov dptr,#tab
cjne a,#0ffh,in_1 ;检查数据
mov sbuf,#255 ;收到联机信号,发送联机信号
jnb ti,$ ;等待发送完毕
clr ti ;清除发送标志
setb es ;允许串行中断
reti ;中断返回
in_1: cjne a,#1H, in_2 ;如果收到1
movc a,@a+dptr
mov sbuf,a ;发送 'h'
jnb ti,$ ;等待发送完毕
clr ti ;清除发送中断标志
setb es ;允许串行中断
reti ;中断返回
in_2: cjne a,#2,in_3 ;接收到 2
movc a,@a+dptr
mov sbuf,a ;发送 'e'
jnb ti,$ ;等待发送完毕
clr ti ;清除发送中断
setb es ;允许串行中断
reti ;中断返回
in_3: mov a,#03h
movc a,@a+dptr
mov sbuf,a ;发送 'j'
jnb ti,$ ;等待发送完毕
clr ti ;清除发送中断标志
setb es ;允许串行中断
reti ;返回
tab: db '2','h','e','j'
end

ff


51单片机汇编编程
1:KEY1 EQU P2.2 KEY2 EQU P2.1 KEY3 EQU P2.0 RED EQU P1.4 YELLOW EQU P1.5 GREEN EQU P1.6 ORG 0000H LJMP MAIN ORG 0030H MAIN:SETB RED SETB YELLOW SETB GREEN LP:JB KEY1,LP1 CLR RED SJMP LP LP1:JB KEY2,LP2 CLR YELLOW SJMP LP LP2:JB KEY3,MAIN CLR ...

51单片机的指令是汇编语言吗?
所以人们就想到了一个方法,用一些特定的符号(见名知意)来代替二进制指令。这就是我们所说的汇编语言。比如上面所说的MOV A,#3EH。其实,每条汇编指令,都对应唯一的一个二进制编码。但不同体系的CPU。都有不同的汇编语言。虽是解决了不便于编写程序,难于分析程序的问题,但还是制约了推广,...

51单片机开始要学汇编吗?
我不知道你究竟是问的哪个问题,挨个说一下个人的看法吧!1.学习51单片机不一定要学汇编,用Keil C足够了,不过如果学习了汇编并对51寄存器组比较熟的话,对调试和查找问题会有很大好处的。2.如果你是搞硬件的话,可以尽最大能力学就是了,学到可以自己调试板子,就足够了。当然,如果学的能编一个...

求51单片机译码程序汇编的。
为你解答:参考的汇编程序:A BIT P3.0 B BIT P3.1 C BIT P3.2 Y0 BIT P1.0 Y1 BIT P1.1 Y2 BIT P1.2 Y3 BIT

51单片机入门编程(汇编语言)
LED BIT P1.0ORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN: MOV TMOD,#01H MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB TR0 SETB ET0 SETB EA CLR LED SJMP $T0ISR: CLR TR0 MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW...

C51单片机汇编语言
DEL,DLYRAM是标记号,后面跟有:(冒号)是本汇编行的地址,举个例子:SJMP 这一句,就相当于 Loop:AJMP Loop

51单片机用汇编语言如何设计8个轮流呼吸的呼吸灯?
因为我不知道你这个板子的硬件,我就假设一下吧,你自己对照着看看,关键是流程 假设如下这八个灯依次接在P0口的八个口上,高电平为灯亮,低电平为灯灭,程序如下 ORG 0000H AJMP START START:MOV P0,#01H;()只有第一个灯亮 ACALL DELAY;延迟,不加延迟的话 你根本看不起清到底那个灯亮的 ...

51单片机汇编程序???
或如不固定字节数,采用与上位机软件一致的协议--每次先传送起始触发数据(如55h 66h 77h)后,才认定以后数据为有效数据(否则为干扰),接收第一个数据为数据包字节数n,然后再开始接收n字节数据,存入内部RAM。不过这样程序会复杂的多。如果有这样的需求,请再说明交流。

51单片机16位流水灯汇编程序
org 0 jmp ww org 30h ww: mov a,#07fh call ys j1: mov p1,a call ys rr a cjne a,#07fh,j1 mov p1,#0ffh j2: mov p2,a call ys rr a cjne a,#07fh,j2 mov p2,#0ffh jmp ww ys: mov r7,#255 y1: mov r6,#255 djnz r6,djnz r7,...

51单片机中汇编CJNE A,#10,$+3后面$+3是什么意思
CJNE A, #10,$+3 是比较指令,$+3是目的地。$+3是指当前指令地址的下面第三字节。因为指令:CJNE A,#10,$+3 只有3字节,所以$+3就是该指令的下一条指令。本指令用A-10,不存结果,只是设置了标志位。下一条指令应该根据标志位进行转移。

诸城市19388392001: 求一个51单片机汇编语言 串口输出一行中文的程序 -
宏乐萘普: 程序如下,只需要修改MSG中需要发送的中文字符就可以了 ORG 0000H AJMP MAIN ORG 0100H MAIN: MOV SCON,#40H ;设置串行口工作方式1 MOV PCON,#0 ;设置波特率4800 MOV TMOD,#20H ;波特率可根据需要自己修改 MOV TL1,...

诸城市19388392001: 单片机 汇编程序 串口通信 -
宏乐萘普: ;51 单片机的汇编语言程序: ORG 0000H JMP START ORG 0023H JB TI, S0_END CLR RI MOV A, 34H MOV 34H, SBUF MOV R0, #33H S0_L: XCH A, @R0 DEC R0 CJNE R0, #2FH, S0_L SETB F0 S0_END: RETI START: MOV SCON, #50H ...

诸城市19388392001: 我想我想编一个51单片机程序, 通过串口给单片机发送几个字在12864液晶上面显示,想了好久也没想出来 -
宏乐萘普: 程序能否给我发一下,最近在搞这个,有成效的话就给你答复 期望有大神可以解答,ningling_21也算是一位高手了

诸城市19388392001: 求51单片机串口发送数据程序 -
宏乐萘普: 你可以把数据以一个数据包的形式发送出去,比如说0x1111,那你可以把这个16位的定义为字符的形式,放在数组里面,最后把数组名(也就是首地址),把数据发送出去,这样的话就不会存在数据溢出的问题了

诸城市19388392001: 51单片机串口通信(汇编) -
宏乐萘普: HERE: AJMP HERE SINT: MOV P1,R0 JB RI,RECV JB TI,SEND AJMP HERE 中断里面直接用这种方式直接跳到主程序,我以前还是真没试过,不过估计能行吧. 我一直用RETI 返回堆栈地址位置的.但下面这地方肯定有错的,就是执行MOV ...

诸城市19388392001: 求个51单片机向PC串口发送数据的程序 最好来个电路图 只要发送 -
宏乐萘普: 发送之后要判断TR位是否置1,置1了才表示发送完成,然后用软件置0,否则只收到一次.MOV SBUF,A;将遥控器键值通过串口发送出去 JB TR,$ CLR TR SETB EA 允许中断

诸城市19388392001: 怎么编程让51单片机并行接口输出数据 -
宏乐萘普: 51单片机并行输出数据有几种方法来实现.1、每一个P口(P0,P1,P2,P3)可以直接输出并行数据,例如: MOV P0,#55H MOV P1,#0AAH MOV P2,#0FEH MOV P3,#02H2、利用P0口扩展并行口,这类芯片有244/245/373/573等等,编程需要...

诸城市19388392001: 51简单的串口通信程序 -
宏乐萘普: 好好看 SBUF就可以了 在汇编里面是 mov sbuf,a 就可以了.. 串口程序比较简单,还是自己动手好. 而且初学者也能学到很多东西 ...

诸城市19388392001: 求个 51单片机 串口 - 向 PC 发信息程序 -
宏乐萘普: //一直发送的#include "reg52.h"#define u8 unsigned char#define u16 unsinged int sbit P34=P3^4; sbit P35=P3^5; void send(u8 a)//向PC发送1字节 { SBUF=a; while(!TI); TI=0; } void usart_out(u8 *a)//向PC发送1串字符 { while(*a!=0) { send(*a); ...

诸城市19388392001: AT系列的51单片机用串口怎么烧写程序 -
宏乐萘普: AT系列的不像STC那样用串口把程序写入,如果是AT89S51、AT89S52这样的芯片,使用USB下载线USBASP和软件progisp,对于AT89C51、C52这样的芯片就不用考虑了,只能使用编程器.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网