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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機模式0做一個漸亮漸滅的效果,按鍵調速有沒有可能實現,搞了10天沒辦法

[復制鏈接]
跳轉到指定樓層
樓主
用的是STC15W24S單片機,P1輸出,P3口輸入,三個按鍵,兩個調速度快慢,一個調模式。我想把void Mode_0(void)做成可調速的漸亮漸滅效果。
兩年的單片機學習之路卻搞不定,麻煩各位師傅們指點。謝謝了!
#include <STC15W204S.H>

unsigned char RunMode;
//**********************************System Fuction*************************************************
void Delay1ms(unsigned int count)
{
        unsigned int i,j;
        for(i=0;i<count;i++)
        for(j=0;j<120;j++);
}



unsigned char GetKey(void)
{
        unsigned char KeyTemp,CheckValue,Key = 0x00;
        CheckValue = P3&0x32;
        if(CheckValue==0x32)
                return 0x00;

        Delay1ms(10);
        KeyTemp = P3&0x32;
        if(KeyTemp==CheckValue)
                return 0x00;

        if(!(CheckValue&0x02))
                Key|=0x01;
        if(!(CheckValue&0x10))
                Key|=0x02;
        if(!(CheckValue&0x20))
                Key|=0x04;
        return Key;
}

unsigned int TimerCount,SystemSpeed,SystemSpeedIndex;
void InitialTimer0(void)
{
        TMOD  = 0x00;                        
        TH0 = TL0 = 0xFC;               
        ET0=1;                                       
        TR0=1;                              
        EA=1;
}

unsigned int code SpeedCode[]={   1,   2,   3,   5,   8,  10,  14,  17,  20,  30,
                                  40,  50,  60,  70,  80,  90, 100, 120, 140, 160,
                                  180, 200, 300, 400, 500, 600, 700, 800, 900,1000};//30
void SetSpeed(unsigned char Speed)
{
        SystemSpeed =SpeedCode[Speed];
}

void LEDShow(unsigned int LEDStatus)
{
        P1 = ~(LEDStatus&0xFF);

}

void InitialCPU(void)
{
        RunMode = 0x00;
        TimerCount = 0;
        SystemSpeedIndex = 10;

        P1 = 0xFF;

        P3 = 0xFF;
        Delay1ms(500);
        P1 = 0xFF;

        P3 = 0xFF;
        SetSpeed(SystemSpeedIndex);

}

//Mode 0
unsigned int LEDIndex = 0;
bit LEDDirection = 1,LEDFlag = 1;
void Mode_0(void)
{
        
}
//Mode 1
void Mode_1(void)
{
        LEDShow(0x80>>LEDIndex);
        LEDIndex = (LEDIndex+1)%8;
}


void TimerEventRun(void)
{
        if(RunMode==0x00)
        {
                Mode_0();        
        }
        else if(RunMode ==0x01)
        {
                Mode_1();
        }

}
void Timer0(void) interrupt 1 using 1
{
        TF0 = 0;        
        if(++TimerCount>=SystemSpeed)
        {
                TimerCount = 0;
                TimerEventRun();
                                 
           }
}
unsigned char MusicIndex = 0;
void KeyDispose(unsigned char Key)
{
        if(Key&0x01)
        {
                LEDDirection = 1;
                LEDIndex = 0;
                LEDFlag = 1;
                RunMode = (RunMode+1)%2;

        }
        if(Key&0x02)
        {
                if(SystemSpeedIndex>0)
                {
                        --SystemSpeedIndex;
                        SetSpeed(SystemSpeedIndex);
                }
                else
                {

                }
        }
        if(Key&0x04)
        {
                if(SystemSpeedIndex<28)
                {
                        ++SystemSpeedIndex;
                        SetSpeed(SystemSpeedIndex);
                }
                else
                {

                }
        }        
}

