80C51单片机串口通信(含原程序)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void transbyte(unsigned char d); //送1字节数据到液晶显示控制器子程序
void transbit(bit d); //送1位数据到液晶显示控制器子程序sbit CLKPIN = P1^6;
(三)实现单片机与PC机的通信
一、实验原理:
51单片机的串行口是一个可编程全双工的通信接口,具有UART(通用异步收发器)的全部功能,能同时进行数据的发送和接收,也可作为同步移位寄存器使用。
二、详细程序:
MCU TO PC
从单片机向PC发送一串十六进制代码:0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
sbit DIPIN = P1^3;
uint num;
uchar receive (void)
{
uchar dat;
while(RI==0);
RI=0;
dat=SBUF;
SBUF=dat;
return dat;
}
unsigned char code NUMCODETAB[]={0xFC,0x60,0xDA,0xF2, //数字0,1,2,3
并将这些代码用发光二极管在发送端显示(流水灯效果)。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
}
void main(void) //主程序
{
TMOD=0x20;
SCON=0x50;
PCON=0x00;
_nop_();
_nop_();
CLKPIN = 0;
_nop_();
_nop_();
CLKPIN = 1;
}
三、硬件电路:
(见下页)
0x66,0xB6,0xBE,0xE0, //数字4,5,6,7
0xFE,0xF6,0xee,0x3e, //数字8,9,A,b,
0x9c,0x7a,0x9e,0x8e}; //C,d,E,F
void transram(num)
{
unsigned char buf;
buf=0x00;
buf=NUMCODETAB[num];
transbit(1);
else
transbit(0);
d>>=1; //从低到高位送字节位数据到液晶显示控制器
}
}
void transbit(bit d) //送1位数据到液晶显示控制器子程序
{ DIPIN = d; //先送数据到数据口线DI
_nop_();
_nop_();
CLKPIN = 1; //再使时钟口线发一个负脉冲
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TR1=1;
while(1)
{
for(i=0;i<8;i++)
{
send(tab[i]);
P2=tab[i];
delay();
}
}
}
PC TO MCU
由PC机上的串口调试助手向MCU发送
0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F中的任一个字符,然后显示在MCU的外设液晶显示器上。
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
while(1)
{
transram(receive());
}
}
void transbyte(unsigned char d) //送1字节数据到液晶显示控制器子程序
{ unsigned char i;
for(i=0;i<8;i++)
{ if((d&0x1) == 0x1)
void send(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void delay(void)
{
uchar x,y;
Hale Waihona Puke Baidufor(x=0;x<220;x++)
for(y=0;y<250;y++);
}
void main(void)
{
uchar i;
TMOD=0x20;
SCON=0x40;
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void transbyte(unsigned char d); //送1字节数据到液晶显示控制器子程序
void transbit(bit d); //送1位数据到液晶显示控制器子程序sbit CLKPIN = P1^6;
(三)实现单片机与PC机的通信
一、实验原理:
51单片机的串行口是一个可编程全双工的通信接口,具有UART(通用异步收发器)的全部功能,能同时进行数据的发送和接收,也可作为同步移位寄存器使用。
二、详细程序:
MCU TO PC
从单片机向PC发送一串十六进制代码:0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
sbit DIPIN = P1^3;
uint num;
uchar receive (void)
{
uchar dat;
while(RI==0);
RI=0;
dat=SBUF;
SBUF=dat;
return dat;
}
unsigned char code NUMCODETAB[]={0xFC,0x60,0xDA,0xF2, //数字0,1,2,3
并将这些代码用发光二极管在发送端显示(流水灯效果)。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
}
void main(void) //主程序
{
TMOD=0x20;
SCON=0x50;
PCON=0x00;
_nop_();
_nop_();
CLKPIN = 0;
_nop_();
_nop_();
CLKPIN = 1;
}
三、硬件电路:
(见下页)
0x66,0xB6,0xBE,0xE0, //数字4,5,6,7
0xFE,0xF6,0xee,0x3e, //数字8,9,A,b,
0x9c,0x7a,0x9e,0x8e}; //C,d,E,F
void transram(num)
{
unsigned char buf;
buf=0x00;
buf=NUMCODETAB[num];
transbit(1);
else
transbit(0);
d>>=1; //从低到高位送字节位数据到液晶显示控制器
}
}
void transbit(bit d) //送1位数据到液晶显示控制器子程序
{ DIPIN = d; //先送数据到数据口线DI
_nop_();
_nop_();
CLKPIN = 1; //再使时钟口线发一个负脉冲
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TR1=1;
while(1)
{
for(i=0;i<8;i++)
{
send(tab[i]);
P2=tab[i];
delay();
}
}
}
PC TO MCU
由PC机上的串口调试助手向MCU发送
0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F中的任一个字符,然后显示在MCU的外设液晶显示器上。
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
while(1)
{
transram(receive());
}
}
void transbyte(unsigned char d) //送1字节数据到液晶显示控制器子程序
{ unsigned char i;
for(i=0;i<8;i++)
{ if((d&0x1) == 0x1)
void send(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void delay(void)
{
uchar x,y;
Hale Waihona Puke Baidufor(x=0;x<220;x++)
for(y=0;y<250;y++);
}
void main(void)
{
uchar i;
TMOD=0x20;
SCON=0x40;