微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stc12c5a60s为什么串口发送程序是?号的

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;                            //计时器清零   
         }                 
         }
}         

路过

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

网站地图

Top