PIC12LF1822AD结果串口发送每隔5个跳异常

2019-07-15 21:16发布

    用PIC12LF1822AN1做串口转换,AD结果高8位通过串口发送,每隔5、6个出现一个数据异常,分析不出哪出的问题
原文件:MPLAB8.70 proteus7.10    1.原文件: 1822_AD_UART.rar (6.08 MB, 下载次数: 5)   proteus7.10 MPLAB8.70
    2.串口截图:
    1822AD_UART.jpg
      3.程序C
     /************************************************************
项目名称:1822AD_串口显示
要求:1822AD_串口显示,左对齐取高八位
设计:robin_chen559
日期:2013.12.15
备注:
************************************************************/
#include<pic.h>              //包含头文件pic12lf1822.h


#define LED_G  RA0             //RA0为LED_G口
#define uchar unsigned char
#define uint  unsigned int

uint AD_VAL_AVR = 0;              //AD处理结果  

//子程序声明

void Init_star(void);       //系统初始化
void Init_UART(void);       //串口初始化
void Delay_MS(uint MS);     //延迟子程序
void Init_AD(void);         //AD初始化
void AD_AVR(void);          //AD结果处理

//子程序
void Init_star(void)        //系统初始化子程序
{
   OSCCON = 0b01101010;        //4M系统时钟
   APFCON = 0b10000100;        //端口复用定义RA5/4 RD TX,RA2 CPP
   TRISA  = 0b00101010;        //A口输入输出设置,RA5/1/3输入,RA4/0/2输出
   ANSELA = 0b00001110;        //RA1/RA2/RA3拟输入_AD,其他全部是数字输入
}

void Init_UART(void)
{
INTCON  = 0b11000000;         //开总中断GIE,外设中断PEIE
TXIE    = 0;                  //发送中断
ADIE    = 0;                  //禁止AD中断
TXSTA   = 0b00100110;         //串口配置字
RCSTA   = 0b10010000;         //接受寄存器配置P295
BAUDCON = 0b01001000;         //16位波特率计数器,固定波特率
SPBRGH  = 0b00000000;         //011,16位异步,9600波特率,查表103
SPBRGL  = 0b01100111;
}

void Init_AD(void)
{
ADCON0 = 0B00000101;          //AD使能,选AN1
ADCON1 = 0B00110011;          //AD结果左对齐,内rc,2V内部考电压
FVRCON = 0b11000010;          //2v内部参考电压配置
}

void AD_AVR(void)                 //AD结果处理
{
uchar n;
uchar m;
AD_VAL_AVR = 0;

   ADGO = 1;                     //开始AD转换
   for(n=0;n<5;n++)              //延时20uS待电平稳定
   {NOP();}
   while(ADGO == 1);             //等待AD转换完成
   ADIF = 0;                     //清除转换完成标志
   AD_VAL_AVR =ADRESH;           //AD结果5次自加


  //AD_VAL_AVR=AD_VAL_AVR/10;      //AD结果10次求均值
  // TXIE = 1;                     //串口发送中断使能
}

void Delay_MS(uint MS)         //延时函数
{
  uint i;
  uchar j;

   for(i=0;i<MS;i++)       
      for(j=115;j>0;j--);         
}

/*****
void interrupt ISR(void)       //中断子程序无需声明
{
if(TXIE == 1)
{      
   TXREG = AD_VAL_AVR  ;        //Uart_Data
   while(TRMT == 0);            //串口发送中,等待
   TXIE   = 0;                  //防止串口发送中断一直申请
}
}
*****/

void main (void)             //主程序
{
Init_star();                //开机初始化
Init_UART();                //中断初始化
Init_AD();                  //AD初始化

while(1)
{
    AD_AVR();
    TXREG = AD_VAL_AVR ;           //AD_VAL_AVR
    while(TRMT == 1);
    LED_G = 0;
    Delay_MS(500);
    LED_G = 1;
    Delay_MS(500);

}
}  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。