第一:
--应该先设置方式,之后再 REN = 1。
--其原因不难理解。
第二:为什么我发送10,单片机发送给我的是“你好1”,而不是“你好10”,发送20,只能接受到2.。。。
--每当单片机收到一字节,你就关闭了串口中断,而进行发送《你好1》。
--1 后面的 0,因为你关闭中断,耽误了接收,遗失了。
--收一次X,就发送《你好X》,时间上,显然,也难以配合。
--你的这种编程思路,把《全双工》的串口,弄成了《半双工》。
参考一下:
http://hi.baidu.com/do_sermon/item/bfe96e2a46eafc13097508ee
51单片机串口通信程序
程序不正确,你这个程序的结果,应该是电脑上发一次''1",后永远 SBUF=='1' ,所有在重复
亮 与 灭,因为时间很快,人眼睛反应不过来,所以 一直是 亮 的,
简单的 你 可以改变 一种方式 试试, 发''1" 亮, 发''0" 灭,
去掉 if(cont==0),if(cont==1) 等等。
51单片机串行通信
串行通信分为查询方式和中断方式;
TI和RI分别是8位串行口控制寄存器SCON的第1位和第0位;
1.TI:发送中断标志位。在方式0中,发送完8位数据后,由硬件置位;在其它方式中,在发送停止位之初由硬件置位。因此,TI=1是发送完一帧数据的标志,其状态可供软件查询使用,也可请求中断。但是TI位必须由软件清零。
2.RI:接收中断标志位。在方式0中,接收完8位数据后,由硬件置位;在其它方式中,在接收到停止位时由硬件置位。因此,RI=1是接收完一帧数据的标志,其状态可供软件查询使用,也可请求中断。但是RI位必须由软件清零。
======================================================================
查询方式:主要是通过while(!TI);语句来查询发送是否完毕。没有发送完毕时,TI=0,while(!TI)语句为真,单片机继续查询;直到发送完毕,TI由硬件置位,这时while(!TI)语句为假,跳出该语句,然后必须写入TI=0来软件清零。
同样RI也是由while(!RI);语句来查询是否接收完毕,原理同TI,不再赘述。
======================================================================
中断方式:首先开中断,串行口发送时,当TI置位(发送完一帧数据后)后向CPU申请中断,在中断服务程序中要用软件把TI清零,也就是写入TI=0语句,以便发送下一帧数据;串行口接收数据时,当RI置位(接收完一帧数据后)后向CPU申请中断,在中断服务程序中要用软件把RI清零。
51单片机与PC串口通信程序,求指导 ! 具体要求如下:
要求用什么语言?
------------------------------
网友“星心晨梦”的回答,是可以满足题目要求的。
我实验了,是成功的,没有任何错误。
楼主应该检查自己的电路、串口设置等等。
------------------------------
网友“星心晨梦”的回答,篇幅稍稍长了一些。
缩减一半就可以正常工作了,可读性更好一些。
建议看看下面的。
------------------------------
#include <AT89X51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//---------------------------------------------------
uchar idata trdata1[] = {
'W','E','L','C','O','M','E',' ','T','O',' ','C','H','I','N','A','!',0x0d,0x0a,0x00};
uchar idata trdata2[] = {
'M','Y',' ','N','A','M','E',' ','I','S',' ','L','I','M','I','N','G',0x0d,0x0a,0x00};
uchar idata trdata3[] = {
'Y','I','N','G','Y','O','N','G','K','E','X','U','E','X','U','E','Y','U','A','N',0x0d,0x0a,0x00};
uchar RxBuf[5], Rx_p, Rx_i, TX_p, Tx_i;
//---------------------------------------------------
void UART_Init(void) //串口初始化
{
PCON = 0x00;
SCON = 0x50; //串口工作方式为1,允许接收.
TMOD = 0x20; // T1 定时方式2
TH1 = 0xfd; //波特率 9600bps @ fosc = 11.0592MHz
TL1 = 0xfd;
TR1 = 1; //启动T1
ES = 1; //开串口中断.
EA = 1; //开总中断.
}
//---------------------------------------------------
void main()
{
UART_Init();
Rx_p = 0;
Rx_p = 2;
while(1) {
if (Rx_p != 0) {
TX_p = Rx_p;//字符串1 2 3
Tx_i = 0; //字符指针.
Rx_p = 0; //清零.
Rx_i = 0;
TI = 1; //启动发送中断.
} }
}
//---------------------------------------------------
void Uart_INT(void) interrupt 4 //串口中断函数
{
uchar Tcv = 0;
if(RI) { //接收?.
RI = 0; //标志位清零.
RxBuf[Rx_i] = SBUF;
if((RxBuf[Rx_i - 1] == 'g') && (RxBuf[Rx_i] == 'o')) Rx_p = 1;
if((RxBuf[Rx_i - 2] == 'w') && (RxBuf[Rx_i - 1] == 'h') && (RxBuf[Rx_i] == 'o')) Rx_p = 2;
if((RxBuf[Rx_i - 3] == 'h') && (RxBuf[Rx_i - 2] == 'o') && (RxBuf[Rx_i - 1] == 'm') && (RxBuf[Rx_i] == 'e')) Rx_p = 3;
P1 = Rx_p; //在P1显示收到的信息.
Rx_i++;
Rx_i %= 5;
}
else {
TI = 0;
if (TX_p == 1) Tcv = trdata1[Tx_i]; //取来待发字符.
if (TX_p == 2) Tcv = trdata2[Tx_i];
if (TX_p == 3) Tcv = trdata3[Tx_i];
if (Tcv != 0) {SBUF = Tcv; Tx_i++;} //不是0就发送.
}
}
//---------------------------------------------------
一道51单片机的C语言程序,关于串口通讯的,很简单......
#include<reg52.h> //头文件,c语言一样
#define uchar unsigned char //定义unsigned char为uchar
#define uint unsigned int
unsigned char flag,a,i; //定义unsigned char变量,其实这里用uchar也行
uchar code table[]="I receive, thanks "; //定义一个数组,存放到rom中,因为有code
void init()
{
} //设置工作方式,这个懂。
void main()
{
init(); //调用初始化函数
while(1) //while(1)循环,就是一直在这里面循环,一直接收
{
if(flag==1) //等待标志位也就是要等待接收中断执行之后,标志位置1,就是执行接收中断后,flag为1
{
ES=0; //关掉中断
for(i=0;i<18;i++) //for循环,依次取出数据发送(你写错了,是8)
{
SBUF=table[i]; //将你取出的一个uchar型数据送给SBUF
while(!TI); //等待发送完成,当发送完成后TI为1
TI=0; //发送中断清零,智能软件清零如果不清0会一直中断,出错的会
}
SBUF=a; //然后再发个a
while(!TI); //同上
TI=0;
ES=1; //置位中断标志位
flag=0; //清除标志位
}
}
}
void serial() interrupt 4 //中断,注意是interrupt 4
{
RI=0; //当发生中断清楚接收中断标志RI,也就是置0,它只能软件清零,一定要注意,只要你发送或者接收到后,RI和TI都会置位,必须软件清0
a=SBUF; //从SBUF中取出数据
flag=1; //标志位置1
}
呵呵,好了,慢慢来吧,单片机还是挺重要的~~~
记得给分啊~~~
(*^__^*) 嘻嘻……
51单片机串口通信
#include <reg51.h>
#include <string.h>
unsigned char ch;
bit read_flag= 0 ;
void init_serialcom( void ) //串口通信初始设定
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD |= 0x20 ; //定时器1为模式2,8位自动重装
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0);
TI= 0 ;
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0 ;
ch=SBUF;
read_flag= 1 ; //就置位取数标志
}
}
main()
{
init_serialcom(); //初始化串口
while ( 1 )
{
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag= 0 ; //取数标志清0
send_char_com(ch);
}
}
}
51简单的串口通信程序
好好看 SBUF就可以了 在汇编里面是 mov sbuf,a 就可以了.. 串口程序比较简单,还是自己动手好。 而且初学者也能学到很多东西 ...
请问51单片机与51单片机之间的串口通信程序怎么写?
1、查询方式:
#include<reg51.h>
main()
{
unsigned char dat;
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
while(1)
{
if(RI)//接收
{
RI=0;
dat=SBUF;
}
SBUF=dat;//发送
while(!TI);
TI=0;
}
}
2、中断方式:
#include<reg51.h>
unsigned char dat;
bit flag;
void uart_isr() interrupt 4
{
if(RI)//接收
{
RI=0;
dat=SBUF;
flag=1;
}
if(TI)TI=0;
}
main()
{
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
EA=1;
ES=1;
flag=0;
while(1)
{
if(flag)
{
SBUF=dat;
flag=0;
}
}
}
转载请注明出处51数据库 » 51串口通信软件 51串口通信程序求大神