久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1116|回復: 2
打印 上一主題 下一主題
收起左側

做的單片機調速呼吸燈效果,調的時候速度不會變化,斷電重新上電才能看到變化

[復制鏈接]
跳轉到指定樓層
樓主
調速時看不到快慢變化,重新上電才能看到。怎樣改才能實現實時變化?
#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;               //定時器2高8位
sfr T2L       = 0xD7;               //定時器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();




/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:擦除某一扇區(每個扇區512字節)
入口:addr = 某一扇區首地址         
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
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();        
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:寫一字節
入口:addr = 扇區單元地址 , dat = 待寫入數據
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
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();         // 關閉ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:讀一字節
入口:addr = 扇區單元地址
出口:dat  = 讀出的數據
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uchar dcx(uint addr)
{   
    uchar dat;
        IAP_CONTR = 0x81;
        IAP_TPS = 12;        
    IAP_CMD   = 1;         // 用戶可以對"Data Flash/EEPROM區"進行字節讀
    IAP_ADDRL = addr;         
    IAP_ADDRH = addr>>8;      
    EA = 0;
    IAP_TRIG = 0x5a;         
    IAP_TRIG = 0xa5;         
    _nop_();
    dat = IAP_DATA;         // 取出數據
        Q0();         // 關閉ISP/IAP         
        return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:關閉ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
    IAP_CONTR = 0;            // 關閉IAP功能
    IAP_CMD   = 0;            // 待機模式,無ISP操作
    IAP_TRIG  = 0;
        IAP_ADDRH=0x80;
        IAP_ADDRL=0;
        EA =1;            // 關閉IAP功能, 清與ISP有關的特殊功能寄存器
}
               
//**********************************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;                        //定時器時鐘12T模式
                 TMOD = 0x00;                        
                                
         TL0 = (65536-1000)%256;                                //設置定時初始值
     TH0 = (65536-1000)/256;                                //設置定時初始值
     TL1 = (65536-time)%256;                                //設置定時初始值
     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占空比漸加漸減標志位 默認max為0.每一周期占空比漸加
if(max==1){zkb--;}      //MAX占空比漸加漸減標志位 如果max為1.每一周期占空比漸減
if(zkb==200){max=1;}  //如果占空比的值為100      標志位MAX置為1.漸減
if(zkb==0){max=0;}     //如果占空比的值為0         標志位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);
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2023-12-19 08:59 | 只看該作者

回復

使用道具 舉報

板凳
ID:879080 發表于 2023-12-19 20:38 | 只看該作者

非常感謝您的幫助!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品二区 | 天天夜夜操 | 欧美一区二区三区大片 | 国产精品久久久av | 成年人黄色小视频 | 欧美成人一区二区三区 | 日本久久久久久久久 | 99精品在线观看 | 亚洲一区二区在线视频 | 精品国产一区三区 | 91一区二区| 久久久久久免费毛片精品 | 久久精品色欧美aⅴ一区二区 | 国产免费xxx | 中文字幕日韩欧美 | 国产免费一区 | 精品国产一区二区三区久久影院 | 日韩色在线 | 色毛片| 国产精品有限公司 | 日韩精品免费在线观看 | 午夜精品视频在线观看 | 国产影音先锋 | 国产精品久久久久久久久久久久 | 人人擦人人干 | 国产一区二区三区在线视频 | 成人国产一区二区三区精品麻豆 | 欧美日韩成人一区二区 | 国产在线一区二 | 欧美精品一区久久 | 91久久国产综合久久 | 欧美日韩国产一区二区三区 | 国产美女视频黄 | 欧美日本韩国一区二区 | 午夜寂寞福利视频 | 国产视频一区二区 | 亚洲国产精品人人爽夜夜爽 | 久久99网 | 一区二区三区在线电影 | 欧美中文字幕一区二区三区亚洲 | 在线一区二区三区 |