标题:
求指教 stc12c5a60s2双串口单片机第二串口通讯问题
[打印本页]
作者:
西瓜易冷
时间:
2017-4-10 20:14
标题:
求指教 stc12c5a60s2双串口单片机第二串口通讯问题
本人以前学的一直是at89c51型单片机 现在学校里做一个甲醛检测仪 原来的串口用于传感器传送数据 因为要做一个RS232和上位机通信 所以选用了 stc12c5a60s2双串口单片机 。。无奈啊 第二个串口死活弄不通
问题大概是这样的 不用串口二初始化 不用串口二发送数据的时候好好的 单把串口二初始化程序添加进去并传送数据后 串口一串口二都不工作了 也显示不出检测数据了。。想问问有没有大神会改 帮忙弄一下串口二的初始化程序和发送程序
PS 串口二只用发送 不用接受 波特率都是9600 晶振都是11.0592
作者:
西瓜易冷
时间:
2017-4-10 20:15
#include <12c5a60s2.h>
#include <intrins.h>
#include<absacc.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define busy 0x80
uint jiaquan_mg,jiaquan_ppm;
uchar NRxBuff; //通讯接收缓冲区记数
uchar inbuff[20];//通讯接收缓冲区数据
uchar outbuff[20];//通讯发射缓冲区数据
sbit RS=P3^3;
sbit RW=P3^4;
sbit E=P3^5;
//毫秒延时子程序
void delay_nms(uint n)
{uint i,j;
for (i=0;i<n;i++){for(j=0;j<1900 ;j++);}}
//串口1 初始化
void UartInit(void) //9600bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR=AUXR&0x5a;
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
//串口2 初始化
void Uart_two_init (void)
{
S2CON=0x50;
BRT=0xfd;
AUXR1=AUXR1&0xef;
IE2=IE2|0x01;
}
// 串口2 发送一个字符
void uart_two_send(uchar l)
{
ES2=0;
S2BUF=l;
while((S2CON&0x02)!=0x02);
S2CON&=~0x02;
ES=1;
}
//串口2 发送数据
void uart_two_printf(uchar *p)
{
uchar b;
for(b=0;b<=7;b++)
{
uart_two_send(p[b]);
}
}
/////串口1中断子程序//////
serial (void) interrupt 4
{
RI=0;
inbuff[NRxBuff]=SBUF;
NRxBuff++;
if (NRxBuff>15)NRxBuff=0;
}
//串口1输出子程序
void sprint(uchar a)
{
ES=0;
SBUF=a;
while(!TI)
{};
TI=0;
ES=1;
}
//发送读取指令
void fa_read_pro(void)
{
uchar a;
outbuff[0]=0xa5;
outbuff[1]=0x5a;
outbuff[2]=0x02;
outbuff[3]=0x80;
outbuff[4]=0xaa;
for (a=0;a<5;a++)sprint(outbuff[a]);
}
// 1602的显示程序这里省略了
// 主程序 //
void main(void)
{
uint mg1,mg2,mg3,ppm1,ppm2,ppm3;
uchar *s1;
uchar *s2;
uchar *s3;
uchar s4;
init_1602();
s1="HCHO:";
s2="mg/m3";
s3="ppm";
s4='.';
display_1602string(0,0,s1); // 第一行开头显示 HCHO:
display_1602string(0,1,s1); // 第二行开头显示 HCHO:
display_1602string(11,0,s2); // 第一行末尾显示 mg/m3
display_1602string(13,1,s3); // 第二行末尾显示 ppm
EA=0;
delay_nms(50); //
NRxBuff=0;
UartInit(); //串口1 初始化
Uart_two_init(); // 串口2 初始化
EA=1;
delay_nms(166); //
while(1)
{
fa_read_pro();////发送读取指令
delay_nms(100);//延时一段时间,大于50ms
if ((NRxBuff>=8)&&(inbuff[0]==0xA5)&&(inbuff[1]==0x5A)&&(inbuff[3]==0x80)) //如果收到8个字节的数据,进行判断,然后处理数据。
{
jiaquan_mg=inbuff[4]*256+inbuff[5];////////////计算甲醛mg值
jiaquan_ppm=inbuff[6]*256+inbuff[7];//////////计算甲醛ppm值
NRxBuff=0;
}
// 想在这个位置 把从串口一接收到的8个字节数据通过RS232从串口二传送出去 串口二只用于传送 不用接受
mg1=jiaquan_mg/100; //计算各位
mg2=jiaquan_mg%100/10; //计算十分位
mg3=jiaquan_mg%100%10; //计算千分位
ppm1=jiaquan_ppm/100;
ppm2=jiaquan_ppm%100/10;
ppm3=jiaquan_ppm%100%10;
display_1602char(7,0,s4); //显示小数点
display_1602char(7,1,s4);
display_1602int(6,0,0x30+mg1); //显示动态数字要加 0x30 显示以mg为单位的检测数值
display_1602int(8,0,0x30+mg2);
display_1602int(9,0,0x30+mg3);
display_1602int(6,1,0x30+ppm1); //显示动态数字要加 0x30 显示以ppm为单位的检测数值
display_1602int(8,1,0x30+ppm2);
display_1602int(9,1,0x30+ppm3);
delay_nms(166);
}
}
复制代码
作者:
nephty
时间:
2018-5-1 14:26
老哥,调出来了吗,能讲讲吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1