打印

谁给一段89C51单片机的汇编语言程序

[复制链接]
1848|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 张栋佳佳 于 2015-10-23 22:25 编辑

我想用单片机通过串口发送一串二进制数(例如:0100101,不是8位也不是16位的数),我只会C语言,但是c语言好像不能发二进制的,求高手指点。


类似这种:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void init_uart(void);
void delay(uint x);  

unsigned char code SHUJU[]={0x82,0x03,0x0a,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x24,0x03,0x39,0x71};


void main()
{

        init_uart();
        while(1)
        {
         
           {
                    SBUF =SHUJU[a];   
                        while(!TI);                  
                        TI=0;        
           }         
          c=356;
          while(c--);
                  
        }         
           
}
void init_uart()
{
                                
        TMOD=0X20;
        TH1=0xfd;        
        TL1=0xfd;
        TR1=1;
        SCON=0X40;               
        PCON=0X80;                        
        
//        ES=1;                                                //打开接收中断
//        EA=1;                                                //打开总中断
                                                    //打开计数器
}

SBUF =SHUJU[a]; 这里要是能写成SBUF=0100101B就好了,当然我不是为了用二进制表示16进制,我想让串口输出单纯二进制,长串的二进制

其实我是想模拟一下这个波形(这个波形用16进制不能表示,也可能是我不会)
MSB=1是地址


2.bmp (248.12 KB )

2.bmp

1.bmp (215.87 KB )

1.bmp

相关帖子

沙发
maychang| | 2015-10-23 20:28 | 只看该作者
“例如:0100101,不是8位也不是16位的数”
汇编也不行。

使用特权

评论回复
板凳
lyjian| | 2015-10-23 21:08 | 只看该作者
不管什么制数,最终串口能发出去的只有纯二进制数

使用特权

评论回复
地板
lyjian| | 2015-10-23 21:09 | 只看该作者
还真能写成“SBUF=0100101B”

使用特权

评论回复
5
张栋佳佳|  楼主 | 2015-10-23 21:19 | 只看该作者
lyjian 发表于 2015-10-23 21:09
还真能写成“SBUF=0100101B”

能吗?  能发出去吗?  请详解一下

使用特权

评论回复
6
DONGXU| | 2015-10-23 22:17 | 只看该作者
编译软件会自动在前边加一个0,把 “0100101B” 编译成”00100101B”“
如果必须发7位,可以编写个模拟串口通讯程序,不要使用硬件串口寄存器

使用特权

评论回复
7
张栋佳佳|  楼主 | 2015-10-23 22:20 | 只看该作者
DONGXU 发表于 2015-10-23 22:17
编译软件会自动在前边加一个0,把 “0100101B” 编译成”00100101B”“
如果必须发7位,可以编写个模拟串口 ...

请赐教啊 大哥 谢谢

使用特权

评论回复
8
DONGXU| | 2015-10-23 22:48 | 只看该作者
; - - - - - - - - - -
; 模拟异步串行输出子程序
; 数据格式1Bit启始位,7Bit数据位,1Bit停止位
; - - - - - -
POUT1U:                ;发送起始位(0)
                        CLR        P_OUT1                ;输出0
                        CALL        SDELAY
                        CALL        SDELAY
;                        发送数据
                        MOV     R5,#7                ;循环次数
POUT1U1:                RRC     A                        ;逻辑右移(先送低位 Bit0 - C)
                        JC      POUT1U2                ;C=1转POUT1X2
                        CLR        P_OUT1                ;输出0
                        JMP        POUT1U3
POUT1U2:                SETB         P_OUT1                ;输出1
POUT1U3:                CALL        SDELAY                        ;发送间隔脉冲
                        CALL        SDELAY
                        DJNZ    R5,POUT1U1                ;循环次数减1,没完转,继续
;                        发送停止位        (1)
                        SETB        P_OUT1                                        ;输出1
                        CALL        SDELAY
                        CALL        SDELAY
                        RET

使用特权

评论回复
9
DONGXU| | 2015-10-23 22:50 | 只看该作者
循环次数就是bit位数,改变延时可改变通讯波特率

使用特权

评论回复
10
张栋佳佳|  楼主 | 2015-10-23 23:49 | 只看该作者
DONGXU 发表于 2015-10-23 22:50
循环次数就是bit位数,改变延时可改变通讯波特率

这个程序能发9位吗?   波特率能达到57600吗?

使用特权

评论回复
11
张栋佳佳|  楼主 | 2015-10-23 23:53 | 只看该作者
DONGXU 发表于 2015-10-23 22:48
; - - - - - - - - - -
; 模拟异步串行输出子程序
; 数据格式1Bit启始位,7Bit数据位,1Bit停止位

有c语言的吗?  

使用特权

评论回复
12
张栋佳佳|  楼主 | 2015-10-23 23:57 | 只看该作者
DONGXU 发表于 2015-10-23 22:50
循环次数就是bit位数,改变延时可改变通讯波特率

另外  您能教一下我单片机串口怎样处理”MSB=1为地址“这种格式
您的回答还是最专业的

使用特权

评论回复
13
nuaabob| | 2015-10-24 18:40 | 只看该作者
不理解楼主的意思,你想发二进制数,那你把需要发送的二进制数转换成十六进制数再发不一样吗?

使用特权

评论回复
14
sysdriver| | 2015-10-24 19:41 | 只看该作者
楼主既然能问出这样的问题。
那么我想, 不管谁,如何解释, 你都不会理解的。
想要理解, 最起码最基本的概念要懂......

使用特权

评论回复
15
DONGXU| | 2015-10-26 22:38 | 只看该作者
能发9位。波特率取决单片运行速度,高速时能达到57600

使用特权

评论回复
16
wujh| | 2015-10-27 00:15 | 只看该作者
TMOD,SCON

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

24

帖子

0

粉丝