新闻资讯
广东省广州市番禺经济开发区
亚博体育赌篮球
来源:admin 时间:2019-12-10 浏览次数:

功用:STC12C2052AD AD转化C程序 +PWM输出功用 成功运用。

运用:AD检测电压进行过欠压维护+PWM把直流电压斩波成脉动直流。

板子功用:给手机电池充电。

降压用的LM317,小电流运用应该够了。没时间去买开关管,就用的9013开关。

图纸:

STC12C2052AD AD转化C程序 +PWM输出功用完成

//以下是成功了的程序。假如你需求运用在你自己的项目中,您只需求更改io就能直接运用了

//程序的完好版别下载地址:

#include //stc单片机专用的头文件

#include

#define uchar unsigned char

#define uint unsigned int

#define AD_SPEED 0x60 //0110,0000 1 1 270个时钟周期转化一次,

/************河北正定欢迎您! 少占鱼欢迎您!******************************/

//

sbit M=P1^5; //过压指示灯

sbit N=P1^3; //欠压指示灯

sbit LED=P1^7; //作业正常灯

sbit CONTRL=P3^4; //输出操控端

sbit PWM=P3^7;

/****************************************************************/

void pwm;

void delayms;

uint ADC;

void InitADC;

void baohu;

float voltage=0.0;

uint V;

float VCC=5.05;

uchar mtab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

/***8**************************************************************/

void main

{

CONTRL=0;//先封闭输出

delayms;

V=40; //这些是我过失的时分添上去的。意图在于弄理解究竟AD转化了没有。

voltage=4.0;//实践证明,替换数值没用,阐明没AD

LED=0;

CONTRL=1;

voltage=V*VCC/256.00*5.00;

delayms;

PWM=1;

CONTRL=1;//继电器作业,是维护状况

delayms;

M=0;

N=0;

LED=0;

delayms;

M=1;

N=1;

LED=1;

pwm;//发生PWM波形

delayms;

delayms;//延时

InitADC;

delayms;

V= ADC;

baohu;

while

{

V= ADC;

baohu;

delayms;

}

}

//

//

void pwm

{

//PCA模块作业于PWM形式 C程序

CMOD = 0x04; //用定时器0溢出做PCA脉冲

CL = 0x00; //PCA定时器低8位 地址:E9H

CH = 0x00; //PCA高8位 地址 F9H

CCON=0x00;

CCAP0L = 0x60; //PWM形式时他俩用来操控占空比

CCAP0H = 0x60; //0xff-0xc0=0x3f 64/256=25% 占空比

CCAPM0 = 0x42; //0100,0010 Setup PCA module 0 in PWM mode

// ECOM0=1使能比较 PWM0=1 使能CEX0脚用作脉宽调理输出

/*********************

PCA 模块作业形式设置

7 6 5 4 3 2 1 0

- ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn

选项: 0x00 无此操作

0x20 16位捕捉形式,由 CEXn上升沿触发

0x10 16位捕捉形式,由CEXn下降沿触发

0x30 16位捕捉形式,由CEXn的跳变触发

0x48 16位软件定时器

0x4c 16位高速输出

0x42 8位PWM输出

每个PCA模块别的还对应两个寄存器:CCAPnH和CCAPnL 。 捕获或许比较时,它们用来

保存16位计数值,当作业于PWM形式时,用来操控占空比

*******************************/

TMOD=0x02;

TH0=0x06;

TL0=0x06;

CR=1; //Start PCA TImer.

TR0=1;

}

//AD转化初始化 ----翻开ADC电源

void InitADC

{

P1=0xff;

ADC_CONTR|=0x80;

delayms;

//这两个寄存器用来设置 P1口四种状况,每一位对应一个P1引脚 ,按状况组合操作

/*****************

P1M0 和P1M1 寄存器位 7 6 5 4 3 2 1 0

P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

同理P3M0 P3M0 也是。由于STC12C2052AD只要两个P口,所以只要这俩组 STC12C5410AD还多P2M0 P1M0 有三组

P1M0 P1M1 高

0 0 一般I0口 P1寄存器位 7 6 5 4 3 2 1 0

0 1 强推挽输出 尽量少用 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

1 0 仅做输入 A/D转化时可用此形式

1 1 开漏 ,A/D转化时可用此形式

例如:

要设置P1.2为 AD 输进口

则 P1M0=0X02 ;

P1M1=0X02; 开漏即可

当不必AD时,最好 封闭ADC电源 ,康复为IO口状况

********************************/

P1M0=0x02;//这两个寄存器用来设置 P1口四种状况,每一位对应一个P1引脚 ,按状况组合操作

P1M1=0x02;//设置P1.1为开漏状况

}

// AD转化程序

/******************************************************

留意:这个函数里注释的指令是通用指令,能够针对一切AD通道运用,我这就认准了P1.1一个通道,所以直接

//赋值,省点 流量 !摧残我的问题就出在这个函数里的while等候句子

while //等候A/D转化完毕

{

if //0001,0000 测验A/D转化完毕否

{ break; }

}

这是能用的,我原来写的是:

while ;

这样写不能用,再说一遍:这样就不能用了!!

至于为嘛,由于 优先级, == 比 优先级高,

所以加个括号就能够了

while == 0 );

不常常用C言语,就会记不住啦!!!

由此得到一个经历;小问题影响功率

经历:常常加一加括号会死啊,好像也不耗 流量 吧!!

*********************************************/

uint ADC

{

ADC_DATA = 0; //铲除成果

ADC_CONTR = 0x60; //转化速度设置 0x60 最快速度

ADC_CONTR = 0xE0; //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位

ADC_CONTR =0xe1;

// ADC_CONTR |= 0x01; //挑选 A/D 当时通道 P1.1

delayms; //使输入电压到达安稳

ADC_CONTR = 0xe9;

// ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 发动A/D转化,

while //等候A/D转化完毕

{

if //0001,0000 测验A/D转化完毕否

{ break; }

}

ADC_CONTR =0xe1;

//ADC_CONTR = 0xE7; //1111,0111 清 ADC_FLAG 位, 封闭A/D转化,

return ADC_DATA; //回来 A/D 10 位转化成果

}

//

void baohu

{

voltage=V*VCC/256.00*5.00;

if

{ CONTRL=1;//过压维护 ,关断开关管操控端

M=0;

N=1;

LED=1;

}

if(voltage4.62 voltage

上一篇:上一篇:stc89c52单片机下的矩阵键盘程序

下一篇:下一篇:没有了