国产精品人人做人人爽-婷婷丁香在线-亚洲精品久久午夜麻豆-无码AV中文一区二区三区-精品亚洲成?人在线观看青青-亚洲日韩av中文无码专区-亚洲AV无码久久一区二区三区-日本欧美中文字幕人在线-日韩久久AV-久久精品国产亚洲不AV麻豆

I Love mcu
歡迎光臨我愛單片機博客!

基于51單片機的編碼器調(diào)節(jié)燈光亮度C51源碼

基于51單片機的編碼器調(diào)節(jié)燈光亮度源碼,編碼器調(diào)節(jié)0-100的亮度值通過串口發(fā)送到燈具的控制板(也是單片機控制)進行調(diào)光。本人公司項目分享。
#include <reg52.h>

 

// 定義編碼器引腳
sbit ENC_A = P3^2; ?// 編碼器A相 – 連接到外部中斷0
sbit ENC_B = P3^3; ?// 編碼器B相 – 連接到外部中斷1

 

// 全局變量
unsigned char encoder_value = 0; ? ? // 當(dāng)前編碼器值 (0-100)
unsigned char last_enc_a = 1; ? ? ? ?// 上一次A相狀態(tài)
unsigned char debounce_timer = 0; ? ?// 消抖定時器計數(shù)器
bit debounce_flag = 0; ? ? ? ? ? ? ? // 消抖標(biāo)志

 

// 串口初始化 – 115200波特率, 8位數(shù)據(jù), 1位停止位, 無校驗
void UART_Init(void) {
? ? TMOD |= 0x20; ? // 定時器1工作在模式2 (自動重裝)
? ? TH1 = 0xFA; ? ? // 115200波特率 @ 11.0592MHz
? ? TL1 = 0xFA;
? ? TR1 = 1; ? ? ? ?// 啟動定時器1
? ? SCON = 0x50; ? ?// 串口工作在模式1, 允許接收
? ? EA = 1; ? ? ? ? // 開啟總中斷
? ? ES = 1; ? ? ? ? // 開啟串口中斷
}

 

// 定時器0初始化 – 用于消抖, 約1ms中斷一次
void Timer0_Init(void) {
? ? TMOD |= 0x01; ? // 定時器0工作在模式1 (16位)
? ? TH0 = (65536 – 1000) / 256; ? // 1ms @ 11.0592MHz
? ? TL0 = (65536 – 1000) % 256;
? ? TR0 = 1; ? ? ? ?// 啟動定時器0
? ? ET0 = 1; ? ? ? ?// 開啟定時器0中斷
}

 

// 外部中斷初始化
void EXTI_Init(void) {
? ? IT0 = 1; ? ? ? ?// 外部中斷0下降沿觸發(fā)
? ? IT1 = 1; ? ? ? ?// 外部中斷1下降沿觸發(fā)
? ? EX0 = 1; ? ? ? ?// 開啟外部中斷0
? ? EX1 = 1; ? ? ? ?// 開啟外部中斷1
}

 

// 發(fā)送字符串
void UART_Send_String(unsigned char *str) {
? ? while(*str) {
? ? ? ? SBUF = *str++;
? ? ? ? while(!TI);
? ? ? ? TI = 0;
? ? }
}

 

// 發(fā)送數(shù)字 (0-100)
void UART_Send_Number(unsigned char num) {
? ? unsigned char buf[4];
? ? buf[3] = ‘\0’;
? ? buf[2] = num % 10 + ‘0’;
? ? buf[1] = (num / 10) % 10 + ‘0’;
? ? buf[0] = (num / 100) % 10 + ‘0’;
? ? // 去除前導(dǎo)零
? ? if(buf[0] == ‘0’) {
? ? ? ? if(buf[1] == ‘0’) {
? ? ? ? ? ? UART_Send_String(&buf[2]);
? ? ? ? } else {
? ? ? ? ? ? UART_Send_String(&buf[1]);
? ? ? ? }
? ? } else {
? ? ? ? UART_Send_String(buf);
? ? }
}

 

// 定時器0中斷服務(wù)程序 – 消抖處理
void Timer0_ISR() interrupt 1 {
? ? TH0 = (65536 – 1000) / 256; ? // 重裝初值
? ? TL0 = (65536 – 1000) % 256;
? ? if(debounce_flag) {
? ? ? ? debounce_timer++;
? ? ? ? // 消抖時間約10ms (10次中斷)
? ? ? ? if(debounce_timer >= 10) {
? ? ? ? ? ? debounce_flag = 0;
? ? ? ? ? ? debounce_timer = 0;
? ? ? ? }
? ? }
}

 

// 編碼器處理函數(shù)
void Process_Encoder(void) {
? ? unsigned char current_a = ENC_A;
? ? if(current_a != last_enc_a && !debounce_flag) {
? ? ? ? // 檢測旋轉(zhuǎn)方向
? ? ? ? if(ENC_B != current_a) {
? ? ? ? ? ? // 順時針旋轉(zhuǎn) – 數(shù)值增加
? ? ? ? ? ? if(encoder_value < 100) {
? ? ? ? ? ? ? ? encoder_value++;
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? // 逆時針旋轉(zhuǎn) – 數(shù)值減少
? ? ? ? ? ? if(encoder_value > 0) {
? ? ? ? ? ? ? ? encoder_value–;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 發(fā)送當(dāng)前值
? ? ? ? UART_Send_Number(encoder_value);
? ? ? ? UART_Send_String(“\r\n”);
? ? ? ? last_enc_a = current_a;
? ? ? ? debounce_flag = 1;
? ? ? ? debounce_timer = 0;
? ? }
}

 

// 外部中斷0服務(wù)程序 – 編碼器A相觸發(fā)
void EXTI0_ISR() interrupt 0 {
? ? Process_Encoder();
}

 

// 外部中斷1服務(wù)程序 – 編碼器B相觸發(fā)
void EXTI1_ISR() interrupt 2 {
? ? Process_Encoder();
}

 

// 主函數(shù)
void main(void) {
? ? UART_Init(); ? ?// 初始化串口
? ? Timer0_Init(); ?// 初始化定時器0 (消抖用)
? ? EXTI_Init(); ? ?// 初始化外部中斷
? ? UART_Send_String(“Encoder Ready!\r\n”);
? ? UART_Send_String(“Current Value: “);
? ? UART_Send_Number(encoder_value);
? ? UART_Send_String(“\r\n”);
? ? while(1) {
? ? ? ? // 主循環(huán) – 可添加其他任務(wù)
? ? }
}

 

贊(4) 打賞
分享到

我愛單片機博客

單片機開發(fā)、學(xué)習(xí)、交流與分享博客!

關(guān)于我們聯(lián)系我們

登錄

找回密碼

注冊