標(biāo)題: 做的單片機(jī)調(diào)速呼吸燈效果,調(diào)的時(shí)候速度不會(huì)變化,斷電重新上電才能看到變化 [打印本頁(yè)]

作者: hanxingyijian    時(shí)間: 2023-12-18 19:13
標(biāo)題: 做的單片機(jī)調(diào)速呼吸燈效果,調(diào)的時(shí)候速度不會(huì)變化,斷電重新上電才能看到變化
調(diào)速時(shí)看不到快慢變化,重新上電才能看到。怎樣改才能實(shí)現(xiàn)實(shí)時(shí)變化?
#include <reg51.h>
#include "intrins.h"

#define uchar unsigned char   
#define uint unsigned int

uint zkb,pwm,time;
//bit max=0;
uchar RunMode;
sfr     P1M1    =   0x91;
sfr     P1M0    =   0x92;
sfr     P3M1    =   0xb1;
sfr     P3M0    =   0xb2;
sfr     WDT_CONTR   =   0xc1;

sfr IE2       = 0xaf;               //中斷使能寄存器2
sfr AUXR      = 0x8e;               //輔助寄存器
sfr T2H       = 0xD6;               //定時(shí)器2高8位
sfr T2L       = 0xD7;               //定時(shí)器2低8位


sfr     IAP_DATA    =   0xC2;
sfr     IAP_ADDRH   =   0xC3;
sfr     IAP_ADDRL   =   0xC4;
sfr     IAP_CMD     =   0xC5;
sfr     IAP_TRIG    =   0xC6;
sfr     IAP_CONTR   =   0xC7;
sfr     IAP_TPS     =   0xF5;
unsigned char RunMode;

void  cc(uint addr);
void  xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void  Q0();




/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):擦除某一扇區(qū)(每個(gè)扇區(qū)512字節(jié))
入口:addr = 某一扇區(qū)首地址         
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void cc(uint addr)// 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
{
    IAP_CONTR = 0x81;
    IAP_TPS = 12;

    IAP_CMD   = 3;         
    IAP_ADDRL = addr;         
    IAP_ADDRH = addr>>8;      
        EA =0;   
    IAP_TRIG = 0x5a;         
    IAP_TRIG = 0xa5;         
    _nop_();
    Q0();        
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):寫一字節(jié)
入口:addr = 扇區(qū)單元地址 , dat = 待寫入數(shù)據(jù)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void xcx(uint addr,uchar dat)
{
    IAP_CONTR = 0x81;
    IAP_TPS = 12;         
    IAP_CMD   = 2;            
    IAP_ADDRL = addr;        
    IAP_ADDRH = addr>>8;      
    IAP_DATA  = dat;         
    EA = 0;
    IAP_TRIG = 0x5a;         
    IAP_TRIG = 0xa5;         
    _nop_();
    Q0();         // 關(guān)閉ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):讀一字節(jié)
入口:addr = 扇區(qū)單元地址
出口:dat  = 讀出的數(shù)據(jù)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uchar dcx(uint addr)
{   
    uchar dat;
        IAP_CONTR = 0x81;
        IAP_TPS = 12;        
    IAP_CMD   = 1;         // 用戶可以對(duì)"Data Flash/EEPROM區(qū)"進(jìn)行字節(jié)讀
    IAP_ADDRL = addr;         
    IAP_ADDRH = addr>>8;      
    EA = 0;
    IAP_TRIG = 0x5a;         
    IAP_TRIG = 0xa5;         
    _nop_();
    dat = IAP_DATA;         // 取出數(shù)據(jù)
        Q0();         // 關(guān)閉ISP/IAP         
        return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):關(guān)閉ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
    IAP_CONTR = 0;            // 關(guān)閉IAP功能
    IAP_CMD   = 0;            // 待機(jī)模式,無ISP操作
    IAP_TRIG  = 0;
        IAP_ADDRH=0x80;
        IAP_ADDRL=0;
        EA =1;            // 關(guān)閉IAP功能, 清與ISP有關(guān)的特殊功能寄存器
}
               
//**********************************System Fuction*************************************************
void Delay1ms( uint count)
{               
            uint i,j;
        for(i=0;i<count;i++)
        for(j=0;j<120;j++);
}


uchar GetKey(void)
{
        uchar KeyTemp,CheckValue,Key = 0x00;
        CheckValue = P1&0x43;
        if(CheckValue==0x43)
                return 0x00;

        Delay1ms(10);
        KeyTemp = P1&0x43;
        if(KeyTemp==CheckValue)
                return 0x00;

        if(!(CheckValue&0x01))
                Key|=0x01;
        if(!(CheckValue&0x02))
                Key|=0x02;
        if(!(CheckValue&0x40))
                Key|=0x40;
        return Key;
}
uint TimerCount ,SystemSpeed,SystemSpeedIndex,outtime;

void InitialTimer0(void) //100us@11.0592MHZ
{

                AUXR &= 0x3F;                        //定時(shí)器時(shí)鐘12T模式
                 TMOD = 0x00;                        
                                
         TL0 = (65536-1000)%256;                                //設(shè)置定時(shí)初始值
     TH0 = (65536-1000)/256;                                //設(shè)置定時(shí)初始值
     TL1 = (65536-time)%256;                                //設(shè)置定時(shí)初始值
     TH1 = (65536-time)/256;                    
                        
        TR0 = 1;                              
    TR1=1;
        ET0=1;
        ET1=1;                        
        EA=1;
}

