51单片机与PC机串口通信

  • 格式:docx
  • 大小:13.90 KB
  • 文档页数:2

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机P2口接8只LED灯,P3.2~P3.3引脚连接有K1和K2共2个按键,使用单片机串行口与PC机通信。

1)由PC机控制单片机的P2口,将PC机送出的数以二进制形式显示在LED灯上;

2)按下按键K1向PC机发送数字0x55,按下K2向PC机发送数字0xAA。

源程序如下:

#define uchar unsigned char

#include "string.h"

#include "reg51.h"

unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x08,0x03,0x46,0x21,0x06,0x0e}; //十六进制-7段译码表

void mDelay(unsigned int DelayTime) //延时函数

{ unsigned char j=0;

for(;DelayTime>0;DelayTime--) //延时循环

{ for(j=0;j<125;j++)

{;}}}

void SendData(uchar Dat) //发送函数

{ uchar i=0;

SBUF=Dat; //发送Dat

while(1){

if(TI) //如果发送中断标志为1,则等待,

{ TI=0; break; } //否则清除发送中断标志

}}

uchar Key() //按键处理函数

{ uchar KValue; //声明键值函数

P3|=0x3e; //中间4位置高电平 0011 1101

if((KValue=P3|0xe3)!=0xff) //如果按键按下

{ mDelay(10); //延迟时间函数

if((KValue=P3|0xe3)!=0xff) //如果按键还在按下状态

{ for(;;) //等待

if((P3|0xe3)==0xff) //如果按键抬起,

return(KValue); //返回键值

}}

return(0); //如果按键没有按下,返回0

}

void main() //主函数

{ uchar KeyValue; //定义键值变量KeyValue

unsigned char ns,ng,temp; //定义变量ns,ng,temp

P2=0xff; //熄灭P2口连接的所有发光管

TMOD=0x20; //确定定时器工作模式,模式2,常数自动装入

TH1=0xFD;

TL0=0xFD; //定时器1的初值波特率为9600,晶体为11.0592MHz //PCON&=0x80; 若是SMOD=1 可以使波特率加倍

TR1=1; //启动定时器1

SCON=0x40; //串口工作方式1 运行在8位模式

REN=1; //允许接收

for(;;) //无限循环

{if(KeyValue=Key()) //调用按键函数,获取按键信息

{ if((KeyValue|0xfb)!=0xff) //如果按键k1按下

SendData(0x55); //调用发送函数,送出0x55

if((KeyValue|0xf7)!=0xff) //如果k2按下

SendData(0xaa); //调用发送函数,送出0xaa

}

if(RI) //如果接收中断发生

{ P2=SBUF; //将接收数据写到端口P2

RI=0; } //清除接收标志位

temp=P2; //暂存接收到的数据

ng=temp & 0x0f; //取接收数据低4位

ns=temp>>4; //将高4位右移4位

ns &=0x0f; //取接收数据高4位

P0=table[ng]; //P0口连接的数码管显示低4位

P1=table[ns]; //P1口连接的数码管显示高4位

}}