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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1408|回復: 0
收起左側

用STC15W204S單片機控制X9C103的程序代碼

[復制鏈接]
ID:1107459 發表于 2024-1-10 22:41 | 顯示全部樓層 |閱讀模式
#include <reg51.h>  
#include <intrins.h>  
#include <string.h>

#define uchar unsigned char  
#define uint unsigned int  

sbit ENCODER_A = P3^5;  // 旋轉編碼器A相
sbit ENCODER_B = P3^4;  // 旋轉編碼器B相   
sbit CS = P3^2;                 // 數字電位器片選
sbit U_D = P3^1;               // 數字電位器方向
sbit INC = P3^0;               // 數字電位器增加  
// 上一次的編碼器狀態和時間戳  
uchar lastA = 1, lastB = 1;  
uint lastTime = 0;  
int steps = 0;                    // 旋轉的步數
uint stepMultiplier = 1;    // 步數增加的倍數,根據旋轉速度動態調整
uint currentTime = 0;       // 將currentTime移出中斷服務例程并定義為全局變量  
// 定時器中斷服務例程(假設每1ms中斷一次),用于更新時間和處理編碼器   
void timer0_isr(void) interrupt 1 {  
    currentTime++;           // 更新時間戳
   // 讀取旋轉編碼器  
   // 判斷旋轉方向并計算步數  
    uchar a = ENCODER_A;  
    uchar b = ENCODER_B;
        //uchar a;  
   // a = ENCODER_A ? 1 : 0; // 使用三元運算符根據ENCODER_A的狀態設置a的值  
    // 判斷旋轉方向
    if ((a == 0) && (b == 1) && (lastA == 1) && (lastB == 0)) {  
        steps += stepMultiplier;           // 順時針旋轉
    } else if ((a == 1) && (b == 0) && (lastA == 0) && (lastB == 1)) {  
        steps -= stepMultiplier;           // 逆時針旋轉   
    }  
  // 更新上一次的狀態和時間戳  
    lastA = a;  
    lastB = b;  
    lastTime = currentTime;  
   // 根據時間差調整步數增加的倍數
    adjustStepMultiplier(currentTime - lastTime);  
}  
// 調整步數增加的倍數
void adjustStepMultiplier(uint timeDiff) {
  if (timeDiff < 5) {  
        // 旋轉非常快  
        stepMultiplier = 5;  
    } else if (timeDiff < 10) {  
        // 旋轉快  
        stepMultiplier = 3;  
    } else if (timeDiff < 20) {  
        // 旋轉中等速度  
        stepMultiplier = 2;  
    } else {  
        // 旋轉慢或停止  
        stepMultiplier = 1;  
    }     
}  
  //初始化定時器
void initTimer() {
  TMOD = 0x01; // 設置定時器模式  
    TH0 = (65536 - 1000) / 256; // 設置定時器初值,假設12MHz晶振,每1ms中斷一次  
    TL0 = (65536 - 1000) % 256;  
    ET0 = 1; // 開啟定時器0中斷  
    EA = 1;  // 開啟全局中斷  
    TR0 = 1; // 啟動定時器0     
}
void delayms(void) {  
    unsigned char i;  
    for (i = 0; i<100; i++)
                  ;  
       // 這個循環的數字可能需要根據您的MCU時鐘進行調整  
}  
// 初始化數字電位器
void initPotentiometer() {
   CS = 0;  
    U_D = 0;  
    INC = 0;  
    INC = 1;  
    CS = 1;  
    delayms(1);   
}  
// 調整數字電位器  
void adjustPotentiometer(int stepsToAdjust, uchar direction) {  
    if (stepsToAdjust == 0) return;  // 沒有步數則不調整
    CS = 0;  
    U_D = direction;  
    for (int i = 0; i < abs(stepsToAdjust); i++) {  
        INC = 0;  
        _nop_();  
        _nop_();  
        INC = 1;  
    }  
    CS = 1;  
    // 這里應該有一個適當的延遲,但delayms函數沒有定義  
    // 你需要自己實現這個函數,或者使用其他方法延遲  
}  

void main() {  
    initTimer();                     // 初始化定時器
    initPotentiometer();      // 初始化數字電位器

    while (1) {  
        if (currentTime != lastTime) { // 檢查是否有新的編碼器讀數  
            adjustPotentiometer(steps, steps > 0 ? 1 : 0); // 根據steps的符號確定方向  
            steps = 0; // 清除步數  
        }  
        // ... (其他邏輯)  
    }  
}

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久婷婷天堂 | 黄免费观看视频 | 国产一区高清 | 五月婷婷激情网 | 国产片侵犯亲女视频播放 | 免费观看毛片 | 精品免费国产视频 | 精品福利一区 | 国产伦精品一区二区三区四区视频 | 中文字幕第一页在线 | 在线观看亚洲专区 | 免费看啪啪网站 | 国产亚洲一区二区精品 | 69电影网| 欧美一级欧美三级在线观看 | 国产欧美一区二区三区国产幕精品 | 正在播放国产精品 | 亚洲欧美激情四射 | 欧美日韩一区精品 | 毛片免费观看 | 爱草在线 | 欧美精品乱码99久久影院 | 国产精品高潮呻吟久久aⅴ码 | 亚洲国产精品久久久 | 国产1区2区 | 91视频官网| 国产一级免费在线观看 | 日日夜夜天天 | 久久成人国产精品 | 国产精品色婷婷久久58 | 国产在线观看一区二区 | 国产高清免费在线 | 四虎永久在线精品免费一区二 | 国产一区二区三区视频免费观看 | 日本不卡一区二区三区在线观看 | 久久综合九九 | 91亚洲国产 | 国产成人在线一区二区 | 特级做a爰片毛片免费看108 | 9191在线播放 | 欧美特级黄色 |