STC12C5A系列内置AD PWM(频率可调)串口发送
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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()
{