数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2647|回复: 5

[C51] 小白自学C51单片机编程,定时器PWM呼吸灯效果

[复制链接]
发表于 2023-12-30 17:33:32 | 显示全部楼层 |阅读模式
小白吗,复杂的不会,也只会点个灯什么的,
这次用定时器输出PWM通过改变占空比来改变LED亮度,
定时器中断一次增加一点占空比,达到最大时再减少一点占空比,

代码如下:都是用前面的代码修改而来,有些注释可能不对,

//LED接在P1口
//利用定时器产生PWM信号
//使LED灯从亮到暗,从暗到亮变化


#include <reg52.h>        //头文件
typedef unsigned char u8;    //类型定义,相当于缩写的意思吧
typedef unsigned int u16;      //类型定义

u8 time;     //定义中断时间
u8 duty;    //定义占空比,并给初值   
bit led_flag=0;    //占空比增加或减少的标志位

void time0init();    //声明子函数定时器初始化

void main ()      //主函数
{
    time0init();    //调用初始化子函数
    while(1)
    {
    }
}

void time0init()     //定时器初始化函数
{
       TMOD=0x01;    // 定时器模式1
    TH0=(65536-100)/256;       //100/1.085
    TL0=(65536-100)%256;    //
    EA=1;        //开总中断
    ET0=1;        //开定时器0        
    TR0=1;        //定时器0开始
}

void time0 ()interrupt 1    //定时器中断函数
{   
    TH0=(65536-100)/256;
    TL0=(65536-100)%256;
    time++;    //
     if(time==100)      //如果定时满了100次
        {
            time=0;        //定时清零   
            if(led_flag==0) //如果标志位是0
            duty++;        //加占空比
            if(led_flag==1) //如果标志位是1
            duty--;        //减占空比
         }
      if(duty>=99)  //占空比到最大
    led_flag=1;        //改变标志位
    if(duty<=1)//占它比到最小
      led_flag=0;        //改变标志位
     
                 
    if(time<=duty)    //小于占空比的时间是高电平,
        P1=0xff;      //输出高电平 11111111
    else
         P1=0x00;      //其它时间输出低电平
}                  


以下是小视频



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 2023-12-30 18:35:03 | 显示全部楼层
已经是高手了,我是一点也看不懂
回复 支持 1 反对 0

使用道具 举报

发表于 2023-12-30 20:33:57 来自手机浏览器 | 显示全部楼层
大师你好歹你搞个硬件pwm啊,老旧的89c51就这么点算力,很多场合力不从心啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-30 22:08:31 | 显示全部楼层
我是真小白,我现在还不清楚为什么一个程序里有时要用2进制,有时要用16进制,有时又有10进制,
回复 支持 反对

使用道具 举报

发表于 2023-12-31 08:37:06 | 显示全部楼层
输出高电平 11111111
如果你觉得二进制的11111111用十六进制表示方便就写成
P1=0xff;
如果你觉得二进制的11111111用十进制表示方便就写成
P1=255;
视频不会发,能介绍一下吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-31 09:08:37 | 显示全部楼层
xixia001 发表于 2023-12-31 08:37
输出高电平 11111111
如果你觉得二进制的11111111用十六进制表示方便就写成
P1=0xff;

点回形针就是发视频
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-21 21:16 , Processed in 0.265200 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表