📄 ad2.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 + -