第一范文网 - 专业文章范例文档资料分享平台

STC12C5A60S2程序实现0-256分之一晶振任意频率PWM输出

来源:用户分享 时间:2020-06-08 本文由傲晴 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

//头文件STC12C5A.h可在网上下载 #include \#define uint unsigned int #define uchar unsigned char uchar t=0;

sbit sign=CCON^2;//此位为预留位置,开发用作表示振动片工作模式,0为一

//般模式,1为ADC模式

void init_T0(void);//初始化T0 void init_T1(void);//初始化[T1

void init_INT0(void);//初始化外部中断0 void init_INT1(void);//初始化外部中断1 void init_PCA(void);//初始化PCA模块 void init_ADC(void);//初始化A/D转化模块 void main(void) {

sign=0;//默认工作在固定模式 P17=1;//开始时P3^0输出为高电平 EA=1;//开总中断

init_T0();//初始化T0 init_T1();//初始化T1

init_INT0();//初始化外部中断0 init_INT1();//初始化外部中断1 init_PCA();//初始化PCA模块 CR=1; //开启PCA计数器 init_ADC(); //初始化A/D转化模块 while(1) {

if(sign==1) //工作在ADC模式 {

if(ADC_CONTR&ADC_FLAG!=0)//转换结束 {

TH0=ADC_RES; //溢出率与初值成正比 TL0=ADC_RES;

ADC_CONTR=ADC_CONTR & 0xE7;//将ADC_FLAG(转换结 //束标志位)与ADC_START清零,其余位不变

ADC_CONTR=ADC_CONTR | 0x08;//将ADC_START置1 }

} else {

TH0=0x30; }

TL0=0x30;

//输出一固定频率的PWM波

//工作在固定模式

}

}

void init_T0(void)//T0做PCA的时钟源输入 { }

void init_T1(void)//T1定时100ms,用于产生呼气吸气脉冲 {

TMOD=TMOD|0x10;//设置定时器1的工作方式为方式2且不改变定时

//通过改变定时器0溢出率实现可调频率的PWM输出

TMOD=0x02; //定时器0工作在方式2,8位定时计数器自动重装载 TH0=0x80; //设置T0定时所对应的初值 TL0=0x80; //设置T0每次定时结束后重装载的值 ET0=1; TR0=1;

//允许定时器0中断 //定时器0开始计数

器0的工作方式

TH1=0x3c; //设置定时100ms的处初值 TL1=0xb0;

}

ET1=1; //允许定时器1中断

TR1=1; //定时器1开始计数

void init_INT0(void) { }

void init_INT1(void) { }

void init_PCA(void) {

CMOD=0x04; //CIDL=0(D7):空闲模式下继续计数,D4~D6不用

//CPS2/CPS1/CPS0(D3~D1)=010,选择T0做PCA时钟源输入

//ECF(D0)=0,关PCA计数器溢出中断

IT1=1; //由下降沿触发,输入引脚P3^3 EX1=1; //开外部中断1 IT0=1; EX0=1;

//由下降沿触发,输入引脚P3^2 //开外部中断0

CCF1=0; //清零PCA模块1中断标志位 CCF0=0; //清零PCA模块0中断标志位 CR=0; //关闭PCA计数器 CH=0;

//PCA计数器高8位置零

CL=0; //PCA计数器低8位置零

CCAPM0=0X42;//PCA模块0的工作模式寄存器设置为0X42表示8位

PWM无中断

}

void init_ADC(void)

CCAP0H=0x80; //设置PWM波的占空比为0.5

CCAP0L=0x80; //溢出后会将CCAP0H中值赋给CCAP0L

CCAPM1=0x31; //PCA模块1扩展为上升沿下降沿均可触发的外部中断

{

uint i;

for(i=10000;i!=0;i--)//若晶振为6MHZ,是延时20ms等待ADC模块内部

模拟电源稳定

}

void INT0_ISR(void) interrupt 0 //外部中断0服务程序 { }

void INT1_ISR(void) interrupt 2 //外部中断1服务程序 { }

void T1_ISR(void) interrupt 3 //定时器1中断服务程序 {

{;}

ADC_CONTR=0x80;//开ADC模块电源并选择P1^0作为模拟量输入引

P1ASF=0x01; //P1口模拟量功能设置寄存器:使用P1^0的模拟量功

AUXR1=AUXR1 & 0xfb;//ADRJ=0,ADC_RES存放A/D转换结果高8位

//ADC_RESL存放A/D转换结果低8位

ADC_RES=0; //检测前将其清零 ADC_RESL=0; //检测前将其清零 EADC=1; //开A/D转换中断

sign=0; //工作在固定模式

ADC_CONTR=ADC_CONTR&0xF7;//关闭ADC电源

sign=1; //工作在ADC模式

ADC_CONTR|=0x08; //打开ADC电源,由用户决定PWM频率

TH1=0x3C; //工作在方式1溢出后不能自动重装载 TL1=0xB0; t++;

}

if(t==20)

//2s后输出低电平

P17=!P17;

if(t==50) { }

t=0; //5s为一个周期 P17=!P17;

void PCA_ISR(void) interrupt 7 { 发

}

if(CCF1==1) {

//PCA模块1中断响应

if(P14==0)//判断是上升沿触发还是下降沿触发,等于0为下降沿触

{ } else { } CCF1=0;

CCAP0H=0xFF; //PWM输出低电平 CCAP0L=0xFF;

//上升沿触发 while(t!=25); //延时0.5s

CCAP0H=0x80; //设置PWM波的占空比为0.5 CCAP0L=0x80;

else }

CCF0=0;//防止干扰信号误动作

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新IT计算机STC12C5A60S2程序实现0-256分之一晶振任意频率PWM输出 全文阅读和word下载服务。

STC12C5A60S2程序实现0-256分之一晶振任意频率PWM输出 .doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1077694.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top