计算机RS232和C51单片机收发程序_c51单片机程序实例

其他范文 时间:2020-02-28 03:51:52 收藏本文下载本文
【www.daodoc.com - 其他范文】

计算机RS232和C51单片机收发程序由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c51单片机程序实例”。

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

RS232串口通讯,由计算机或MCU发送C51单片机

通讯程序:发送3A 30 31 ** ** ** **(起始字符3A,地址为01,**代表数据,无结束字符,无和校验)接收超时时间:50ms 波特率:4800bps 接收到的数据用数码管显示出来

管脚定义:P0控制每位数码管显示,P2^2,P2^3,P2^4控制译码器,译码器控制哪一位显示 支持0~F的ASCII码数据接收

例如:发送 3A 30 31 42 43 44 45 后显示数码管显示 BCDE //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/******************************************************************************* * 实验名

: 动态显示数码管实验 * 使用的IO

: 数码管使用P0,P2.2,P2.3,P2.4 * 实验效果

: 数码管显示

******************************************************************************/ #include #define GPIO_DIG P0 sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;int i;int m;unsigned char n;unsigned char s;unsigned char p;//遇到小数点往后移动1位 unsigned char code DIG_CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码 unsigned char DisplayData[16];unsigned char RECEIV_DATA[16];//用来存放要显示的8位数的值 unsigned char RECEIV_DATA_USART[16];//BUF接收缓存 void DigDisplay();//数码管显示函数

/******************************************************************************* * 函数名

: main * 函数功能

: 主函数 * 输入

: 无 * 输出

: 无

*******************************************************************************/ void main(void){ SCON=0X50;//设置为工作方式1 TMOD=0X20;

//设置计数器工作方式2 PCON=0X80;//波特率加倍

TH1=0XF3;

//计数器初始值设置,注意波特率是4800的TL1=0XF3;ES=1;

//打开接收中断

EA=1;

//打开总中断

TR1=1;

//打开计数器

for(n=0;n

DisplayData[n]=DIG_CODE[n];

} while(1){

DigDisplay();}

} /******************************************************************************* * 函数名

: DigDisplay * 函数功能

: 使用数码管显示 * 输入

: 无 * 输出

: 无

*******************************************************************************/ void DigDisplay(){ unsigned char a;unsigned int j;

if(RECEIV_DATA_USART[0]==0x3A&&RECEIV_DATA_USART[1]==0x30&&RECEIV_DATA_USART[2]==0x31)

for(a=0;a

RECEIV_DATA[a]=RECEIV_DATA_USART[a];

p=0x00;//小数点判断

for(a=1;a

{

if(RECEIV_DATA[a+2+p]==0x2E)

{

GPIO_DIG=0x80|GPIO_DIG;

p++;

j=10;

//扫描间隔时间设定

while(j--);

GPIO_DIG=0x00;//消隐 }

switch(a)//位选,选择点亮的数码管,{ case(1):

LSA=0;LSB=0;LSC=0;break;//显示第0位

case(2):

LSA=1;LSB=0;LSC=0;break;//显示第1位

case(3):

LSA=0;LSB=1;LSC=0;break;//显示第2位

case(4):

LSA=1;LSB=1;LSC=0;break;//显示第3位

case(5):

LSA=0;LSB=0;LSC=1;break;//显示第4位

case(6):

LSA=1;LSB=0;LSC=1;break;//显示第5位

case(7):

LSA=0;LSB=1;LSC=1;break;//显示第6位

case(8):

LSA=1;LSB=1;LSC=1;break;//显示第7位

} for(s=0;s

}

if(RECEIV_DATA[a+2+p]==0x30+s)

GPIO_DIG=DIG_CODE[s];

for(s=0;s

if(RECEIV_DATA[a+2+p]==0x41+s)

GPIO_DIG=DIG_CODE[0x0A+s];

j=10;

//停留时间设定

while(j--);

GPIO_DIG=0x00;//消隐

}

if(i>0)m++;//接收超时计时器

if(m>10&&RECEIV_DATA_USART[0]==0x3A)

{

for(n=i;n

RECEIV_DATA_USART[0]=0x00;

m=0;

i=0;

}

void Usart()interrupt 4 {

if(SBUF==0x3A)//判断起始字符是否为0x3A

{

RECEIV_DATA_USART[0]=SBUF;

}

if(RECEIV_DATA_USART[0]==0x3A)

{

RECEIV_DATA_USART[i]=SBUF;//出去接收到的数据

i++;

}

RI = 0;//清除接收中断标志位 /* 以下代码为将接收到的数据返回给发送方,便于调试

SBUF=RECEIV_DATA[i];

while(!TI);

//等待发送数据完成TI=0;//清除发送完成标志位 */ }

下载计算机RS232和C51单片机收发程序word格式文档
下载计算机RS232和C51单片机收发程序.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

    热门文章
      整站推荐
        点击下载本文