stc单片机串口通信问题

2019-07-16 03:47发布

想实现的功能是串口1接受数据,串口2将数据发送出去
  帮小弟看下程序i吧谢谢
   
#include <STC12C5A60S2.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#define uint unsigned int
#define uchar unsigned char
uint i,t,num1;
uchar j;
//1602设置
void UART_init(void);
void Receive(void);
void Write_str( uchar *p );
int COM_datdeal(void);
double Result_Calculate();
//串口设置
uchar rcv_dat[11]; //连续输出A通道9字节16进制显示数据
uchar Receive_Bflag = 0; //正在接送标志
//**********************************//
//           串口1初始化           //
//**********************************//
void UART_init(void)
{
PCON &= 0x7f;  //波特率不倍速
SCON = 0x50;  //8位数据,可变波特率
AUXR &= 0xbf;  //定时器1时钟为Fosc/12,即12T
AUXR &= 0xfe;  //串口1选择定时器1为波特率发生器
TMOD &= 0x0f;  //清除定时器1模式位
TMOD |= 0x20;  //设定定时器1为8位自动重装方式
TL1 = 0xFD;  //设定定时初值
TH1 = 0xFD;  //设定定时器重装值
ET1 = 0;  //禁止定时器1中断
TR1 = 1;  //启动定时器1
IP  = 0X10; //PS  = 1;串口1中断为最高优先级中断
ES = 1;             //允许串口中断  
EA = 1;    //开总中断
}
//***********************************************//
//               串口2初始化
//**********************************************//
void Uartinit2(void)  [url=]//9600bps@11.0592MHz[/url]
{
AUXR &= 0xf7;  //波特率不倍速
S2CON = 0x50;  //8位数据,可变波特率
BRT = 0xDC;  //设定独立波特率发生器重装值
AUXR |= 0x04;  //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x10;  //启动独立波特率发生器
IE2=0x01;       //允许串口2中断ES2=1
EA=1;         //开总中断
}
//************************************************//
//                  串口2发送数据     //
//************************************************//
void sendoneByte(uchar c)
{
uchar temp=0;
IE2=0x00;//关闭串口2中断ES=0
S2CON =S2CON&0xFD;//TI=0
S2BUF=c;
do
{
temp=S2CON;
temp=temp&0x02;
}while(temp==0);
S2CON =S2CON&0xFD;//TI=0清零串口发送完成标志
IE2=0x01;//允许串口2中断ES2=1
}
void sendString(uchar *aaa)
{
while(*aaa!='')
{
sendoneByte(*aaa);
aaa++;
}
}

//***********************************************//
//                  串口1数据处理     //
//***********************************************//
int COM_datdeal(void)
{
int COM_result;
uchar *p1,*p2;
*p1= rcv_dat[7];
*p2= rcv_dat[8];
COM_result=atoi(p1)*100+atoi(p2);
return COM_result;
}  
void Printf_commdata(int n)
{
uchar scoom[5] = {0,0,0,0,103};
        scoom[0]= n/1000;
  scoom[1]= n%1000/100;
  scoom[2]= n%100/10;
  scoom[3]= n%10;
    WRITE_CMD(0x80+0x08);
    Write_str(scoom);
}
//***********************************************//
//                  串口1中断服务     //
//***********************************************//
void Com_Service(void) interrupt 4
{
uchar j;
if(RI)
{
rcv_dat[0]=SBUF;
if(rcv_dat[0]==0x05)
{
for(j=1;j<11;j++)
{
rcv_dat[j]=SBUF;
  
}
if((rcv_dat[0]^rcv_dat[1]^
rcv_dat[2]^rcv_dat[3]^rcv_dat[4]
^rcv_dat[5]^rcv_dat[7]^rcv_dat[9])==rcv_dat[10])
{
  Receive_Bflag = 1;
  RI=0; //清标志位
  ES=0;//关中断,数据发送完成以后再开中断
}
}
}
}
//********************************************//
//                 串口2中断服务
//********************************************//
void Com2_Service(void) interrupt 8
{
   
    sendString(rcv_dat);
IE2=0x01;
}

//******************************************//
//                主程序           //
//******************************************//
void main()
{   
    LCD_INIT();
    AD_init();
UART_init();
UartInit2();
EA=1;//开总中断
while(1)
{
Printf_Decimal(Result_Calculate());
if(Receive_Bflag)
{
  Printf_commdata(COM_datdeal());
  Receive_Bflag = 0;
  ES=1;
}
}

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
lstcspring
1楼-- · 2019-07-16 08:40
 精彩回答 2  元偷偷看……
hangzhouxihu
2楼-- · 2019-07-16 10:50
lstcspring 发表于 2012-11-15 20:31
看什么,有什么问题

我的串口2接收不到数据
Oliverking
3楼-- · 2019-07-16 14:05
这个不错,多谢楼主
a5030700as
4楼-- · 2019-07-16 18:48
。。。。。。。。。。。无语

一周热门 更多>