计算机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;//清除发送完成标志位 */ }