⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad.c

📁 利用带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 + -