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

急求,下午老师检查,我把所有积分给他

第1个回答  2009-12-25
#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
这是我刚调试完成的,希望对你有帮助。本回答被提问者采纳
第2个回答  2009-12-23
/**************************************************************
程序名称: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*****/
相似回答