#include <REG51.H> //REG51中不包括相关特殊寄存器,需要另外声明
#include <intrins.H>
#include "math.h" //运算函数头文件
#define uint unsigned int
#define uchar unsigned char
/*---------------------------------
(采用STC15系列头文件不需要以下声明)
----------------------------------*/
sfr P1M0 =0x92; //0000,0000 声明端口1模式寄存器0
sfr P1M1 =0x91; //0000,0000 声明端口1模式寄存器1
sfr ADC_CONTR =0xBC; //ADC control register (ADC控制寄存器)
sfr ADC_RES =0xBD; //ADC 8-bit result register (8位ADC结果寄存器)
sfr ADC_RESL =0xBE; //0000,0000 A/D转换结果低2位
sfr P1ASF =0x9D; //P1 secondary function control register (声明P1辅助功能控制寄存器)
sfr CLK_DIVPCON2=0X97; //时钟分频寄存器
/*--------------------------------------
Define ADC operation const for ADC_CONTR
(ADC操作常量定义ADC_CONTR)
---------------------------------------*/
#define ADC_POWER 0x80 //ADC power control dit (宏定义ADC电源控制位)1000 0000
#define ADC_FLAG 0x10 //ADC complete flag (宏定义ADC完成标志位) 0001 0000
#define ADC_START 0x08 //ADC start control dit (宏定义ADC启动控制位)0000 1000
#define ADC_SPEEDLL 0x00 //420 clocks (宏定义420时钟)速度控制 0000 0000
#define ADC_SPEEDL 0x20 //280 clocks (宏定义280时钟)速度控制 0001 0000
#define ADC_SPEEDH 0x40 //140 clocks (宏定义140时钟)速度控制 0010 0000
#define ADC_SPEEDHH 0x60 //070 clocks (宏定义70时钟)速度控制 0011 0000
// (宏定义70时钟)设置转换结果存储为高8位+低2位 0000 0000
#define N 24
uchar num,num1,num2;
uint result;
sbit LED=P1^5;
sbit Vgs=P1^2;
sbit bh=P3^3;
void InitADC();
uint zhADC(uchar ch);
void delayms(uint k);
//char filter();
void SR();
void main()
{
CLK_DIVPCON2=0;
P1M1 = 0x01; //P1.0高阻 P1.1强推挽:0000 0001 ADC输入高阻、继电器强上拉
P1M0 = 0x02; //P1.0高阻 P1.1强推挽:0000 0010 ADC输入高阻、继电器强上拉
LED=1; //驱动继电器端口初始化0
InitADC(); //Init ADC sfr (初始化ADC SFR)
bh=1;
Vgs=1;
while(1)
{
SR(); //执行转换结果子程序
}
}/*
/*----------------------------
初始化ADC
-----------------------------*/
void InitADC()
{
P1ASF=0x03; //设置P1.0,P1.1端口作为模拟输入
ADC_RES=0; //Clear previous result (清除以前的结果)
ADC_RESL=0; //Clear previous result (清除以前的结果)
ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //开启ACD电源、设置转换速度 寄存器值见宏定义
delayms(5); //上电延时
}
/*----------------------------
Get ADC Result(获取ADC结果)
-----------------------------*/
uint zhADC(uchar ch) //zhADC(获取ADC结果) ch为通道号
{
double fSum = 0;
char i;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START; //见宏定义 启动转换 ADC_Power SPEED1 SPEED0 AD_FLAG ADC_START CHS2 CHS1 CHS0 按位或
_nop_(); //4个时钟延时
_nop_(); //0X80|0X00|0X00|0X08 1000 1000
_nop_(); // 0X01 1000 1001
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //wait complete flag(等待完成标志)
ADC_CONTR &=~ADC_FLAG; //Close ADC(关闭ADC)
result=ADC_RES*4+ADC_RESL; //Return ADC result(返回ADC结果) 读取高8位和低2位转换数据,ADC_DATA*4 是将数据左移2位,10位数据
for(i=0; i<N; ++i)
fSum += result * result;
return sqrt(fSum/N); // 平均, 开方
}
/*----------------------------
1ms延时子程序(12M晶振)
-----------------------------*/
void delayms(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=747;j>0;j--);
}
void SR()
{
// uchar H,M,L;
uint V8,I10mv,V6,V7,V9;
V6=0X88; //1024*Vin/VCC(4.1V,电阻分压)=0x348
I10mv=0x28; //1024*Vin/VCC(0.015V)=0x267
V7=0XA0;
V8=0XB0; //100mV 十进制数改为27 1.1V==250(十进制),实测最大值1.03V
V9=0XBE; //1024*Vin/VCC(3V,电阻分压)=0x267
if(zhADC(0)<=V6)
{
LED=0;
num1++;
if(num1>=200)
{
num1=199;
while(!(zhADC(0)>=(V6+6)))
{
Vgs=1;
LED=0;
delayms(200);
LED=1;
delayms(200);
}
}
}
else
{
num1=0;
Vgs=0;
if(zhADC(1)<=I10mv)
{
num2++;
if(num2>=250)
{
num2=249;
LED=1;
while(!((zhADC(0)<=V7)||(zhADC(0)>=V9)));
if(zhADC(0)>=V9)
Vgs=0;
}
}
else
{
num=0;
LED=0;
delayms(700);
LED=1;
delayms(680);
}
}
}
STC15W404AS_ADC应用程序
需积分: 13 109 浏览量
2022-08-07
11:27:06
上传
评论
收藏 4KB RAR 举报
weixin_45564246
- 粉丝: 0
- 资源: 4
最新资源
- Docker nginx镜像
- 马桶人逆袭的多元宇宙!!!
- 儿童节快乐代码.rar
- 资源专区-小白必看-电赛资源-电赛资源&PPT&代码及视频讲解
- 基于小型足球机器人仿真平台完成dwa、rrt+dwa、A-star+dwa及rrt+feedback算法
- 基于STM32F103C8T6 、FREERTOS、AD5263(SPI接口)的数字电位器应用设计proteus仿真
- 资源专区-小白必看-网络安全资源-网络安全资料题整理
- 基于STM32F103C8T6 、FREERTOS、AD5263(SPI接口)的数字电位器应用设计proteus仿真
- 每日随机一发素材:)!
- matlab GUI仿真代码.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0