导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[原创]51单片机与PC机串口通信[fengjian99]

 *第44816篇: [原创]51单片机与PC机串口通信

  
楼 主:fengjian99 2009年6月22日17:29
 [原创]51单片机与PC机串口通信
单片机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位 }}



>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:图文详解基于ARM11飞思卡尔i.mx31高端多媒体芯片应用

[下一篇主题]:新手报到