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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15F104W編碼器兩路可調PWM輸出源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:486426 發表于 2020-9-8 07:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//沒有用IAPIDLE功能,有沒有高手指點一下利弊
#include <STC15F104E_PLUS.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
//#define uint unsigned int
//#define MAIN_Fosc                22118400L        //定義主時鐘
//#define MAIN_Fosc                12000000L        //定義主時鐘
#define MAIN_Fosc                11059200L        //定義主時鐘
//#define MAIN_Fosc                 5529600L        //定義主時鐘
//#define MAIN_Fosc                24000000L        //定義主時鐘
//#define MAIN_Fosc                40000000L        //定義主時鐘
//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
//#define ENABLE_IAP  0x82          //if SYSCLK<20MHz
#define ENABLE_IAP 0x83           //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz
#define CMD_IDLE    0               //空閑模式
#define CMD_READ    1               //IAP字節讀命令
#define CMD_PROGRAM 2               //IAP字節編程命令
#define CMD_ERASE   3               //IAP扇區擦除命令
//測試地址
#define IAP_ADDRESS1 0X0000         //內部EEPROM地址
#define IAP_ADDRESS2 0X0200
/*初始定義*/
bit  write = 0;
sbit VD=P3^3;  //紅色LED 0.50v=10v ;1.00=27v ;3.85=73v;
sbit CD=P3^4;  //綠色LED
sbit ZS=P3^5;  //指示LED轉換  0 - 紅色LED調整;1 - 綠色LED調整
sbit BA=P3^0;  //編碼器的a腳接P3.0
sbit BB=P3^1;  //編碼器的b腳接P3.1
sbit QH=P3^2;  //編碼器的按鍵接P3.2 電壓調整或電流調整299=5.00V
BYTE v_temp,c_temp,XZ = 0,flag,a0,b0,c0;//  128 109  48 29  //48=0.96V;29=0.58V;
void InitTimer0() interrupt 1  // 0.5毫秒@11.0592MHz  頻率 1000HZ
{
    IE2 = 0x00;    //關閉定時器2中斷
    AUXR = 0XE4;   //關閉定時器2計數
    TL0 = 0xCD;    //設置定時初值 0.5毫秒@11.0592MHz
    TH0 = 0xD4;    //設置定時初值 0.5毫秒@11.0592MHz
    VD = 1;
    CD = 1;
    flag = 1;
    AUXR = 0xF4;   //開啟定時器2計數
    IE2 = 0x04;    //開啟定時器2中斷允許
}

void InitTimer2() interrupt 12    //2微秒@11.0592MHz 控制燈亮時間
{
    flag++;
    T2L = 0xD4;    //設置定時初值 2微秒@11.0592MHz
    T2H = 0xFF;    //設置定時初值 2微秒@11.0592MHz
    if(v_temp == flag) VD=0;
    if(c_temp == flag) CD=0;
}

/*//關閉IAP
void IapIdle()
{
    IAP_CONTR = 0;                  //關閉IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除觸發寄存器
    IAP_ADDRH = 0x80;               //將地址設置到非IAP區域
    IAP_ADDRL = 0;
}
*/
//從ISP/IAP/EEPROM區域讀取一字節
BYTE IapReadByte(WORD addr)
{
    BYTE dat;                       //數據緩沖區
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數據
    //IapIdle();                    //關閉IAP功能
    return dat;                     //返回

}

//寫一字節數據到ISP/IAP/EEPROM區域
void IapProgramByte(WORD addr, BYTE dat)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_PROGRAM;          //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數據
    IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    //IapIdle();

}

//扇區擦除
void IapEraseSector(WORD addr)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_ERASE;            //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    //IapIdle();

}


