单片机与pc机串口通信完整代码

急求,下午老师检查,我把所有积分给他... 急求,下午老师检查,我把所有积分给他 展开
 我来答
迪凯特科技(北京)有限公司 2023-07-28
展开全部
串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。 通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信…
chenjiangna
2009-12-25
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
#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
这是我刚调试完成的,希望对你有帮助。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
迪凯特科技(北京)有限公司
2023-07-28 广告
单片机串口通信的原理是利用单片机的串口通信模块,通过把数据转化为一位一位的用时序方式传送数据,实现单片机与外部设备之间的数据通信。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以... 点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
萍水e相逢
2009-12-23 · TA获得超过3万个赞
知道大有可为答主
回答量:5.9万
采纳率:46%
帮助的人:1.4亿
展开全部
/**************************************************************
程序名称:51串口通信程序,数码管显示电脑键盘按键ASCII值,晶振11.0592M
**************************************************************/
#include <AT89X52.h>
#define uchar unsigned char
uchar tmp;
uchar code dis[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

/*****n(ms)延时子程序*****/
void delayms(uchar ms) //延时ms
{
uchar i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}

/*****串口传送一个字符*****/
void send_char(uchar txd)
{
SBUF = txd;
while(!TI); //等特数据传送
TI = 0; //清除数据传送标志
}

/*****显示子程序*****/
void display()
{
P1=dis[tmp&0x0f];
P0=0x01;
delayms(10); //个位显示
P1=dis[tmp/16];
P0=0x02;
delayms(10); //十位显示
}

/*****主函数*****/
main()
{
TMOD = 0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; //波特率9600
TL1 = 0xFD;

SCON = 0x50; //设定串行口工作方式
PCON &= 0xef; //波特率不倍增

TR1 = 1; //启动定时器1
IE = 0x0; //禁止任何中断
while(1)
{
if(RI) //是否有数据到来
{
RI = 0;
tmp = SBUF; //暂存接收到的数据
send_char(tmp); //回传接收到的数据
}
display();
}
}

/*****END*****/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式