stc12c5a60s为什么串口发送程序是?号的
时间:10-02
整理:3721RD
点击:
求助
#ifndef _ad_H_
#define _ad_H_
#include "stc12c5a60s2.h"
#include <stdio.h>
#include <intrins.h>
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ph_ch 1
#define zhuodu_ch 0
#define UART1_send_const_size 11 //串口发送数据缓冲区数组大小定义
#define unchar unsigned char
#define unint unsigned int
void ADC_Init(void);
void delay2(unsigned int s);
void DelayXus(unsigned char n);
void TimerInit(void);
void InitUART(void);
void UART_1send(void);
void UART_1SendOneByte(unsigned char d);
extern xdata unsigned char sendBuf[UART1_send_const_size]; //串口1发送数据缓冲区数组
extern xdata unsigned char Readph; //ph数据寄存器
extern xdata unsigned char Readzhuodu; //浊度数据寄存器
extern unsigned int ZhuoDu_ADC_service();
extern unsigned int zhuodu_ad_result;
extern unsigned int ADC_service();
extern xdata unsigned int ph_ad_result;
extern xdata unsigned char ch;
extern unsigned char AD_FLAG;
#endif
#include"ad.h"
unsigned int count=0; //用于采集数据定时
xdata unsigned int c=0;
xdata unsigned char Readph=0; //ph数据寄存变量
xdata unsigned char Readzhuodu=0; //浊度数据寄存变量
xdata unsigned int ph_ad_result; //ph的AD数据保存寄存器
xdata unsigned char ch=0; //AD通道口
unsigned char AD_FLAG=0; //AD中断标志,0代表要进行ph的AD转换,1代表正在进行AD转换,2表示要浊度的AD转换
unsigned int zhuodu_ad_result;
void ADC_Init(void)
{
ADC_RES=0; //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
P1ASF=0xdf; //除了P1^5口以外,其余P1所有口作为模拟AD口
ADC_CONTR=0x80; //开启AD电源
delay2(6); //初次打开AD电源要延时,电压稳定后才启动AD转换
EADC=1; //开启ADC中断
}
unint ADC_service() //取AD结果函数,它是十位AD转换,每五十次平均,最后取高八位作为AD采样数据
{
ch=ph_ch; //ph的ADC通道选择
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //start置1开始进行AD转换
AD_FLAG=1;
// ADC_CONTR=0x89;
return (ph_ad_result); //八位数据
}
unint ZhuoDu_ADC_service() //取AD结果函数,它是十位AD转换,每十次平均,最后取高八位作为AD采样数据
{
ch=zhuodu_ch; //ADC通道选择
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //start置1开始进行AD转换
// ADC_CONTR=0x88;
return (zhuodu_ad_result);
}
void ADC_ZD()interrupt 5 using 3
{
ADC_CONTR=0x80; //清除中断标志
if(ch==ph_ch) //ADC通道是PH时
{
ph_ad_result=ADC_RES; //保存数据
AD_FLAG=2; //标志置2,表示已经进行完AD中断,可以继续进行采集
}
else if(ch==zhuodu_ch) //ADC通道是浊度时
{
zhuodu_ad_result=ADC_RES; //保存数据
//UART_1SendOneByte(ADC_RES);
//UART_1SendOneByte(ADC_RES>>8);
AD_FLAG=0; //标志置0,表示已经进行完AD中断,进行ph采集
}
}
/********************************延时函数*************************************/
void delay2(unint s)
{
unint x,y;
for(x=s;x>0;x--)
for(y=110;y>0;y--);
}
/**************************************
延时大于10微秒(STC12C5A60S2@11.0592M) 2-85微秒
**************************************/
void DelayXus(unchar n)
{
while (--n);
}
void UART_1SendOneByte(unsigned char d)
{
if(RI==0)
{
TI=0; //清空发送完成中断请求标志
SBUF=d;
while(!TI); //若TI=0,在此等待
TI = 0;
}
}
void InitUART(void)
{
PCON = 0X00;
SCON = 0x50; //串口1工作在方式1 8位异步收发 REN=1允许接收
EA = 1; //开总中断
ES = 1; //开串口1中断
// TR1 = 1; //定时器1开始计数
IP = 0XB0; //优先级设置,由高到低为串口1中断,定时器1中断和定时器0中断,ADC中断和PCA中断,低压检测中断
IPH = 0X1A;
S2CON = 0x50; //串口2工作在方式1 8位异步收发 S2REN=1允许接收
BRT = 0xFD; //独立波特率发生器初值
AUXR |= 0x10; //BRTR=1 独立波特率发生器运行,开始计时,波特率不加倍,12T
IE2 =0x01; //开串口2中断 ES2=1
IPH2=0X01;
IP2=0X01; //串口2中断最高优先级
}
void UART_1send(void)
{
sendBuf[0]=Readph; //ph数据
sendBuf[1]=Readzhuodu; //浊度数据
for(c=0;c<2;c++) //发送数据
{
UART_1SendOneByte(sendBuf[c]);
}
}
void TimerInit(void) //定时器1中断时间为100微秒@11.0592MHz,定时器0中断时间为100微秒@11.0592MHz
{
AUXR |= 0xD1; //定时器0为1T模式,定时器1为1T模式,BRTR=1 独立波特率发生器运行,
//UART2波特率不加倍,独立波特率发生器每12时钟计数一次,串口1使用独立波特率发生器
TMOD = 0x11; //设置定时器0和定时器1均工作在16位定时器模式
TL0 = 0xAE; //设置定时初值
TH0 = 0xFB; //设置定时重载值,100微秒
TH1 = 0xFB; //定时器1初值,100微秒
TL1 = 0xAE;
EA = 1; //系统允许有开放的中断
ET0 = 1; //允许定时0中断
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET1 = 1; //允许定时0中断
TF1 = 0; //清除TF0标志
TR1 = 1; //定时器1开始计数
}
void timer1_interrupt(void) interrupt 3
{
TF1 = 0;
count++;
TH1 = 0xFB; //定时器1初值,100微秒
TL1 = 0xAE;
}
void main()
{
InitUART(); //串口初始化
ADC_Init(); //AD转换初始化
TimerInit(); //定时器初始化
P1M1=0xdf; //p1口为AD口,设置为输入模式,p1^6口设置为输出模式
P1M0=0x20;
while(1)
{
UART_1send();
if(count==5000)
{
if(AD_FLAG==0) //AD标志位为0,表示要进行ph的AD转换
{
Readph=ADC_service(); //ph采集函数
Readph=(Readph*5*10)/256; //计算电压
}
else if(AD_FLAG==2) //AD标志位为2,表示要进行浊度的AD转换
{
Readzhuodu=ZhuoDu_ADC_service(); //浊度采集函数
Readzhuodu=(Readzhuodu*5*10)/256; //计算电压
}
count=0; //计时器清零
}
}
}
#ifndef _ad_H_
#define _ad_H_
#include "stc12c5a60s2.h"
#include <stdio.h>
#include <intrins.h>
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ph_ch 1
#define zhuodu_ch 0
#define UART1_send_const_size 11 //串口发送数据缓冲区数组大小定义
#define unchar unsigned char
#define unint unsigned int
void ADC_Init(void);
void delay2(unsigned int s);
void DelayXus(unsigned char n);
void TimerInit(void);
void InitUART(void);
void UART_1send(void);
void UART_1SendOneByte(unsigned char d);
extern xdata unsigned char sendBuf[UART1_send_const_size]; //串口1发送数据缓冲区数组
extern xdata unsigned char Readph; //ph数据寄存器
extern xdata unsigned char Readzhuodu; //浊度数据寄存器
extern unsigned int ZhuoDu_ADC_service();
extern unsigned int zhuodu_ad_result;
extern unsigned int ADC_service();
extern xdata unsigned int ph_ad_result;
extern xdata unsigned char ch;
extern unsigned char AD_FLAG;
#endif
#include"ad.h"
unsigned int count=0; //用于采集数据定时
xdata unsigned int c=0;
xdata unsigned char Readph=0; //ph数据寄存变量
xdata unsigned char Readzhuodu=0; //浊度数据寄存变量
xdata unsigned int ph_ad_result; //ph的AD数据保存寄存器
xdata unsigned char ch=0; //AD通道口
unsigned char AD_FLAG=0; //AD中断标志,0代表要进行ph的AD转换,1代表正在进行AD转换,2表示要浊度的AD转换
unsigned int zhuodu_ad_result;
void ADC_Init(void)
{
ADC_RES=0; //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
P1ASF=0xdf; //除了P1^5口以外,其余P1所有口作为模拟AD口
ADC_CONTR=0x80; //开启AD电源
delay2(6); //初次打开AD电源要延时,电压稳定后才启动AD转换
EADC=1; //开启ADC中断
}
unint ADC_service() //取AD结果函数,它是十位AD转换,每五十次平均,最后取高八位作为AD采样数据
{
ch=ph_ch; //ph的ADC通道选择
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //start置1开始进行AD转换
AD_FLAG=1;
// ADC_CONTR=0x89;
return (ph_ad_result); //八位数据
}
unint ZhuoDu_ADC_service() //取AD结果函数,它是十位AD转换,每十次平均,最后取高八位作为AD采样数据
{
ch=zhuodu_ch; //ADC通道选择
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //start置1开始进行AD转换
// ADC_CONTR=0x88;
return (zhuodu_ad_result);
}
void ADC_ZD()interrupt 5 using 3
{
ADC_CONTR=0x80; //清除中断标志
if(ch==ph_ch) //ADC通道是PH时
{
ph_ad_result=ADC_RES; //保存数据
AD_FLAG=2; //标志置2,表示已经进行完AD中断,可以继续进行采集
}
else if(ch==zhuodu_ch) //ADC通道是浊度时
{
zhuodu_ad_result=ADC_RES; //保存数据
//UART_1SendOneByte(ADC_RES);
//UART_1SendOneByte(ADC_RES>>8);
AD_FLAG=0; //标志置0,表示已经进行完AD中断,进行ph采集
}
}
/********************************延时函数*************************************/
void delay2(unint s)
{
unint x,y;
for(x=s;x>0;x--)
for(y=110;y>0;y--);
}
/**************************************
延时大于10微秒(STC12C5A60S2@11.0592M) 2-85微秒
**************************************/
void DelayXus(unchar n)
{
while (--n);
}
void UART_1SendOneByte(unsigned char d)
{
if(RI==0)
{
TI=0; //清空发送完成中断请求标志
SBUF=d;
while(!TI); //若TI=0,在此等待
TI = 0;
}
}
void InitUART(void)
{
PCON = 0X00;
SCON = 0x50; //串口1工作在方式1 8位异步收发 REN=1允许接收
EA = 1; //开总中断
ES = 1; //开串口1中断
// TR1 = 1; //定时器1开始计数
IP = 0XB0; //优先级设置,由高到低为串口1中断,定时器1中断和定时器0中断,ADC中断和PCA中断,低压检测中断
IPH = 0X1A;
S2CON = 0x50; //串口2工作在方式1 8位异步收发 S2REN=1允许接收
BRT = 0xFD; //独立波特率发生器初值
AUXR |= 0x10; //BRTR=1 独立波特率发生器运行,开始计时,波特率不加倍,12T
IE2 =0x01; //开串口2中断 ES2=1
IPH2=0X01;
IP2=0X01; //串口2中断最高优先级
}
void UART_1send(void)
{
sendBuf[0]=Readph; //ph数据
sendBuf[1]=Readzhuodu; //浊度数据
for(c=0;c<2;c++) //发送数据
{
UART_1SendOneByte(sendBuf[c]);
}
}
void TimerInit(void) //定时器1中断时间为100微秒@11.0592MHz,定时器0中断时间为100微秒@11.0592MHz
{
AUXR |= 0xD1; //定时器0为1T模式,定时器1为1T模式,BRTR=1 独立波特率发生器运行,
//UART2波特率不加倍,独立波特率发生器每12时钟计数一次,串口1使用独立波特率发生器
TMOD = 0x11; //设置定时器0和定时器1均工作在16位定时器模式
TL0 = 0xAE; //设置定时初值
TH0 = 0xFB; //设置定时重载值,100微秒
TH1 = 0xFB; //定时器1初值,100微秒
TL1 = 0xAE;
EA = 1; //系统允许有开放的中断
ET0 = 1; //允许定时0中断
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET1 = 1; //允许定时0中断
TF1 = 0; //清除TF0标志
TR1 = 1; //定时器1开始计数
}
void timer1_interrupt(void) interrupt 3
{
TF1 = 0;
count++;
TH1 = 0xFB; //定时器1初值,100微秒
TL1 = 0xAE;
}
void main()
{
InitUART(); //串口初始化
ADC_Init(); //AD转换初始化
TimerInit(); //定时器初始化
P1M1=0xdf; //p1口为AD口,设置为输入模式,p1^6口设置为输出模式
P1M0=0x20;
while(1)
{
UART_1send();
if(count==5000)
{
if(AD_FLAG==0) //AD标志位为0,表示要进行ph的AD转换
{
Readph=ADC_service(); //ph采集函数
Readph=(Readph*5*10)/256; //计算电压
}
else if(AD_FLAG==2) //AD标志位为2,表示要进行浊度的AD转换
{
Readzhuodu=ZhuoDu_ADC_service(); //浊度采集函数
Readzhuodu=(Readzhuodu*5*10)/256; //计算电压
}
count=0; //计时器清零
}
}
}
路过