/*void Timer0Init(void)                //100微秒@24.000MHz  10KHZPWM
{
        AUXR |= 0x80;        //定時器時鐘1T模式
        TMOD &= 0xF0;   //設置定時器模式
        TL0 = 0xA0;                //設置定時初值--100微秒@24.000MHz
        TH0 = 0xF6;                //設置定時初值--100微秒@24.000MHz
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
}

void Timer2Init(void)//0.4微秒@24.000MHz
{
        AUXR |= 0x04;  //定時器時鐘1T模式
        T2L = 0xF6;           //設置定時初值--0.4微秒@24.000MHz
        T2H = 0xFF;           //設置定時初值--0.4微秒@24.000MHz
        AUXR |= 0x10;  //定時器2開始計時
}
*/
void bianmaqi(void)//捕捉EC11按下和旋轉信息
{
  unsigned char a, b, c;
  a = BA; b = BB; c = QH;
   if (a != a0)     // BA changed
  {
        a0 = a;
    if (b != b0)    // BB changed
     {
      b0 = b;write = 1;
        if ((a == b) && (XZ == 0) && (v_temp < 153)) {v_temp++;}//225 153
    if ((a == b) && (XZ == 1) && (c_temp < 73)) {c_temp++;}//208 65
    if ((a != b) && (XZ == 0) && (v_temp > 23)) {v_temp--;}//85 23   
        if ((a != b) && (XZ == 1) && (c_temp > 5)) {c_temp--;}//29 5
     }
    }
  if (!c && c0)
        {
        if (XZ == 0 )
      {
        XZ = 1;
        ZS = 1;
        }
    else if(XZ == 1)//切換
      {
            XZ = 0;
        ZS = 0;
       }
    }
    c0 = c;
}
void init()
{
    AUXR = 0XE4;   //設置定時器0和2為1T模式
    TMOD = 0x00;
    TL0 = 0xCD;    //設置定時初值 0.5毫秒@11.0592MHz 0xA0;--100微秒@24.000MHz
    TH0 = 0xD4;    //設置定時初值 0.5毫秒@11.0592MHz 0xFF;--0.4微秒@24.000MHz
    T2L = 0xD4;    //設置定時初值 2微秒@11.0592MHz 0xF6;--0.4微秒@24.000MHz
    T2H = 0xFF;    //設置定時初值 2微秒@11.0592MHz 0xFF;--0.4微秒@24.000MHz
    EA = 1;
    ET0 = 1;
    TR0 = 1;       //定時器0開始計時
    P3M1 &= 0xF7;
    P3M0 |= 0x08;  //P3.3(推挽)
    P3M1 &= 0xEF;
    P3M0 |= 0x10;  //P3.4(推挽)
    P3M1 &= 0xDF;
    P3M0 |= 0x20;  //P3.5(推挽)
    VD = 0;
    CD = 0;
    ZS = 0;        // 0 - 電壓調整狀態;1 - 電流調整狀態
    a0 = BA;
    b0 = BB;
    c0 = QH;
          v_temp = IapReadByte(1);
        if (v_temp == 0 ){v_temp = 65;}     //128        65
        if (v_temp > 153){v_temp = 65;}     //245  128   
        c_temp = IapReadByte(10);
    if (c_temp == 0 ){c_temp = 29;}     //109           
    if (c_temp > 29 ){c_temp = 29;}     //208  109  

}
void main()
{
init();
while(1)
   {
   bianmaqi();
   if (write == 1) {
          write = 0;TR0 = 0;
      IapEraseSector(IAP_ADDRESS1);//擦除扇區
      if (XZ == 0 )  {
      IapProgramByte(1,v_temp);   //寫入數據
                   }
        else  if (XZ == 1 )  {
      IapProgramByte(10,c_temp);  //寫入數據
                   }
   }
   _nop_();
   TR0 = 1;
   }
}

STC15F104W編碼器兩路可調PWM輸出.rar

29.74 KB, 下載次數: 117, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:245466 發表于 2020-12-8 21:33 | 只看該作者
這個太好了,正好做參考!
回復

使用道具 舉報

板凳
ID:230374 發表于 2021-3-29 10:43 | 只看該作者
很好的,學習備用,謝謝
回復

使用道具 舉報

地板
ID:796531 發表于 2021-4-5 14:58 | 只看該作者
學習,正在學習PWM,謝謝
回復

使用道具 舉報

5#
ID:693367 發表于 2021-5-17 08:16 來自手機 | 只看該作者
哪位大佬幫我寫一個stc15F104w單片機爆閃燈,p3.2和p3.3接爆閃燈,每個燈閃3次循環爆閃用按鍵可以調節爆閃頻率
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩另类视频 | 精品一区二区三区免费视频 | 成人精品在线视频 | 久久久久国产精品一区 | 久久777| 日韩电影一区二区三区 | 中文字幕 亚洲一区 | 亚洲视频在线观看 | 欧美国产日韩精品 | 国产在线精品一区二区 | 欧美日韩电影一区 | av在线播放国产 | 在线一级片 | 亚洲精品久久久一区二区三区 | 中文字幕在线一区 | av资源中文在线天堂 | 999久久久 | 欧美精品一区二区在线观看 | 成人免费观看男女羞羞视频 | 黄色一级在线播放 | 国产精品一区二区在线播放 | 美女视频网站久久 | 亚洲一区二区三区视频在线 | 国产91丝袜在线18 | 久久精品中文 | 天天看天天爽 | 人人做人人澡人人爽欧美 | 国产日韩精品一区 | 国产精品99久久久久久宅男 | 精品免费国产视频 | 一区二区成人 | 超碰97干| 久久成人免费视频 | 日韩精品免费视频 | 男人的天堂久久 | 国产精品亚洲精品 | 欧美一级大片 | 欧美在线视频一区二区 | 一区二区成人 | 一区二区视屏 | 在线播放亚洲 |