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

📄 ad2.c

📁 串口通信
💻 C
字号:
#include<reg52.h>
#include<stdio.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
sbit test=P1^2;
sbit actuate=P2^1;

//定义控制AD转换的寄存器
//******************************
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr AD_Control=0xc5;
sfr AD_Data=0xc6;
//sfr ADC_Low2=0xbe;
//******************************
uchar advalue=0x01;
uchar ad_T=0x32;
uchar control=0x00;
void delay1ms(uint f);
void AD_init();
void serial_init();


//主程序
void main()
{actuate=0;
 AD_init();
 serial_init();  //初始化串口 
 AD_Control=AD_Control | 0x08;                //启动AD,置START位
 while(1)
  {			
   if((AD_Control & 0x10)==0x10)              //判断标志位FLAG
     {advalue=AD_Data;                        //读取转换数据
      //SBUF=advalue;
      AD_Control=AD_Control & 0xe7;           //将标志位清零
      AD_Control=AD_Control | 0x08;           //转换完成后,再次启动AD     
     }
   else
     test=0;
   }
}

//***************************
//1ms延时函数
void delay1ms(uint f)
{
 uint i,j;
 for(i=0;i<f;i++)
 for(j=0;j<120;j++);
}


//***************************
//串口初始化函数,定时器0初始化 
void serial_init()
{
 SCON=0x50;               //方式1,10位异步收发,波特率由定时器控制,单机对单机,允许接收      
 PCON=0x00;               //SMOD=0,方式1、2、3的波特率不加倍
 TMOD=0x21;               //定时器1工作于方式2,自动装载方式,定时器0工作于方式1,16位加1
 TH0=0x00;
 TH1=0xb8;                //设置定时器初值,定时20ms
 TL1=0xfd;                //设置定时器装载值,来设置波特率
 TH1=0xfd;
 //TR0=1;                 //启动定时器T0
 TR1=1;                  //启动定时器T1
//TI=1;                  //有发送中断,发送中断标志
//RI=1;                  //有接收中断,接收中断标志
 ET0=1;                 //开T0中断
 ES=1;		 			 //	开串口中断
 EA=1;                   //开总中断
}


//**************************
//AD初始化函数
void AD_init()
{P1M0=0x01;              //set the P1 working moduel
 P1M1=0x01;              //set P10 as AD convert channel   
 AD_Control=0xc0;
 //启动AD前必须确认AD电源已经打开,初次打开AD电源,需适当延时,等电源稳定后再启动AD
 //AD转换完成后,ADC_FLAG=1,需软件清零
 //ADC_START设置为1时,开始转换,转换结束后为0
 delay1ms(2);          //delay to besure the AD power is OK 
} 


//**************************
//AD convert function (start ad out of this function)
/*void adconvert()
{if((AD_Control & 0x10)==0x10)              //判断标志位FLAG,if flag==1,then adcovert over
   {advalue=AD_Data;                        //读取转换数据
    SBUF=advalue;
    AD_Control=AD_Control & 0xe7;           //将标志位清零
   }
    //{test=0;}                       //when adconvert have not finished,just wait
//AD_Control=AD_Control | 0x08;           //转换完成后,AD_start be set 0, need to restart     
}*/



//发送操作在TI=0时,执行SBUF=A指令后开始,然后发送电路自动在8位
//发送字符前后分别添加一位起始位和停止位,发送完后,TI由硬件在
//发送停止后置位
//在一定条件下,向SBUF写入数据就启动了发送过程,
//接收过程是自动进行的
//***************************
//串口中断函数
void serial () interrupt 4 using 3     //串口接收发送中断程序
{EA=0;       //close the main interrupt to sure this func successful 
if(RI)       //接收完一帧数据后,硬件自动置1,如果再接收必须
  {RI=0;        //软件清零RI
   control=SBUF;
   if(control==0x01)
     SBUF=advalue;
   else if(control==0x02)
     actuate=1;
   else if(control==0x03)
     actuate=0;
   }
if(TI)      //发送完一帧数据后,硬件自动置1,如果再发送必须
  {TI=0;    //软件清零TI
  }          
EA=1;
}


/*void timer0() interrupt 1 using 1
{EA=0;
 TH0=0x00;
 TH1=0xb8;
 ad_T=ad_T-1;
 if(ad_T==0)
   {AD_Control=AD_Control | 0x08;    //每秒钟启动AD一次
    delay1ms(1);
    adconvert();                    //wait for reading the addata
    //SBUF=advalue;                   //send the advalue through serial channel
    ad_T=0x32;
   }
 EA=1;
}  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -