求助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;
}
}
}
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接收数据进不去中断时什么原因