📄 ad.c
字号:
/*----------------------------------------------
通讯+采集,程序可以使用
发送方式与“1”有点不同
----------------------------------------------*/
#include <aduc841.h>
#define CTH1 0xfd //定时期1,波特率设置9600
#define CTL1 0xfd
#define CTH0 0xee //定时期0,5ms
#define CTL0 0x00
#define uchar unsigned char
#define uint unsigned int
sbit P37=P3^7;
uint senddata=0;//发送的数据
uchar sendbuf[2]={0,0}; //发送的数据缓冲
uchar delay1=0; //延时采集
bit flag1=0; //发送标志
uchar sum=0; //采集多次之和
uint i=0;
//--------------------------------------------------------
uint adc(uchar temp); //ADC采集函数
void send(uchar num ,uchar *add); //发送
//--------------------------------------------------------
/*------------------------------------------------------
发送程序,num为发送字节的个数,add为指向发送数据的指针
------------------------------------------------------*/
void send(uchar num ,uchar *add)
{
for(num=0;num<2;num++)
{
SBUF=*(add+num);
while(TI==0);//等待完毕,为下一次做准备
TI=0;
}
flag1=0;//发送启动标志 */
}
/*------------------------------------------------------
该段程序完成的是,对指定通道的采集,和滤波处理TEMP的值
在0~7之间
------------------------------------------------------*/
uint adc(uchar chinnels) //通道选择
{
uint da=0,max=0,min=0,count=0;
long int sum=0;
for(count=0;count<1000;count++) //10次采集和滤波
{
ADCCON2=chinnels;
SCONV=1; //单次AD转换使能,“1”有效,转换完后由硬件清零
while((ADCCON3&0x80)==0x80); //检测转化是否完毕
da=ADCDATAH&0x0f;
da=(da<<8)+ADCDATAL;
sum=sum+da;
if(count==1) { max=da;min=da;}
else if(max<da) max=da;
else if(min>da) min=da;
}
return (sum-max-min)/998;
}
/*------------------------------------------------------
定时期0
------------------------------------------------------*/
void time0(void)interrupt 1 //5ms
{
TH0=CTH0;
TL0=CTL0;
MDO=1;
for(i=0;i<2;i++){
delay1++; //采集时间
if(delay1>200)
{
delay1=0; MDO=0;
flag1=0;
senddata=adc(i);
sendbuf[0]=(senddata&0xf00)>>8;
sendbuf[1]=senddata&0x0ff;
flag1=1;}//发送启动标志
}
}
/*------------------------------------------------------
串口发送中断
------------------------------------------------------*/
void com1(void)interrupt 4
{
}
/*------------------------------------------------------
主程序
------------------------------------------------------*/
main()
{
I2CCON=0XFF;
MDE=1;
TMOD=0x21; //定时期1设置为方式2(自动添装),定时期0为方式1(16位计数)
TH1=CTH1;
TL1=CTL1;
TH0=CTH0;
TL0=CTL0;
SCON=0x50; //串口通讯方式1,“1+8+1”
PCON=0;
TR1=1; //定时器1启动
TR0=1; //定时器0启动
ADCCON1=0x64; //对AD的基本设置
MDE=1;
I2CM=1;
RI=0;
TI=0;
ET0=1; //允许定时器0中断
ES=1; //串口中断允许
EA=1; //总中断
while(1)
{
if(flag1==1) //发送启动标志
{P37=1;MCO=0;MDO=1;
send(2,&sendbuf[0]);
P37=0;MCO=1;MCO=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -