c51 不用a/d转换 怎么控制单片机i/o口 由暗到亮逐渐变化

发布网友 发布时间:4小时前

我来回答

1个回答

热心网友 时间:7分钟前

可以用I/O口模拟PWM波的占空比来控制led的亮度。占空比:就是输出的PWM中,高电平保持的时间

该PWM的时钟周期的时间之比。如,一个PWM的频率是1000Hz,那么它的时钟周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。
给你个程序:
#define
uchar
unsigned
char
//定义一下方便使用
#define
uint
unsigned
int
#define
ulong
unsigned
long
#include
<reg52.h>
//包括一个52标准内核的头文件
sbit
P10
=
P1^0;
//要控制的LED灯
sbit
K1=
P3^2;
//按键K1
uchar
scale;//用于保存占空比的输出0的时间份额,总共10份
char
code
dx516[3]
_at_
0x003b;//这是为了仿真设置的
//模拟PWM输出控制灯的10个亮度级别
void
main(void)
//
主程序
{
uint
n;
RCAP2H
=0xF3;
//赋T2的预置值,溢出1次是1/1200秒钟
RCAP2L
=0x98;
TR2=1;
//启动定时器
ET2=1;
//打开定时器2中断
EA=1;
//打开总中断
while(1)
//程序循环
{
;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
for(n=0;n<50000;n++);
//每过一会儿就自动加一个档次的亮度
scale++;
if(scale==10)scale=0;
}
}
//1/1200秒定时器2中断
timer2()
interrupt
5
{
static
uchar
tt;
//tt用来保存当前时间在一秒中的比例位置
TF2=0;
tt++;
if(tt==10)
//每1/120秒整开始输出低电平
{
tt=0;
if(scale!=0)
//这里加这一句是为了消除灭灯状态产生的鬼影
P10=0;
}
if(scale==tt)
//按照当前占空比切换输出高电平
P10=1;
}
//修改占空比的办法,把时间分为10份

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com