登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 呼吸灯

[复制链接]
发表于 2022-1-20 20:11:19 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 学习呼吸灯原理,占空比的知识
开始时间: 2022-01-17
结束时间: 2022-01-20
先是小灯亮度的阶梯性变化的程序(呼吸灯的雏形)

#include<reg52.h>

sbit PWMOUT = P0^0;
sbit ENLED = P1^1;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
unsigned char HighRH = 0;
unsigned char HighRL = 0;
unsigned char LowRH = 0;
unsigned char LowRL = 0;
void ConfigPWM(unsigned int fr,unsigned char dc);
void ClosePWM();

void main()
{
unsigned int i;

EA = 1;
ENLED = 0;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;

while(1)
{
ConfigPWM(100,10);
for(i=0;i<60000;i++);
ClosePWM();
ConfigPWM(100,40);
for(i=0;i<60000;i++);
ClosePWM();
ConfigPWM(100,90);
for(i=0;i<60000;i++);
ClosePWM();
for(i=0;i<60000;i++);
}
}

void ConfigPWM(unsigned int fr,unsigned char dc)
{
unsigned int high,low;
unsigned long tmp;

tmp = (32768000/12)/fr;
high = (tmp*dc)/100;
low = tmp-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 ClosePWM()
{
TR0 = 0;
ET0 = 0;
PWMOUT = 1;
}

void InterruptTimer0() interrupt 1
{
if(PWMOUT == 1)
{
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 0;
}
else
{
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 1;
}
}


在前者的基础上进行进一步加工得到呼吸灯程序

#include<reg52.h>

sbit PWMOUT = P0^0;
sbit ENLED = P1^1;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
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 ConfigPWM(unsigned int fr,unsigned char dc);
void ConfigTimer1(unsigned int ms);

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

ConfigPWM(100,10);
ConfigTimer1(20);
while(1);
}

void ConfigTimer1(unsigned int ms)
{
unsigned long tmp;

tmp = 32768000/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;
PWMOUT = 1;
}

void ConfigPWM(unsigned int fr,unsigned char dc)
{
unsigned int high,low;

PeriodCnt = (32768000/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[13] = {
10,20,30,40,50,60,70,75,80,85,90,93,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.

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