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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1314|回復: 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 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区三区视频 | aaaaaa大片免费看最大的 | 91久久久久久久 | a在线视频 | 国产1区 | 欧美一二三区 | 亚洲男人天堂 | 国产精品国产三级国产aⅴ无密码 | 久久精品欧美一区二区三区不卡 | 在线视频国产一区 | 九九热久久免费视频 | 亚洲视频一区在线观看 | caoporn视频在线 | caoporn国产精品免费公开 | 欧美理伦片在线播放 | 国产在线观看一区二区三区 | 日韩精品一区中文字幕 | 欧美精品一区在线 | 天堂一区二区三区 | 综合在线视频 | 欧美99| 中文字幕欧美一区二区 | 久久国产精品一区二区三区 | 成人免费网站 | 国产一区二区三区色淫影院 | 91麻豆精品国产91久久久更新资源速度超快 | 中文字幕在线网 | 亚洲一二视频 | 一区二区三区欧美 | 亚洲精品久久久久久一区二区 | 亚洲精品久久久久中文字幕欢迎你 | 国产激情三区 | av黄色片| 久久综合久久自在自线精品自 | 日韩精品一区二区三区在线观看 | 国产色婷婷精品综合在线手机播放 | 亚洲精选一区二区 | 粉嫩一区二区三区国产精品 | 天堂成人国产精品一区 | 亚洲综合大片69999 | 成人高潮片免费视频欧美 |