登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 改良版呼吸灯,自己没有debug,用的原来的,误差会有

[复制链接]
发表于 2019-2-6 23:54:11 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 呼吸灯
开始时间: 2019-02-04
结束时间: 2019-02-06
#include <reg52.h>

sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit ENLED = P1^1;

unsigned long PeriodCnt = 0; //PWM周期计数值
unsigned char HighRH = 0;
unsigned char HighRL = 0;
unsigned char LowRH  = 0;
unsigned char LowRL  = 0;
unsigned char T1RH = 0;   
unsigned char T1RL = 0;
unsigned char PWMOUT;

void ConfigTimer1(unsigned int ms);
void ConfigPWM(unsigned int fr, unsigned char dc);

void main()
{
    EA = 1;     
    ENLED = 0;  
    P22 = 1;
    P21 = 1;
    P20 = 0;
   
    ConfigPWM(100, 5);
    ConfigTimer1(160);  
    while (1);
}

/*配置并启动T1,ms为定时时间*/
void ConfigTimer1(unsigned int ms)
{
    unsigned long tmp;
   
    tmp = 33177600 / 12;
    tmp = (tmp * ms) / 1000;
    tmp = 65536 - tmp;
    tmp = tmp + 12;
    T1RH = (unsigned char)(tmp>>8);
    T1RL = (unsigned char)tmp;
    TMOD &= 0x0F;
    TMOD |= 0x10;
    TH1 = T1RH;
    TL1 = T1RL;
    ET1 = 1;
    TR1 = 1;
}

/*配置并启动PWM,fr为频率,dc为占空比*/
void ConfigPWM(unsigned int fr, unsigned char dc)
{
    unsigned int high, low;
   
    PeriodCnt = (33177600/12) / fr;
    high = (PeriodCnt*dc) / 100;
    low  = PeriodCnt - high;
    high = 65536 - high + 12;
    low  = 65536 - low  + 12;
    HighRH = (unsigned char)(high>>8);
    HighRL = (unsigned char)high;
    LowRH  = (unsigned char)(low>>8);
    LowRL  = (unsigned char)low;
    TMOD &= 0xF0;
    TMOD |= 0x01;
    TH0 = HighRH;
    TL0 = HighRL;
    ET0 = 1;
    TR0 = 1;
    PWMOUT = 1;
}
/* 占空比调整函数 */
void AdjustDutyCycle(unsigned char dc)
{
    unsigned int  high, low;
   
    high = (PeriodCnt*dc) / 100;
    low  = PeriodCnt - high;
    high = 65536 - high + 12;
    low  = 65536 - low  + 12;
    HighRH = (unsigned char)(high>>8);
    HighRL = (unsigned char)high;
    LowRH  = (unsigned char)(low>>8);
    LowRL  = (unsigned char)low;
}
/* T0中断,产生PWM输出 */
void InterruptTimer0() interrupt 1
{
    if (PWMOUT == 1)
    {
        TH0 = LowRH;
        TL0 = LowRL;
        P0 = 0;
        PWMOUT = 0;
    }
    else
    {
        TH0 = HighRH;
        TL0 = HighRL;
        P0 = 0xFF;
        PWMOUT = 1;
     
    }
}
/* T1中断,50ms调整一次占空比 */
void InterruptTimer1() interrupt 3
{
    static bit dir = 0;
    static unsigned char index = 0;
    unsigned char code table[] = {
       5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,
    };
    TH1 = T1RH;
    TL1 = T1RL;
    AdjustDutyCycle(table[index]);
    if (dir == 0)
    {
        index++;
        if (index >= 18)
        {
            dir = 1;
        }
    }
    else
    {
        index--;
        if (index == 0)
        {
            dir = 0;
        }
    }
}

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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