登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 呼吸灯

[复制链接]
发表于 2022-1-16 17:10:42 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 呼吸灯
开始时间: 2022-01-16
结束时间: 2022-01-16
本帖最后由 房一鹏 于 2022-1-16 18:20 编辑

在写呼吸灯程序之前,我们要了解我们板子的机器周期为12/32768000,而65536*(12/32768000)=0.024也就是说,我们板子最多24毫秒一定要进入一次中断,而在金沙滩上的程序中是50毫秒进入一次中断。注意!!!

如果照抄金沙滩的程序(50毫秒进入一次中断),是做不出呼吸的效果的,并且程序也不会报错。(我找了好久才发现这一点
呼吸灯1
#include<reg52.h>

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

unsigned char highRH=0;
unsigned char highRL=0;
unsigned char lowRH=0;
unsigned char lowRL=0;

void ConfigPWM(unsigned char fr,unsigned char dc);
void ClosePWM();

void main ()
{
        unsigned int i=0;
        unsigned char a;
        
        ENLED=0;
        P20=0;
        P21=1;
        P22=1;
        EA=1;
//        led=0;
        
        while(1)
        {
                for(a=1;a<=10;a++)
                {
                        ConfigPWM(100,a*10);
                  for(i=0;i<60000;i++);
                  ClosePWM();
                }

        }
}
void ConfigPWM(unsigned char fr,unsigned char dc)
{
        unsigned long tmp;
        unsigned int high,low;
        
        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&=0xF7;
//        TMOD|=0x01;
        TMOD=0x01;
        TH0=highRH;
        TL0=highRL;
        TR0=1;
        ET0=1;
        led=1;
}

void ClosePWM()
{
        TR0=0;
        ET0=0;
        led=1;
        
}        


void interruptTime0() interrupt 1
{
        if(led==1)
        {
                TH0=lowRH;
                TL0=lowRL;
                led=0;
        }
        else
//        if(led==0)
        {
                TH0=highRH;
                TL0=highRL;
                led=1;
        }
}

呼吸灯2#include<reg52.h>

sbit ENLED=P1^1;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit led=P0^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;
unsigned long periodcnt=0;

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

void main ()
{
        ENLED=0;
        P20=0;
        P21=1;
        P22=1;
        EA=1;
       
        ConfigPWM(100,10);
  configtimer1(20);                                                   //注意此处的20,20毫秒进入一次定时器1的中断
        while(1);
}
void configtimer1(unsigned int ms)
{
        unsigned long tmp;
        tmp=32768000/12;
        tmp=(tmp*ms)/1000;
        tmp=65536-tmp+12;
        T1RH=(unsigned char)(tmp>>8);
        T1RL=(unsigned char)tmp;
        TMOD&=0x0F;
        TMOD|=0x10;
        TH1=T1RH;
        TL1=T1RL;
        TR1=1;
        ET1=1;
        led=1;
}
void ConfigPWM(unsigned char 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;
//        TMOD=0x01;
        TH0=highRH;
        TL0=highRL;
        TR0=1;
        ET0=1;
        led=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 interruptTime0() interrupt 1
{
        if(led==1)
        {
                TH0=lowRH;
                TL0=lowRL;
                led=0;
        }
        else
        {
                TH0=highRH;
                TL0=highRL;
                led=1;
        }
}

void interruptTime1() interrupt 3
{
       
        unsigned char a[19]={
                5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95
        };
        static bit dir=0;
  static unsigned char index=0;
  TH1=T1RH;
        TL1=T1RL;
       
        AdjustDutyCycle(a[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.

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