uint code SpeedCode[]={100,150,200,250,300,400,500,600,
                                           700,1000};
uint code pwmtime[]={10,15,20,25,30,35,40,45,50,55};

void pwmspeed(uchar speed1)
{
        time=pwmtime[speed1];
}

void SetSpeed( uchar Speed)
{
        SystemSpeed =SpeedCode[Speed];
                        
}

void LEDShow( uint LEDStatus)
{
        P3 = (LEDStatus&0xFF);

}

void InitialCPU(void)
{
                        TimerCount = 0;
                 RunMode = dcx(0x0000);

        SystemSpeedIndex =dcx(0x0200);
        
                 //SystemSpeedIndex = 0;
                 if(SystemSpeedIndex > 10)
                {
                  SystemSpeedIndex =1;
                }
               
        P1 = 0xFF;
                P3 = 0xFF;
        Delay1ms(500);
        P1 = 0xFF;

        P3 = 0xFF;
        SetSpeed(SystemSpeedIndex);
                pwmspeed(SystemSpeedIndex);
}

        
unsigned int LEDIndex = 0;
bit LEDDirection = 1,LEDFlag = 1;

//Mode 0
void Mode_0(void)
{
        
         if(LEDDirection)
                LEDShow(~(0x0F<<LEDIndex));
        else
                LEDShow(~(0xF0>>LEDIndex));
        if(LEDIndex==7)
                LEDDirection = !LEDDirection;
           LEDIndex = (LEDIndex+4)%8;
}
void Mode_1(void)
{
        LEDShow(~(0x01<<LEDIndex));
        LEDIndex = (LEDIndex+1)%3;
}
void Mode_2(void)
{
               
        LEDShow(0xff<<LEDIndex);
        LEDIndex = (LEDIndex+1)%4;
               
}
void Mode_3(void)
{
               
                 
                if(pwm>zkb)
               
        {
           LEDShow(LEDIndex=0xff);
}
                else
{
                LEDShow(LEDIndex=0x00);
}
   }
void TimerEventRun(void)
{
       if(RunMode==0x00)
        {
                Mode_0();        
        }
         else if(RunMode ==0x01)
        {
                Mode_1();
        }
                else if(RunMode ==0x02)
        {
                Mode_2();
        }
               
         
}

void Timer0(void) interrupt 1 using 1
{
               
                if(++TimerCount>=SystemSpeed)
        {

                           TimerCount = 0;        
             TimerEventRun();
}   
        }                 

void Timer1(void) interrupt 3 using 1
{               
                static uchar max=0;
                pwm++;
        if(pwm>200)
        {
pwm=0;             //周期歸零
if(max==0){zkb++;}     //MAX占空比漸加漸減標(biāo)志位 默認(rèn)max為0.每一周期占空比漸加
if(max==1){zkb--;}      //MAX占空比漸加漸減標(biāo)志位 如果max為1.每一周期占空比漸減
if(zkb==200){max=1;}  //如果占空比的值為100      標(biāo)志位MAX置為1.漸減
if(zkb==0){max=0;}     //如果占空比的值為0         標(biāo)志位MAX置為0.漸加

}

    if(RunMode ==0x03)
        {
                Mode_3();
        }                  
}

unsigned char MusicIndex = 0;
void KeyDispose(unsigned char Key)
{
        if(Key&0x01)
        {
                LEDDirection = 1;
                LEDIndex = 0;
                LEDFlag = 1;
        
                RunMode = (RunMode+1)%4;
                                /*if( RunMode == 4);
                                {
                                SetSpeed(SystemSpeedIndex);        
}*/
                                 cc(0x0000);           
                                    xcx(0x0000, RunMode);
        }
        if(Key&0x02)
        {
        
                if(SystemSpeedIndex>0)
                {
                                         
                        --SystemSpeedIndex;
                                        pwmspeed(SystemSpeedIndex);
                                                SetSpeed(SystemSpeedIndex);
                       cc(0x0200);
                                     xcx(0x0200,SystemSpeedIndex);
                                
                }
                                
        }
        if(Key&0x40)
        {
                if(SystemSpeedIndex<9)
                {
                       ++SystemSpeedIndex;
                                           SetSpeed(SystemSpeedIndex);
                                                pwmspeed(SystemSpeedIndex);
                                        cc(0x0200);
                                     xcx(0x0200,SystemSpeedIndex);        
                                                
                }
                              
        }        
}

//***********************************************************************************
main()
{
         unsigned char Key;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
        // WDT_CONTR = 0x27;

        InitialCPU();
        InitialTimer0();

        while(1)
        {
                                 //WDT_CONTR = 0x37;
                Key = GetKey();
                if(Key!=0x00)
                {
                                       
                        KeyDispose(Key);
                }
        }
}


作者: lkc8210    時(shí)間: 2023-12-19 08:59


作者: hanxingyijian    時(shí)間: 2023-12-19 20:38
lkc8210 發(fā)表于 2023-12-19 08:59

非常感謝您的幫助!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1