STC12C5A系列内置AD PWM(频率可调)串口发送

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include"stc12c5a.h"

#include"intrins.h"

#define uchar unsigned char

//------------------------------------------------------------------------------

void AD_init(); //AD初始化函数

void delay(unsigned int a); //延时函数(1ms)

float AD_work(unsigned char channel); //AD数值处理函数

unsigned int AD_get(unsigned char channel); //AD转换函数

void PCA(); //设置PWM输出函数

unsigned char ge1,n1,m1,aa,num,pwm;

int V,temp1;

sbit key1=P0^1;

sbit key2=P0^2;

//------------------------------------------------------------------------------

void send(uchar data1)

{

ES=0; //关闭中断

TI=0;

SBUF=data1;

while(!TI); //等待发送完成

TI=0; //中断标志位清0

ES=1; //打开中断

}

void chuankou() //串口发送AD

{

temp1=V;

ge1=temp1/1000;

m1=(temp1%1000)/100;

n1=((temp1%1000)%100)/10;

send(ge1+48); //因为0对应的ASCII码是48,所以要+48 send('.');

send(m1+48);

send(n1+48);

send('V');

send(' ');

}

//------------------------------------------------------------------------------

unsigned int AD_get(unsigned char channel)

{

ADC_CONTR=0x88|channel; //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0

_nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器

while(!(ADC_CONTR&0x10)); //等待转换完成

ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0

return(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)

}

//------------------------------------------------------------------------------

float AD_work(unsigned char channel)

{

double AD_val,AD_vale; //定义处理后的数值AD_val为浮点数

unsigned char i;

for(i=0;i<100;i++)

AD_val+=AD_get(channel); //转换100次求平均值(提高精度)

AD_val/=100;

AD_vale=(AD_val*5000)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值

V=AD_vale;

return V;

}

//------------------------------------------------------------------------------

void delay(unsigned int a) //延时约1ms

{

unsigned int i;

while (--a!=0)

for(i=600;i>0;i--);

}

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------

void AD_init()

{

P1ASF=0x01; //P1口全部作为模拟功能AD使用

ADC_RES=0; //清零转换结果寄存器高8位

ADC_RESL=0; //清零转换结果寄存器低2位

ADC_CONTR=0x80;//开启AD电源

delay(2); //等待1ms,让AD电源稳定

}

void anjian()

if(pwm!=100) //占空比加到100不继续加

{

if(key1==0)

{

delay(10);

if(key1==0)

{

pwm++;

aa=1;

while(!key1);

}

}

}

if(pwm!=0) //减到0不继续减

{

if(key2==0)

{

delay(10);

if(key2==0)

{

aa=1;

pwm--;

while(!key2);

}

}

}

}

void PCA()

{

CCON=0;

CL=0;

CH=0;

CMOD=0X04; //选择脉冲源为计时器0 CCAP0H=128; //占空比初值为50%

CCAP0L=128;

CCAPM0=0X42;

CR=1; //开启PWM

}

void main()

{

相关文档
最新文档