1. 如何进行单片机与PC机的串口数据读取通信
首先硬件要有MAX232芯片做电平转换 或者直接用pl2303做usb转串口.
软件要有一个串口调试工具.
至于程序就是 (1):设置串口相关寄存器 注意波特率设置
(2):把数据放在sbuf里面
(3):检查是否发送完毕没完等待 发完了就继续放
各种单片机设置方法不一样就给你一个51 的程序你参考一下:
//wx原创 串口调试程序 向pc发送数据 用于调试观察数据
#include<reg52.h>
#include<hdy.h>
sbit k1=p10;
void ckfszf(char zf);
void ckfszfc(char fsgs,char zfc[]);
bit cksnbzw=0;
char fsb[]={"abcdef"};
main()
{
PCON=0x80; //串口设置
TMOD=0x20; // 以T1定时器为波特发生器 波特率:19200
TH1=0xfD;
TL1=0xfD;
TR1=1;
SCON=0X50; //串口设置模式一完毕
while(1)
{
TI=1;
ckfszfc(6,fsb);
ckfszf(' ');
ckfszfc(9,"1234567890");
ckfszf(' ');
ckfszf(' ');
ckfszf(' ');
ckfszfc(12,"AABBCCDDEEFFGG");
ckfszf(' ');
while(1);
}
}
//字符 串口发送函数 由串口向外发送一个字符
//参数1:要发送字符
//返回值:无
//备注: 本函数内部检查上次发送是否结束
// 全局初始化要求:TI=1 保证第一次进入此函数之前TI=1
void ckfszf(char zf)
{
while(TI==0); //等待发送完毕
TI=0;
SBUF=zf;
}
//字符串 串口发送函数 由串口向外发送一个字符串
//参数1:要发送字符串个数 取值:0~255
//参数2:要发送字符串数组名 或字符串本身
//返回值:无
//备注: 本函数内部检查上次发送是否结束
// 全局初始化要求:TI=1 保证第一次进入此函数之前TI=1
void ckfszfc(uchar fsgs,char zfc[])
{
uchar i;
cksnbzw=1;
for(i=0;i<fsgs;i++)
{
ckfszf(zfc[i]);
}
}
纯手打 原创程序 给分!
2. 单片机的串口,怎样与电脑串口连接
一般单片机由于供电的原因,通常都是TTL的UART电平讯号,需要经过转换IC来提升电平(RS-232),电脑通常都是RS-232的讯号,因此直接把转换后的RS-232跟电脑的RS-232来对接就可以了,对接的意思是说电脑的TX(发射)要接到单片机的RX(接收),电脑的RX(接收)要接到单片机的TX(发射),然后把两个GND(地)接一起就可以了
3. PC与单片机通过串口通讯,其中SBUF是串口的缓存区么,怎么实现
/*打开串口调试程序,将波特率设置为9600,无奇偶校验
晶振11.0592MHz,发送和接收使用的格式相同,如都使用
字符型格式,在发送框输入
hello,I
Love
MCU
,在接
收框中同样可以看到相同字符,说明设置和通信正确
*/
#include
<REG52.H>
/*主程序*/
void
main
(void)
{
SCON
=
0x50;
/*
SCON:
模式
1,
8-bit
UART,
使能接收
*/
TMOD
|=
0x20;
/*
TMOD:
timer
1,
mode
2,
8-bit
reload
*/
TH1
=
0xFD;
/*
TH1:
reload
value
for
9600
baud
@
11.0592MHz
*/
TR1
=
1;
/*
TR1:
timer
1
run
*/
EA
=
1;
/*打开总中断*/
ES
=
1;
/*打开串口中断*/
while
(1)
/*主循环不做任何动作*/
{
}
}
void
UART_SER
(void)
interrupt
4
//串行中断服务程序
{
unsigned
char
Temp;
//定义临时变量
if(RI)
//判断是接收中断产生
{
RI=0;
//标志位清零
Temp=SBUF;
//读入缓冲区的值
P1=Temp;
//把值输出到P1口,用于观察
SBUF=Temp;
//把接收到的值再发回电脑端
}
if(TI)
//如果是发送标志位,清零
TI=0;
}
这是我用的程序,自己可以看看,网上这方面资料很多,自己试试就会了!
4. 单片机与pc机串口通信完整代码
#include"reg51.h"
unsigned int rt=0,tt=0,dema,temp;
unsigned int re_buf[3]={0};初值
unsigned char send_buf[4]={'O','K','O','K'};//返回
unsigned char code leds_a[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9共阳极
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3; //数码管选位
bit L11;
void rs232_S(void);//串口初始化
void disp(void);//数码管显示
void main(void)
{
rs232_S();
while(1)
{
disp();
if(L11)
{
tt=0;
TI=1;//直接触发中断
L11=0;
}
}
}
void rs232_S(void)
{
TMOD=0X21;//T0用于定时作延时用 方式1
TH1=0XE6;
TL1=0XE6;//波特率2400
TH0=0Xf8;
TL0=0X30; //晶振12M初值2mS
TR0=1;
ET0=1;
SCON=0X50;
PCON=0X80;//smod加倍
TI=0;
RI=0;
L11=0;
ET1=1;
TR1=1;
ES=1;
EA=1;
}
void RS232(void) interrupt 4
{
if(RI)
{
RI=0;
rt++;
if(rt<5)
{
re_buf[rt-1]=SBUF;
if(rt>=4)
{
L11=1;
rt=0;
}
}
}
else if(TI)
{
TI=0;
if(tt<4)
{
SBUF=send_buf[tt];
tt++;
}
}
}
void timer0(void) interrupt 1 //中断进程
{
TR0=0;
TH0=0Xf8;
TL0=0X30; //重装初值
TR0=1;
if(dema)
{
dema--; //2mS延时,延时采用定时中断初值2mS
}
}
void disp(void)
{
P23=0;
temp=re_buf[3];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3; //延时6mS
while(dema!=0);
P23=1;
P22=0;
temp=re_buf[2];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P22=1;
P21=0;
temp=re_buf[1];
temp=temp&0x0f;
P0=leds_a[temp]; //串口发送10进制数 通过转换二进制 保留低4位形成10进制数 选择0-9
dema=3;
while(dema!=0);
P21=1;
P20=0;
temp=re_buf[0];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P20=1;
}
用串口调试助手发送0000-9999四位数(十进制),单片机接收显示在4位数码管上并返回OKOK
这是我刚调试完成的,希望对你有帮助。
5. 51单片机与PC机之间的硬件如何串口连接
单片机和微机通信的电气标准要一致,微机串口一般是RS232电气标准,所以要加电平转换芯片,大多用MAX232,一般单片机实验板上都提供这样的标准串口。
要分别编写上位机和下位机软件程序,单片机程序参照例程、教科书进行编写;上位机微机可采用VB,组态软件,Labview等软件编写,一般若是简单的通信,上位机程序编写很简单,例如VB中学会使用mscomm控件,有VB最基础知识的一天就能学会。
大可以没有单片机,没有MAX232,没有串行接口这些硬件就可以实现学习并掌握单片机与微机之间的串口通信。proteus可以仿真单片机,也是主流软件。
如今的笔记本电脑几乎都没有保留串口,而用USB接口取而代之,不过没关系,有了虚拟串口和串口调试助手,这些都解决了。你可以搜索一下虚拟串口,真的很不错的。
6. 单片机之间使用串口通信是,SBUF内的值无法改变
我觉得是你串口初始化比特率设置没成功,这是我找的一段串口初始化的程序,希望帮到你!
//12MHZ 9600波特率,定时器1T方式,串口1,波特率倍数开启
void UART_Init(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xB2; //设定定时初值
TH1 = 0xB2; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}