登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 呼吸灯

[复制链接]
发表于 2023-2-9 20:30:20 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 自主学习
开始时间: 2023-01-10
结束时间:
#include <STC12C5A60S2.H>

sbit PWMOUT = P0^0;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;

unsigned long PeriodCnt = 0;  
unsigned char HighRH = 0;  
unsigned char HighRL = 0;  
unsigned char LowRH  = 0;  
unsigned char LowRL  = 0;  
unsigned char T1RH = 0;   
unsigned char T1RL = 0;   

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

void main()
{
    EA = 1;     
    ENLED = 0;  
    ADDR3 = 1;
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;

    ConfigPWM(100, 10);  
    ConfigTimer1(50);   
    while (1);
}
void ConfigTimer1(unsigned int ms)
{
    unsigned long tmp;  

    tmp = 32000000 / 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;        
}
void ConfigPWM(unsigned int fr, unsigned char dc)
{
    unsigned int high, low;

    PeriodCnt = (32000000/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;
}
void InterruptTimer0() interrupt 1
{
    if (PWMOUT == 1)
    {
        TH0 = LowRH;
        TL0 = LowRL;
        PWMOUT = 0;
    }
    else            
    {
        TH0 = HighRH;
        TL0 = HighRL;
        PWMOUT = 1;
    }
}
void InterruptTimer1() interrupt 3
{
    static bit dir = 0;
    static unsigned char index = 0;
    unsigned char code table[10] = {  
    10, 20, 30, 40, 50, 60, 70, 80, 90, 95                       
    };

    TH1 = T1RH;
    TL1 = T1RL;
    AdjustDutyCycle(table[index]);
    if (dir == 0)
    {
        index++;
        if (index >= 12)
        {
            dir = 1;
        }
    }
    else   
    {
        index--;
        if (index == 0)
        {
            dir = 0;
        }
    }

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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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