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

[复制链接]
 楼主| 张栋佳佳 发表于 2015-10-23 20:11 | 显示全部楼层 |阅读模式
本帖最后由 张栋佳佳 于 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是地址


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
maychang 发表于 2015-10-23 20:28 | 显示全部楼层
“例如:0100101,不是8位也不是16位的数”
汇编也不行。
lyjian 发表于 2015-10-23 21:08 | 显示全部楼层
不管什么制数,最终串口能发出去的只有纯二进制数
lyjian 发表于 2015-10-23 21:09 | 显示全部楼层
还真能写成“SBUF=0100101B”
 楼主| 张栋佳佳 发表于 2015-10-23 21:19 | 显示全部楼层
lyjian 发表于 2015-10-23 21:09
还真能写成“SBUF=0100101B”

能吗?  能发出去吗?  请详解一下
DONGXU 发表于 2015-10-23 22:17 | 显示全部楼层
编译软件会自动在前边加一个0,把 “0100101B” 编译成”00100101B”“
如果必须发7位,可以编写个模拟串口通讯程序,不要使用硬件串口寄存器
 楼主| 张栋佳佳 发表于 2015-10-23 22:20 | 显示全部楼层
DONGXU 发表于 2015-10-23 22:17
编译软件会自动在前边加一个0,把 “0100101B” 编译成”00100101B”“
如果必须发7位,可以编写个模拟串口 ...

请赐教啊 大哥 谢谢
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
DONGXU 发表于 2015-10-23 22:50 | 显示全部楼层
循环次数就是bit位数,改变延时可改变通讯波特率
 楼主| 张栋佳佳 发表于 2015-10-23 23:49 | 显示全部楼层
DONGXU 发表于 2015-10-23 22:50
循环次数就是bit位数,改变延时可改变通讯波特率

这个程序能发9位吗?   波特率能达到57600吗?
 楼主| 张栋佳佳 发表于 2015-10-23 23:53 | 显示全部楼层
DONGXU 发表于 2015-10-23 22:48
; - - - - - - - - - -
; 模拟异步串行输出子程序
; 数据格式1Bit启始位,7Bit数据位,1Bit停止位

有c语言的吗?  
 楼主| 张栋佳佳 发表于 2015-10-23 23:57 | 显示全部楼层
DONGXU 发表于 2015-10-23 22:50
循环次数就是bit位数,改变延时可改变通讯波特率

另外  您能教一下我单片机串口怎样处理”MSB=1为地址“这种格式
您的回答还是最专业的
nuaabob 发表于 2015-10-24 18:40 | 显示全部楼层
不理解楼主的意思,你想发二进制数,那你把需要发送的二进制数转换成十六进制数再发不一样吗?
sysdriver 发表于 2015-10-24 19:41 | 显示全部楼层
楼主既然能问出这样的问题。
那么我想, 不管谁,如何解释, 你都不会理解的。
想要理解, 最起码最基本的概念要懂......
DONGXU 发表于 2015-10-26 22:38 | 显示全部楼层
能发9位。波特率取决单片运行速度,高速时能达到57600
wujh 发表于 2015-10-27 00:15 | 显示全部楼层
TMOD,SCON
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

24

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部