单片机串行口发送多位数据程序

求一单片机c程序:要求是把A单片机中的两个八位二进制数发送到B单片机中。因为单片机的串口一帧只发八位,我主要是不知道怎么连续传送两个数据,还要用B机来显示,不过我不需要现实的程序,只要成功发送到B得程序就好。。。谢谢啦。。。
题目应该是发送多个数据吧,呵呵

想要发送多次,来传送一个数据,就必须自己制定协议。
一个简单的方法是:
把“两个八位二进制数”先拆成“四个四位二进制数”,分成四次进行传送。
每次传送,用低四位来表示“一个四位二进制数”,用高四位来表示“第几个”。

接收方再根据高四位的信息,把低四位拼凑成“两个八位二进制数”。

这种方法,最大可以传送64位数的数据,即一个“八个八位二进制数”。追问

恩,理解一点不过我对c程序运用还不熟,可以传段程序看看吗?

追答

c程序运用还不熟,那就用汇编吧。
汇编特简单。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-25
传个程序给你参考吧
//这个是AVR单片机的,
void Putchar(char c) //串口0发送字符
{
while(!(UCSR1A&(1<< UDRE1))); //
UDR1=c;
}
//******51单片机
void Putchar(char c) //串口0发送字符
{
ES=0;//如果开了中断的话,要先关闭中断
SBUF=c;
while(!TI);//
TI=0;
ES=1;//如果开了中断的话,恢复中断

}
void Putstring(unsigned char *p,unsinged int n){
while(n--){
Putchar(*p);
}
}

void main(void){
unsigned char table[5];
...
.while(1){
...//其他程序
Putstring(table,2);//发送2个字节
...
}

}
接收程序的话,最好使用中断,并且有一定的协议,比如首字节就是发送数据的个数
这样的话,接收了多少个以后,就做一个标记位,表示接收完毕,
下面这个程序是指每次发送的数据时固定个数的9个,并且以0x0d作为第一个字符的AVR接收程序
SIGNAL(SIG_UART1_RECV)
{
unsigned char Recdata;
Recdata=UDR1;
if(Recdata==0x0d)RecCnt=0;
UART_RxBuf[RecCnt++]=Recdata;
if(RecCnt>=0x09){
UartRec_f=1;
RecCnt=0;
DIS_UART1();

}
}

不要协议的话,也可以 通过延时的方法来实现,比如延时多长时间没有收到数据,就表示接收完毕
第2个回答  2011-06-25
从你出现的问题看,你应该是发的0,1,2,3……255的数,而不是它们对应的ASCII的值。比如你要发送在串口调试工具中显示0,应该发送0的ASCII值;假设你的串口发送一字节的函数为:sendbyte(unsigned char n);
则发送函数可以这样写:
void send(void)
{
unsigned char i;
for (i=0;i<256;i++)
{
sendbyte(n/100+'0');
sendbyte(n%100/10+'0');
sendbyte(n%100%10+'0');
}
}
去掉16进制显示,就能看到0-255的显示了

51单片机串行口发送数据到上位机(1)
在软件层,单片机的串行口通常按照异步串行通信模式工作。发送数据时,需先发送起始位(低电平),接着发送8位数据,之后发送奇偶校验位,最后发送停止位(高电平)。例如,发送数据“10101001”时,实际发送的数据为“1 10101001 0”。收发双方需要设置相同的波特率。在实现单片机与外部设备的通信时,单片机...

用51单片机串行通信传输数据,每秒传输一个十六位数据,定时器和波特率怎 ...
REN = 1; \/\/串口允许接收数据 ES = 1; \/\/开串中断 EA = 1;}

设计一个发送程序,将1∼100顺序从串行口输出
void main()\/\/主程序功能:实现接收数据并把接收到的数据原样发送回去\/\/\/ { Init_Com();\/\/串口初始化 \/\/ P1=0xf0;while(1){ if ( RI ) \/\/扫描判断是否接收到数据,{ dat = SBUF;\/\/接收数据SBUF赋与dat RI=0;\/\/RI清零。SBUF = dat;\/\/在原样把数据发送回去 } LED(); \/\/显示接收到...

单片机串行口如何输出数字依次加一
1、需要选定一个合适的定时器,例如定时器0,配置定时器的计数方式和计数频率。2、编写中断服务函数,在每次定时器计数完成时进行调用。在中断服务函数中,对数字进行逐渐增加的操作。3、启用定时器中断,并通过主程序调用相关的初始化函数,即可实现数字逐渐增加的功能。

51串口通信问题,由串口助手发送十个字节,单片机接收十个字节,显示无法...
【1】主程序中 LED0=0;改成:LED0=!LED0;【2】用断点调试。在中断服务中 “RX_BUF[RXend++]=SBUF; \/\/保存数据”这一句后面增加两行。if(RXend==10);(并在此行设断点,检查一下缓冲RX_BUF内容。)

简述c51单片机串行口数据发送和数据接收过程
串行口初始化编程格式:SIO: MOV TMOD,#20H ;T1作波特率发生器 MOV TH1,#X ;定时初值选定波特率 MOV TL1,#X MOV PCON,#00H ;SMOD=0,就是波特率不增倍CLR TI ;清除发送中断标志SETB TR1 ;打开定时器1 2、发送程序 查询方式: TRAM: MOV A,@R0 ;取数据 MOV SBUF,A ;发送一个字符 WAI...

单片机中串行口通信,用按键控制两个单片机实现数码管数值转换?
2. 初始化:在两个单片机的程序中分别初始化USART模块,包括波特率、数据位、停止位等参数的设置。3. 开始通信:首先,通过按键控制其中一台单片机,让其向另一台单片机发送需要转换的数值。然后,另一台单片机接收到这个数值,并进行转换操作。4. 响应通信:转换完成后,另一台单片机将转换后的结果通过...

单片机串口发送数据包的问题
我来回答你的问题:1。串口,即串行通迅(异步心通迅)本来就是一位一位的将数据串行发出,所以你的数据(10字节)肯定是一位一位的发,发完第一字--》第二字节--》。。。第10字节。注意发送某一字节时不能停顿,当然串口会自动完成,不需要人工干扰;发完一个字节后中途肯定是可以停顿的,否则...

(单片机)异步串行口中,fosc=12MHz,每分钟传输12000字节,求波特率...
12000 \/60=200字节有效数据 200*(数据位8+控制校验位1~3.5) =1800~2300 bps 所以波特率只要大于2300 才可以满足数据量哦 由于电脑串口波特率为固定的取值 115200,57600,56000,38400,19200,14400,9600,4800,2400,1200,600,300,110 所以 可以选择 115200,57600,56000,38400,19200,14400,9600,...

单片机串行口接收和发送数据的过程是怎样的
就是配置好波特率中断这些相关寄存器,然后读取发送接收标志

相似回答