专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机与PC机串口通信

作者:huqin   来源:本站原创   点击数:  更新时间:2009年05月21日   【字体:

单片机P2口接8只LED灯,P3.2~P3.3引脚连接有K1和K2共2个按键,使用单片机串行口与PC机通信。
1)由PC机控制单片机的P2口,将PC机送出的数以二进制形式显示在LED灯上;
2)按下按键K1向PC机发送数字0x55,按下K2向PC机发送数字0xAA。
源程序如下:
//出自:51hei单片机学习网http://www.51hei.com
#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位
}}

关闭窗口

相关文章