占空比的话,可用中断次数分配实现,如果是类似于二分之一,四分之一等简单的,也可直接用查表实现,更加方便。
举个例子,led灯点亮占空比为25%,频率为10hz
那么,周期为100ms,可将计数器定时为25ms,设一计次的变量,从1计到4,前三次为暗,后一次为亮,即实现
。
用此方法,也可以实现占空比的“嵌套”,即在点亮状态也可以加入一定的占空比,因频率高,肉眼无法看出,看到的只是亮度变暗,这在电池的节能应用上相当有用。
PCA时钟用T0溢出,void PCA_Init (void)
{
PCA0MD &=~0x40//关闭开门狗
//0号舵机
PCA0MD=0x04//0000 0100 定时器0溢出,禁止看门狗.
PCA0CPM0=0x42//0100010 使能8位脉宽调制方式
PCA0CPL0=235//
PCA0CPH0=235//初始化为角度为0
}
/***************************************************************************************/
void Counter_Init(void)
{ TCON=0x10 //0001 0000 启动定时器T0&T1
CKCON=0x00 //定时时钟来源 系统时钟12分频( 2MHZ)
TMOD=0x02 //0000 00(计时)10(方式2) Timer0 工作在方式28位计数器自动重载,
TL0=120 //计数器初 值 256-156=100 50HZ(20ms/256 计156次)120 58HZ 150 74HZ 延时20 80 45HZ 延时50
TH0=120 //计数器重载值
}
/*************************************************************************************************/
程序以验证。可以使用。用的是定时中断;P1尾输出端;我只写出了连个按键的试验效果,如果你需要更多的话,你自己往上加按键就OK 了希望随你有所帮助 #include "reg52.h"#define uchar unsigned char
#define uint unsigned int
sbit s1=P3^2
sbit s2=P3^3
sbit s3=P3^4
uchar t,x
void delay(uint z)
{
uint x,y
for (x=0x<zx++)
for(y=110y>0y--)
}
void init()
{
x=40
TMOD=0X01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
EA=1
ET0=1
TR0=1
}
void main()
{
init()
while(1)
{
if(s1==0)
{
delay(5)
if(s1==0)
{
while(!s1)
x=10
}
}
if(s2==0)
{
delay(5)
if(s2==0)
{
while(!s2)
x=20
}
}
}
}void timer0() interrupt 1
{
TH0=(65536-50000)/256
TL0=(65536-50000)%256
t++
if(t==x)
{
t=0
P1=~P1
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)