⑴ 51单片机串口通信的过程
单片机要用串口通信,用中断是最好不过的了,因为单片机的内部运行速度非常快(相对串口来说的),发送后需要等好久,这段时间你可以安排它做别的事,当然你可以不用中断,那就是由软件来模拟串口进行,但这样程序设计就更麻烦,单片机也不能做别的事了!
⑵ 51单片机与PC机之间的硬件如何串口连接
单片机和微机通信的电气标准要一致,微机串口一般是RS232电气标准,所以要加电平转换芯片,大多用MAX232,一般单片机实验板上都提供这样的标准串口。
要分别编写上位机和下位机软件程序,单片机程序参照例程、教科书进行编写;上位机微机可采用VB,组态软件,Labview等软件编写,一般若是简单的通信,上位机程序编写很简单,例如VB中学会使用mscomm控件,有VB最基础知识的一天就能学会。
大可以没有单片机,没有MAX232,没有串行接口这些硬件就可以实现学习并掌握单片机与微机之间的串口通信。proteus可以仿真单片机,也是主流软件。
如今的笔记本电脑几乎都没有保留串口,而用USB接口取而代之,不过没关系,有了虚拟串口和串口调试助手,这些都解决了。你可以搜索一下虚拟串口,真的很不错的。
⑶ 51单片机与PC串口通信程序,求指导 ! 具体要求如下:
功能如下:
1、程序烧进去,串口接收显示一个菜单!《如图》A、B、……分别代表一定的功能
例如:A项,代表修改ds1302的时间的数组
2、按照菜单的提示,如:发送A就进入了修改ds1302的时间函数,串口接收界面显
示 A,像图片那种,并显示修改ds1302的操作方法,如从串口发送界面发送
0162115347就表示10年10月16日21时15分34秒星期7,
3、正如第二所说,马上输入1010162115347,就成功的修改了ds1302相关数据,
并返回change success!到串口界面!
4、设置一个功能就是返回主菜单界面。然后又可以就行第二、三步的操作!
5、通过串口,读取单片机里面相关的数据,如时钟的数据
6、说明:可以不要ds1320相关的程序,可以用发光二极管亮来代表修改功能!
⑷ 51单片机串口的原理和过程
单片机C51串口中断接收和发送测试例程(含通信协议的实现)
通信协议:第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。
测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
//程序编写: 龚建伟 [email protected]
//技术主页:http://www.gjwtech.com
//您有这方面的问题可以和我讨论
#include <reg51.h>
#include <string.h>
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag=0;
void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //Baud:4800 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;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char *str,unsigned int strlen)
{
unsigned int k=0;
do
{
send_char_com(*(str + k));
k++;
} while(k < strlen);
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if(RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum= ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if( (count3==(INBUF_LEN-1)) && (!checksum) )
{
read_flag=1; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}
main()
{
init_serialcomm(); //初始化串口
while(1)
{
if(read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0; //取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}
}
}
⑸ 51单片机在什么情况下会产生串口中断
首先,你要用软件允许中断,即
C语言中
EA = 1; //允许总中断
ES = 1; //允许串口中断
汇编中可用
SETB EA ;允许总中断
SETB ES ;允许串口中断
当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。当然,单片机发送完一帧数据,TI也会置1,同样会产生中断!
一般我们在发送数据时要关中断,因为一般你不用在发送时不用处理数据;接收数据时要开中断,以便你在中断服务程序中将接收到的数据进行存储并处理。
补充:其实,不管你有没有允许中断,上位机(此时即给单片机发送信息的机器)只要给单片机发送数据,单片机就会自动接收数据,并把它放在数据缓冲器SBUF中,如果你之前有允许串行口中断,RI就会置1,向单片机CPU申请中断,并进入中断服务程序,即你问题中的serial()函数,做完这个函数后就会自动返回断点。如果你没有允许中断,便不会产生串行中断。
其实,你的问题有个错误:别的中断都是某个I/O口电平变化产生。这只是外部中断产生条件,不过,你之前也需要用软件允许外部中断。另外,常见的51系列单片机有5个中断源三种中断5:1、外部中断0和1;2、定时器/计数器溢出中断0和1;3、串行口中断。另外,STC51系列还有定时器/计数器T2中断,A/D转换中断,PWM中断,串行中断2等等。你还有什么不懂的可以自己多翻一翻书,学到后面去了你就明白了。
你的问题中那个serial()函数中 P1=SBUF; 是把接收的数据送到并行P1口,然后那条 RI=0;是不可少的,这是用软件清零RI,准备再次接受一帧数据产生中断,如果你没有这条语句,就会进入死循环,出不来了。
有什么问题还可以Q我(1445090023),希望能给我评个最佳答案。
⑹ 51单片机串口初始化步骤,首先初始化那个在初始化那个,最好是华为等大公司的初始化模版
首先确定定时器1为自动重装模式,并根据想要得到的波特率设置TH1和TL1的初值。
再确定串口的工作方式。一般发送使用查询,接收使用中断功能发送。当然如果开启了串口的中断功能,还得开启总中断功能。下面是一个11.0592MHz晶振下的例子:
#include "reg51.h"
void initUart(void)
{
TMOD|=0x20;// 初始化定时器1为8位自动重装模式
SCON=0x50;// 配置串口工作模式,使能了串口接收中断
TH1=0xfd;// 配置波特率
TL1=0xfd;
TR1=1;// 启动定时器1
ES=1;// 打开串口中断允许
}
void uart(void) interrupt 4
{
if(RI)//可以在这里添加接收中断的语句
{
RI=0;
}
else
TI=0;
}
void main(void)
{
initUart();
EA=1;
while(1){;}
}
⑺ 普中 51单片机 串口通讯
你的程序不对。查询和中断法只可用其一。你的程序运行的结果是:收到数据,中断抢在主程序之前响应,但你没写中断程序。这样程序就会跑飞。 正确的做法是:查询法就把ES中断关掉,别让中断响应。中断法就是主程序什么也别做,把工作放到中断程序中。
⑻ 51单片机与计算机串口通信无法读出数据
答:
1 判断你的硬件有没有问题;方法是 用跳线讲串口的pin2 和pin3短接,用串口调试助手发送数据看调试助手能不 能自己收到,能就说明是单片机程序有问题
2 你检查你的波特率是生成程序是否正确, 中断和主程序用 1楼给你程序,我看了 没问题。
这样就可以实现串口通信了
⑼ 51单片机 串口
假设你对单片机的串口已进行了正确的配置(像什么波特率啊,中断程序啊,终端使能啊等等),那么这种现象可能有以下几种情况(但是不一定全啦):
(1)你的单片机程序的串口中断程序有问题,是否及时清除了标志位?
(2)还是你单片机程序的问题,可以借助于仿真器通过设断点的方式来追踪程序的执行情况。
(3)你的上位机程序的问题,这种情况可以用另一个单片机向其发送数据来测试。
(4)上位机发送数据的每两个字节之间的时间间隔是否太短,因为51毕竟很慢嘛
关于如何让单片机能正常接收,我就不列出代码了,因为可以参考的实在太多了,基本上是这样一个思路:
(1)初始化串口,只要是波特率、数据长度、校验位等的配置
(2)使能接收中断
(3)中断服务程序响应接收中断,切记中断程序中要清除中断标志位,否则第二个字节就接收不到了;并且程序的占用时间不能太长,否则有可能会漏掉部分数据。