微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助STC12C5A60S2 串口通信问题

求助STC12C5A60S2 串口通信问题

时间:10-02 整理:3721RD 点击:
求大神帮忙看下程序  
AD转换显示功能已经实现了,我要实现的功能是串口1接收串口助手发送来的11字节数据(数据以0x05开头,尾部是前几位的异或),然后将这个11字节数组通过串口2发送出去,串口2发送没有出现,而且pc一向串口1发送数据,AD采集数据就变得很慢。求大神帮忙  谢谢  
  
#include <STC12C5A60S2.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
//AD
#define ADC_POWER 0x80 //AD电源控制
#define ADC_START 0x08 //AD转换控制
#define ADC_FLAG  0x10 //AD转换完成
//#define Speed_0   0x00 //540 clk
//#define Speed_1   0x20 //360 clk
#define Speed_2   0x40 //180 clk
//#define Speed_3   0x60 //90  clk
#define ADC0      0x00 //P1.0
#define  PI       3.1415926
#define uint unsigned int
#define uchar unsigned char
uint i,t,num1;
uchar j;
//1602
sbit lcden = P3^4;
sbit lcdrs = P3^5;
//1602设置
uchar table1[8] = {"Stress: "};
uchar table2[8] = {"Angle : "};
void WRITE_CMD(unsigned char com);
void UART_init(void);
void Receive(void);
void AD_init(void);
void Write_str( uchar *p );
int COM_datdeal(void);
uint  AD_Service(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!='\0')
{
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;
}
//**********************************//
//           A/D初始化           //
//**********************************//
void AD_init(void)
{
    AUXR1     = 0x04;                   //转换结果高2位放在ADC_RES的低2位中,低8位放在ADC_RESL中
    P1ASF     = 0x01;                   //P1.0口作为模拟功能A/D使用
    ADC_RES   = 0x00;                   //结果清零
    ADC_RESL  = 0x00;
    ADC_CONTR = ADC_POWER|Speed_2|ADC0|ADC_START;   //打开电源,180CLK周期转换,选择P1.0作输入
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    //EADC      = 1;                          //允许A/D转换中断
    //EA        = 1;                          //开总中断
}
void Delay_ms (unsigned int z)
{
unsigned int x, y;
for (x=0; x<z; x++)
  for (y=0; y<120; y++);
}
//write 1602 命令
void WRITE_CMD(unsigned char com)
{
lcdrs = 0;
P2 = com;
Delay_ms(5);
lcden = 1;
Delay_ms(5);
lcden = 0;
}
//write 1602 data
void WRITE_DATE(unsigned char date)
{
lcdrs = 1;
P2 = date;
Delay_ms(5);
lcden = 1;
Delay_ms(5);
lcden = 0;
}
//1602初始化
void LCD_INIT(void)
{
lcden = 0;
WRITE_CMD(0x38);
WRITE_CMD(0x0c);
WRITE_CMD(0x06);
WRITE_CMD(0x01);
WRITE_CMD(0x80);
for(i=0;i<8;i++)
{
  WRITE_DATE(table1);
  Delay_ms(5);
}
WRITE_CMD(0x80+0x40);
for(i=0;i<8;i++)
{
  WRITE_DATE(table2);
  Delay_ms(5);
}
}
//******************************************//
//              转换结果计算          //
//******************************************//
double Result_Calculate( )
{
    uint temp;
    double temp2,huchang,result,add=0.0;
for(i=0;i<100;i++)
{
  add+=AD_Service();
}
      temp=add/100;
      temp2 = temp * 4.94 / 1024;
   huchang=asin(0.5*temp2-1.25);
   result=huchang*180/PI;
  
      return result;
   
}
void Write_str( uchar *p )
{
    while( *p != '\0' )
    {
        WRITE_DATE(*p);
        p++;
    }
}
void Printf_Decimal(double Num)
{
    uchar s[6] = {0,0,0,0,0,0};
    if(Num<0)
{
s[0]=0x2D; //-
Num=Num*(-1);
}
else
{
  s[0]=0x2B; //+
}

t=(uint)(Num*100);
    s[1] = t/1000+48;
    s[2] = t%1000/100+48;
s[3] = 0x2E;
    s[4] = t%100/10+48;
    s[5] = t%10+48;
    WRITE_CMD(0x80+0x48);
    Write_str(s);
   
}
//******************************************//
//               A/D服务          //
//******************************************//
uint  AD_Service(void)
{
uint temp;
    ADC_CONTR = ADC_POWER|Speed_2|ADC_START; //开始下一次转换   
    _nop_();
    _nop_();
    _nop_();
    _nop_();
while(!(ADC_CONTR&0x10));    //等待转换完成
ADC_CONTR &= !ADC_FLAG; //清标志
temp = ADC_RES * 256.0 + ADC_RESL;
return(temp);
ADC_RES   = 0x00;
    ADC_RESL  = 0x00;
}
//******************************************//
//                主程序           //
//******************************************//
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;
}
}

}

对不起大家有点长。1602和AD部分不用看了直接帮小弟看串口通信部分就行  谢谢

好像有点多  哦

主要是串口通信 方面出了问题  请指教

屏蔽掉其他功能,单独用串口2发送,你成功了吗?

单独测试串口2发送 没有问题

请问一下,我用串口2接收数据进不去中断时什么原因

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top