标题:
STC单片机的PWM,AD采集测试程序
[打印本页]
作者:
51黑芯片
时间:
2016-1-17 04:00
标题:
STC单片机的PWM,AD采集测试程序
/*******************************************************************
*工程名称: STC的PWM,AD采集测试
*创建人: 张大伟
*创建时间: 2012年5月19号
*隶属模块: STC.C
*产考资料:STC手册
*模块说明: STC8位PWM测试,上电以后LED出现呼吸灯效应。 采集一路电压,设定3个稳压值分别是1V,3.3V ,4.2V,让单片机通过AD采集后
驱动PWM0控制稳压电路出现一个设定值。稳压电路用一个采样电阻连接到AD的采样端这样形成一个闭环系统、!
********************************************************************/
#include <STC12C52.H>
/*******************************************************************
*函数名称:
*入口参数:
*出口参数:
*函数说明: 全局变量和位定义
********************************************************************/
#define unchar unsigned char
#define unint unsigned int
#define DUTYCYCLE(x) (256-(128*x/50))//占空比计算公式256-(80/x=50/128)=XX, ** 占空比**
#define PDXBIT(x) (0x01<<x)
#define REGBIT(x) (0x01<<x)
unchar yi=1;
unchar er=0;
sbit KEY1=P3^4;
unint CYCLE;
/*******************************************************************
*函数名称: void Delay(unint x)
*入口参数: x:延时长度
*出口参数:
*函数说明: 不精确的延时
********************************************************************/
void Delay(unint x) //延时子函数
{
unint y; //定义一个Y变量
for(;x>0;x--) //如果X大于0,那么X就减1.
for(y=500;y>0;y--);//给Y赋值为500,当Y大于0那么Y就减1. *******注意前面的for的语句后面没有引号,那么会把后面的FOR语句
//也认为是他的内部语句。也就是说X执行一次那么Y就得执行500次。
}
/*******************************************************************
*函数名称: void MainInt()
*入口参数:
*出口参数:
*函数说明: 主函数初始化
****************************** **************************************/
void MainInt() //
{
//P4SW|==REGBIT(4);//将P4口设置为输出
//AUXR1|=REGBIT(6);//将PWM0和PWM1从P1.3/P1.4移到P4.2/P4.3
P1M1=0x00;
P1M0|=REGBIT(4)|REGBIT(3);//设置P1.4,3口为强推挽输出
CMOD|=REGBIT(1);//选择SYSCLK为PWM的时钟源//控制PWM波的频率
CCAPM0|=REGBIT(1)|REGBIT(6);//允许比较器功能,开启PWM0
CCAPM1|=REGBIT(1)|REGBIT(6);//允许比较器功能,开启PWM1
CL=0x00;//计数器清零
CH=0x00;
CCAP0L=0x00;//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
CCAP0H=0x00; // CCAPOL CCAPOH 为PWM0的最高占空比和最低占空比。
CCAP1L=0x00; //猜也猜到了这个是PWM1的低占空比。
CCAP1H=0x00; //这个也是我猜的哈哈PWM1的高占空比。
CCON|=REGBIT(6);//启动PWM
}
/*******************************************************************
*函数名称: void KeyScan(void)
*入口参数:
*出口参数:
*函数说明: 按键检查函数,用来调节PWM的占空比0%-100%
********************************************************************/
void KeyScan(void)
{
if(KEY1==0)
{
Delay(500);
if(KEY1==0);
CYCLE+=1;
if(CYCLE>100)
CYCLE=0;
CCAP0L=DUTYCYCLE(CYCLE);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
CCAP0H=DUTYCYCLE(CYCLE);//占空比计算公式256-(80/x=50/128)=XX,
CCAP1L=DUTYCYCLE(CYCLE);
CCAP1H=DUTYCYCLE(CYCLE);
}
}
/*******************************************************************
*函数名称: void main(void)
*入口参数:
*出口参数:
*函数说明: 主函数
********************************************************************/
void main(void)
{
MainInt();
CYCLE=100;
while(1)
{
//****************下面语句是不断加减CYCLE的数值来调节占空比输出的。
if(yi==1)
{
Delay(30);
CYCLE--;
if(CYCLE==1)
er=1,yi=0;
}
if(er==1)
{
Delay(50);
CYCLE++;
if(CYCLE==100)
er=0,yi=1;
}
CCAP0L=DUTYCYCLE(CYCLE);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
CCAP0H=DUTYCYCLE(CYCLE);//占空比计算公式256-(80/x=50/128)=XX,
CCAP1L=DUTYCYCLE(CYCLE);
CCAP1H=DUTYCYCLE(CYCLE);
}
}
复制代码
作者:
阿飞7812
时间:
2021-10-4 15:29
楼主谢谢你的分享最近在学这个 主要是AD部分能发过完整的吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1