求一个单片机STC12C5410ADPWM的程序

通过按键P2.5 P2.6调节占空比 ,P3.7输出pwm,外部晶振是24Mhz。不会修改程序,望好心人帮帮忙
STC12C5410AD的pwm程序

我有一程序,用STC5410单片机,是真正硬件PWM 可20档调光并用液晶屏显示级数,当然可以去掉显示程序
#include<STC12C54.H>
#define uchar unsigned char
#define uint unsigned int
uchar vx=10;//vx=10 在上电时为半亮度状态,可根据自己的用途及要求任意设定 vx=20为最亮

sbit rw=P1^4;
sbit rs=P1^3;
sbit lcden=P1^5;
sbit s2=P2^5;
sbit s3=P2^6;
sbit led=P3^7;//可以不要,,因PWM0输出对应的就是P3^7
#define db P2

void Delay1ms(uint i) //1ms延时程序,并不要很准,因我是两个程序凑一块的,
//所以有两个延时函数,可和后面的延时函数合并
{
uint j;
for(;i>0;i--)
{
for(j=0;j<250;j++)
{;}
}
}

void write_com(uchar com) //向LCD1602写命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10);
lcden=1;
Delay1ms(10);
lcden=0;
}
void write_date(uchar date) //向LCD1602写数据
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10);
lcden=1;
Delay1ms(10);
lcden=0;
}
void init2()//液晶屏初始化
{
rw=0;
write_com(0x38);
Delay1ms(10);
write_com(0x0f);
Delay1ms(10);
write_com(0x06);
Delay1ms(10);
write_com(0x01);
Delay1ms(10);
}

void display_brightness (uchar temp1) //显示程序 显示当前 调光工作级数
{
uchar A1,A2;
init2();
A1=temp1/10;
A2=temp1%10;
write_com(0x80);
Delay1ms(10);
write_date(0x30+A1);
write_com(0x81);
Delay1ms(10);
write_date(0x30+A2);
}

/*******************************************************************************/
void PWM_init (void){//PWM初始化函数
//CMOD=0x02; //设置PCA定时器 时钟 fosc/2
CMOD=0x00; //设置PCA定时器 时钟 fosc/12 24/12=2MHZ PWM频率1/256 =1/128 MHz      //周期 128US
CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
CCAP0L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP0H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
/******************************************************************************/
void PWM1_set (uchar a){//PWM1占空比设置函数
CCAP0L=a; //设置值直接写入CCAP1L
CCAP0H=a; //设置值直接写入CCAP1H
}
/*****************************************************************************/
void DelayM(unsigned int a){//延时函数 1mS/次(用于1T单片机)
unsigned char n,i,j;
while(--a!=0){
for(n=1;n>0;n--)
for(j=222;j>0;j--)
for(i=12;i>0;i--);
}
/****************************************************************************/
void main(void)
{
s2= 1;
s3 = 1;
PWM_init ();
display_brightness (vx);
while(1)
{
PWM1_set(vx*12);//数字12是配合vx调试取得的,此时vx的赋值范围约为1-20对应最暗-最亮
if (s2 == 0 )//--------减调整---------//
{
DelayM(20); //延时20毫秒消抖动
if(s2 == 0) //如果20MS后 s2还是0状态则确认下调键是按下的
{
vx--;
if(vx<1) //如果设定vx=20,将语句改为if(vx<1){vx=10;}则为单按键循环控制,则可去除加调整控制部分
{
vx=10;
}
}
display_brightness (vx);
while(s2 == 0);//等待键松开
}
if (s3== 0 ) //--------加调整---------//
{
DelayM(20);
if(s3 == 0)
{
vx++;
if(vx>20)
{
vx=10;
}
}
display_brightness (vx);
while(s3 == 0);
}
}
}追问

编译不了的?

追答

编译通不过?可能你没有STC头文件,普通51 / 52单片是无硬件PWM功能的,所以不能用51/52的头文件 STC网站上有头文件的,我也可给你发,直接复制到工程文件夹下或加到KEIL-C51- INC文件夹下,若复制到工程文件夹下#include语句尖括号最好改成双引号
 另外,若你直接从网上复制粘贴代码由于格式问题可能会有乱码,要了我也可给你发

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-05-12
你的程序了?追问

我的一个程序不能输出pwm波,想放在网上,可是超过字数了,放不上去,所以想请你们帮我写一个

追答

#include

sbit LED = P3^7;
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms
unsigned char PWM_ON ;//定义高电平时间
void delay(unsigned int cnt)
{
while(--cnt);
}

main()
{
bit Flag;

TMOD |=0x01;//定时器设置 0.1ms in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定时0.1mS
IE= 0x82; //打开中断
TR0=1;

CYCLE = 10;// 时间可以调整
while(!Flag)
{
delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果
PWM_ON++; //这个使用较长延时,以便能看清楚变化过程
if(PWM_ON == CYCLE)
{
Flag=1;
}
}

while(Flag) //亮度递减 同上
{
delay(20000);
PWM_ON--;
if(PWM_ON == 0)
{
Flag=0;
}
}
}
/********************************/
/* 定时中断 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定时0.1mS

if (count==PWM_ON)
{
LED = 1; //灯灭
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右时间是0 保持原来状态
LED = 0;//灯亮

}

}
这个是pwm占空比自动调整的一个程序,你先试试。完了看程序,看明白了,就可以手动用两个按键来调节占空比了。
忘采纳!!

追问

可以帮我加按键调节占空比上去不,频率要达到30Khz

第2个回答  2014-05-12
电子竞赛?