用PIC12LF1822AN1做串口转换,AD结果高8位通过串口发送,每隔5、6个出现一个数据异常,分析不出哪出的问题
原文件:MPLAB8.70 proteus7.10 1.原文件:
1822_AD_UART.rar
(6.08 MB, 下载次数: 5)
proteus7.10 MPLAB8.70
2.串口截图:
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);
}
}
一周热门 更多>