//***********************************************************************************
main()
{
        unsigned char Key;
        InitialCPU();
        InitialTimer0();

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


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

使用道具 舉報

沙發
ID:491577 發表于 2022-10-21 16:17 | 只看該作者
很簡單,用定時器定時10ms,在定時器中斷中計數產生秒的變量。用PWM產生0-100%PWM,頻率100-1Khz,時間0-3秒鐘,PWM從0-100%(每30msPWM增加1%),3-6秒,PWM從100-0%,然后循環。時間間隔一定要大于1秒,太短看不到效果。
回復

使用道具 舉報

板凳
ID:713651 發表于 2022-10-21 17:01 | 只看該作者
總工說的對
回復

使用道具 舉報

地板
ID:161164 發表于 2022-10-21 17:36 | 只看該作者
你這種寫法是傳統單片機模式2的8位定時器吧



STC15的模式0是16位的


回復

使用道具 舉報

5#
ID:161164 發表于 2022-10-21 17:41 | 只看該作者
你這種寫法是傳統單片機模式2的8位定時器吧



STC15的模式0是16位的


回復

使用道具 舉報

6#
ID:879080 發表于 2022-10-21 19:32 | 只看該作者
lkc8210 發表于 2022-10-21 17:41
你這種寫法是傳統單片機模式2的8位定時器吧

是的,還不太會定時器。也知道這款單片機有16位自動重裝功能。我學單片機也很久了,只熟悉delay()延時,看到&,|,!,參數傳遞這些都不理解了,很喜歡玩單片機,始終沒辦法提高自己水平,真是愛恨交加
回復

使用道具 舉報

7#
ID:879080 發表于 2022-10-21 19:35 | 只看該作者
hhh402 發表于 2022-10-21 16:17
很簡單,用定時器定時10ms,在定時器中斷中計數產生秒的變量。用PWM產生0-100%PWM,頻率100-1Khz,時間0-3 ...

感謝指導,這樣能用按鍵調時間嗎? 謝謝
回復

使用道具 舉報

8#
ID:879080 發表于 2022-10-21 19:53 | 只看該作者
lkc8210 發表于 2022-10-21 17:41
你這種寫法是傳統單片機模式2的8位定時器吧

#define FOSC 11059200L

#define T1MS (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式


    AUXR |= 0x80;                   //定時器0為1T模式
//  AUXR &= 0x7f;                   //定時器0為12T模式

    TMOD = 0x00;                    //設置定時器為模式0(16位自動重裝載)
    TL0 = T1MS;                     //初始化計時值
    TH0 = T1MS >> 8;
    TR0 = 1;                        //定時器0開始計時
    ET0 = 1;                        //使能定時器0中斷
    EA = 1;
我看了官方的實例,應該這樣改。
回復

使用道具 舉報

9#
ID:879080 發表于 2022-10-22 08:24 | 只看該作者
lkc8210 發表于 2022-10-21 17:41
你這種寫法是傳統單片機模式2的8位定時器吧

#include <REG52.H>

unsigned char RunMode;

#define FOSC 11059200L
#define T1MS (65536-FOSC/1000)      //1T模式
sfr AUXR = 0x8e;   
//**********************************System Fuction*************************************************
void Delay1ms(unsigned int count)
{
        unsigned int i,j;
        for(i=0;i<count;i++)
        for(j=0;j<120;j++);
}



unsigned char GetKey(void)
{
        unsigned char KeyTemp,CheckValue,Key = 0x00;
        CheckValue = P3&0x32;
        if(CheckValue==0x32)
                return 0x00;

        Delay1ms(10);
        KeyTemp = P3&0x32;
        if(KeyTemp==CheckValue)
                return 0x00;

        if(!(CheckValue&0x02))
                Key|=0x01;
        if(!(CheckValue&0x10))
                Key|=0x02;
        if(!(CheckValue&0x20))
                Key|=0x04;
        return Key;
}

unsigned int TimerCount,SystemSpeed,SystemSpeedIndex;
void InitialTimer0(void)
{

        AUXR |= 0x80;                   //定時器0為1T模式
//  AUXR &= 0x7f;                   //定時器0為12T模式

    TMOD = 0x00;                    //設置定時器為模式0(16位自動重裝載)
    TL0 = T1MS;                     //初始化計時值
    TH0 = T1MS >> 8;
    TR0 = 1;                        //定時器0開始計時
    ET0 = 1;                        //使能定時器0中斷
    EA = 1;
}

unsigned int code SpeedCode[]={   1,   2,   3,   5,   8,  10,  14,  17,  20,  30,
                                  40,  50,  60,  70,  80,  90, 100, 120, 140, 160,
                                  180, 200, 300, 400, 500, 600, 700, 800, 900,1000};//30
void SetSpeed(unsigned char Speed)
{
        SystemSpeed =SpeedCode[Speed];
}

void LEDShow(unsigned int LEDStatus)
{
        P1 = ~(LEDStatus&0xFF);
      
}

void InitialCPU(void)
{
        RunMode = 0x00;
        TimerCount = 0;
        SystemSpeedIndex = 10;

        P1 = 0xFF;
        
        P3 = 0xFF;
        Delay1ms(500);
        P1 = 0xFF;
        
        P3 = 0xFF;
        SetSpeed(SystemSpeedIndex);

}

//Mode 0
unsigned int LEDIndex = 0;
bit LEDDirection = 1,LEDFlag = 1;
void Mode_0(void)
{
       
}
//Mode 1
void Mode_1(void)
{
        LEDShow(0x80>>LEDIndex);
        LEDIndex = (LEDIndex+1)%8;
}


void TimerEventRun(void)
{
        if(RunMode==0x00)
        {
                Mode_0();        
        }
        else if(RunMode ==0x01)
        {
                Mode_1();
        }
      
}
void Timer0(void) interrupt 1 using 1
{
               
        if(++TimerCount>=SystemSpeed)
        {
                TimerCount = 0;
                TimerEventRun();
                                 
           }
}
unsigned char MusicIndex = 0;
void KeyDispose(unsigned char Key)
{
        if(Key&0x01)
        {
                LEDDirection = 1;
                LEDIndex = 0;
                LEDFlag = 1;
                RunMode = (RunMode+1)%2;

        }
        if(Key&0x02)
        {
                if(SystemSpeedIndex>0)
                {
                        --SystemSpeedIndex;
                        SetSpeed(SystemSpeedIndex);
                }
                else
                {

                }
        }
        if(Key&0x04)
        {
                if(SystemSpeedIndex<28)
                {
                        ++SystemSpeedIndex;
                        SetSpeed(SystemSpeedIndex);
                }
                else
                {

                }
        }        
}

//***********************************************************************************
main()
{
        unsigned char Key;
        InitialCPU();
        InitialTimer0();

        while(1)
        {
                Key = GetKey();
                if(Key!=0x00)
                {
                        KeyDispose(Key);
                }
        }
}
定時器改成了16位自動重裝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美综合国产精品久久丁香 | 国产精品一区在线 | 亚洲一区二区久久久 | 久久91| 亚洲一区 中文字幕 | 色av一区二区 | 91社区在线观看播放 | 亚洲三区视频 | 交专区videossex农村 | 成人av在线播放 | 欧美区在线 | 日本中文在线 | 中文字幕第一页在线 | 韩国精品在线 | 精品中文字幕一区二区 | caoporn地址| 欧美在线一区二区三区 | 日韩一区二区不卡 | 一区二区三区回区在观看免费视频 | 欧美激情精品久久久久 | 久久这里只有精品首页 | 天天综合久久 | 欧美精品一区二区三区一线天视频 | 国产一区二区麻豆 | 黄色成人在线 | 在线一区| 国产一区二区三区免费视频 | 国产精品成人品 | 欧美亚洲日本 | 国产精品久久久亚洲 | 欧美国产91 | 成人免费精品 | 玩丰满女领导对白露脸hd | 久久综合一区 | 中文字幕在线一区二区三区 | 亚洲欧美视频 | 国产一区电影 | 国产精品日本一区二区不卡视频 | 欧美视频精品 | 久色| 国产午夜精品一区二区三区四区 |