下面是我用STC12C5A60S2 写的一个PWM波形的程序,现在是能发送出一个正常的PWM波形。
我在程序的后面还假如的按键增加或减少占空比。但是这个占空比却不能调整。
麻烦各位能给我指点一下程序的错误在哪里
还有一个是在 void PWM0_set (uchar z) 这个语句中有一个警告。我没有搞懂警告是什么意思
谢谢了
#include<STC12C5A60S2.H> //头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar z;
uchar keyval;
sbit S1=P2^0; //将S1位定义为P2.0引脚
sbit S2=P2^1; //将S2位定义为P2.1引脚
/*******************************************************************/
/* */
/* 延时子程序 20M晶振 1MS */
/* */
/*******************************************************************/
void delay(uint time)
{
int a,y;
for(a=time;a>0;a--)
for(y=206;y>0;y--);
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:PWM0占空比设置函数
调 用:PWM0_set();
参 数:0x00~0xFF(亦可用0~255)
返回值:无
结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
/**********************************************************************************************/
void PWM0_set (uchar z)
{
CCAP0L= z; //设置值直接写入CCAP0L
CCAP0H= z; //设置值直接写入CCAP0H
}
/*************************************************
函数功能:按键按下 占空比增加
**************************************************/
void duty_cycle_add()
{
z=z+10;
}
/*************************************************
函数功能:按键按下 占空比减少
**************************************************/
void duty_cycle_reduce()
{
z=z-10;
}
void main()
{
CCON=0; //初始化PCA控制寄存器,清除CF
CL=0;
CH=0;
CMOD=0x00; //设定PWM波的输出频率
CCAP0L=0x80; //设置PWM0输出值为50%占空比的方波
CCAP0H=0x80;
CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010) P1.3作为PWM输出
CR=1; //启动PCA定时器
TMOD=0x01; //使用定时器T0的模式1
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0
TH0=(65536-50000)/256; //定时器T0赋初值,每计数50000次(30ms)发送一次中断请求
TL0=(65536-50000)%256; //定时器T0赋初值
keyval=0; //按键值初始化为0,什么也不做
while(1)
{
switch(keyval)
{
case 1:duty_cycle_add();
break;
case 2:duty_cycle_reduce();
break;
}
}
}
/*************************************************
函数功能:定时器T0的中断服务子程序
**************************************************/
void Time0_serve(void) interrupt 1 using 1
{
if((P2&0x03)!=0x03) //第一次检测到有键按下
{
delay(20); //延时20ms再去检测
if(S1==0) //按键S1被按下
{
delay(20);
if(S1==0)
keyval=1;
}
if(S2==0) //按键S2被按下
{
delay(20);
if(S2==0);
keyval=2;
}
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
|