基于PIC16F876A单片机 AD电压测量程序 3路模拟3路数字输入 232通讯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<htc.h> //包含单片机内部资源预定义
#include<stdio.h>
__CONFIG(0x3b31);
#define uchar unsigned char
#define uint unsigned int
uint led_ct=0;//led状态存储
#define RXMAX 64 //长度64位
unsigned char pRx,RxBuf[RXMAX];//就收缓存函数
//延时函数
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
//初始化函数
void init()
{
TRISA=0XFF;
ADCON1=0x80;
// ADCON0=0x41;
TRISC=0XCF; //设置C口方向全为输出1100 0111 RC7 RC6串口模式必须设置为输出
SPBRG=25; //设置波特率
TXSTA=0X24; //使能串口发送,选择高速波特率
RCSTA=0X90; //使能串口工作,连续接收
RCIE=1; //使能接收中断
GIE=1; //开放全局中断
PEIE=1; //使能外部中断
delay(10);
}
//接受中断函数
void interrupt com(void)
{
if(RCIE&&RCIF)//判断是否为串口接收中断
{
if(pRx<RXMAX) RxBuf[pRx++]=RCREG;
RCIF=0;
}
}
/*===================================
命令代码处理函数
===================================*/
/*等待pRx(接收字节数)到某个数目,最多等待200ms.return:0=ok,1=error*/ unsigned char delay4bytes(unsigned char n)
{
unsigned char nms=0;
while(pRx<n)
{
nms++;
if(nms>100) return 1;
delay(2);
}
return 0;
}
//清除接受缓存区
void clrRxBuf(void)
{
while(pRx) RxBuf[pRx--]=0;RxBuf[0]=0;pRx=0;
}
uint getad0() //模拟通道1
{
uint i=0,a,adval0;
for(a=0;a<30;a++)
{
ADCON0=0x41; //0100 0001
GO=1;
delay(1);
while(GO);
adval0=ADRESH;//00000000 00000011
adval0=adval0<<8|ADRESL;//00000011 11111111
adval0=adval0/4;
i=i+adval0;
}
adval0=i/30;
return (adval0);
}
uint getad1()//模拟通道2
{
uint i=0,a,adval1;
for(a=0;a<30;a++)
{
ADCON0=0x49; //0100 1001
GO=1;
delay(1);
while(GO);
adval1=ADRESH;//00000000 00000011
adval1=adval1<<8|ADRESL;//00000011 11111111
adval1=adval1/4;
i=i+adval1;
}
adval1=i/30;
return (adval1);
}
uint getad2()//模拟通道3
{
uint i=0,a,adval2;
for(a=0;a<30;a++)
{
ADCON0=0x51; //0100 0001
GO=1;
delay(1);
while(GO);
adval2=ADRESH;//00000000 00000011
adval2=adval2<<8|ADRESL;//00000011 11111111
adval2=adval2/4;
i=i+adval2;
}
adval2=i/30;
return (adval2);
}
uint getad3()//数字通道1
{
uint adval3;
if(RC1==1)
adval3=0xAA;
if(RC1==0)
adval3=0x00;
return (adval3);
}
uint getad4()//数字通道2
{
uint adval4;
if(RC2==1)
adval4=0xAA;
if(RC2==0)
adval4=0x00;
return (adval4);
}
uint getad5()//数字通道3
{
uint adval5;
if(RC3==1)
adval5=0xAA;
if(RC3==0)
adval5=0x00;
return (adval5);
}
void main()
{
int temp[6];
init();
while(1) //等待中断
{
led_ct++;
if(led_ct<50) RC4=0;
else if(led_ct<100) RC4=1; else led_ct=0;//依据led变量的状态,改变led控制脚
if(pRx)//如果有接收字节
{
if(RxBuf[0]==0xab)
{
if(!delay4bytes(2))
{
//等待接收到5个字节,如果超时则不处理,清除缓冲区
if(RxBuf[1]==0x42)
{
while(1)
{
while(GO)
ADCON0=0x41;
delay(1);
temp[0]=getad0();
delay(10);
while(GO)
ADCON0=0x49;
delay(1);
temp[1]=getad1();
delay(1);
while(GO)
ADCON0=0x51;
delay(1);
temp[2]=getad2();
delay(1);
temp[3]=getad3();
delay(1);
temp[4]=getad4();
delay(1);
temp[5]=getad5();
delay(1);
TXREG=79;delay(1);
TXREG=75;delay(1);
TXREG=temp[0];delay(1);
TXREG=temp[1];delay(1);
TXREG=temp[2];delay(1);
TXREG=temp[3];delay(1);
TXREG=temp[4];delay(1);
TXREG=temp[5];delay(1);
clrRxBuf(); delay(500);
if(pRx)//如果有接收字节
{
if(RxBuf[0]==0xab)
{
if(!delay4bytes(2))
{
//等待接收到5个字节,如果超时则不处理,清除缓冲区
if(RxBuf[1]==0x43)
{
// asm("goto 0");
asm("ljmp 0");
}
}
}
}
}
}
}
}
// clrRxBuf();
}
}
}。