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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

stc8g單片機單個io口連接5個按鍵,用adc采集電壓,會自己跳轉功能?

查看數: 1386 | 評論數: 15 | 收藏 1
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2024-12-30 16:46

正文摘要:

用的是stc8g1k08a單片機,用p5.4口接5個按鍵,電壓分別是0.33v、1.18v、2.87v、3.79v、4.59v,想讓這幾個按鍵分別調光0、25%、50%、75%、100%,按鍵按下的時候可以執行此功能,但是過一會兒(有時幾秒有時一分鐘)就 ...

回復

ID:1076567 發表于 2025-1-6 11:40
lkc8210 發表于 2024-12-31 17:40
1. adc_value 在Check_Keys()函數內是不變的,if()delay()if的多余的,不要死抄按鍵消抖
2. 主循環的set_d ...

后面在電路中加了個電容解決了,只是不加按鍵消抖的話按鍵有時有點不靈敏,可能按鍵用久了也不太好用,加上消抖的話會有什么其他問題嗎,之前經常這樣用這個中值濾波我試了,通電的時候會自己亮,而且按鍵也完全不起作用了,是不是跟我的電路不太匹配呀,我把我的電路貼到上面了
ID:1076567 發表于 2025-1-6 11:29
coody_sz 發表于 2024-12-31 15:18
可以參考STC官方的ADC鍵盤電路,16個鍵的。

官方的電路是在官網看嗎 我只看到一個觸摸按鍵的演示視頻,還是是在論壇里面搜索呀
ID:1076567 發表于 2025-1-6 11:24
WL0123 發表于 2024-12-31 11:01
stc8g1k08a有現成的硬件PWM不用?定時器中斷頻率過高有可能影響ADC。ADC連續采樣3次,拋棄前兩次數據,以第 ...

謝謝大神,加上電容確實解決了,只是不加軟件防抖的話有時按鍵會失靈,估計是按鍵也有點問題,加上軟件防抖的話會有其它什么問題嗎
ID:1076567 發表于 2025-1-6 11:20
zhuls 發表于 2024-12-31 11:00
AD按鍵串,要沒按鍵時,電壓確實是高的,約=于電源電壓。除非你的接法比較另類。
10bit的ADC,分5檔有4個 ...

確實在開機時會高亮一下,大神有沒有什么解決辦法,我試過在開機的時候讓IO口直接等于0,還是不行
ID:1109793 發表于 2024-12-31 19:37
的確里面的延時沒有任何意義
  1. //按鍵1
  2.   if(adc_value > 20 && adc_value < 144)
  3.     {
  4.                 set_duty_cycle(0);
  5.                 return;
  6.                 }
  7. //按鍵2
  8.         if (adc_value > 144 && adc_value < 307)
  9.                 {
  10.                 set_duty_cycle(25);
  11.                 return;
  12.                 }
復制代碼

這樣看起來簡潔一些
ID:1109793 發表于 2024-12-31 19:29
WL0123 發表于 2024-12-31 15:41
你仔細看了樓主的代碼嗎?

之前好像是要先聲明才能使用的,但是現在的編譯器是可以這樣寫的。
ID:161164 發表于 2024-12-31 17:40
1. adc_value 在Check_Keys()函數內是不變的,if()delay()if的多余的,不要死抄按鍵消抖
2. 主循環的set_duty_cycle(brightness)也很多余,Check_Keys()函數內有按鍵已經運行一次了,不用在主循環不斷運行
3. 可以試試中值濾波
  1. #define ARRAY_SIZE 10

  2. // 中值濾波函數
  3. unsigned char median_filter() {
  4.     unsigned char sorted[ARRAY_SIZE];
  5.     unsigned char i, j, k;
  6.        
  7.     for (i = 0; i < ARRAY_SIZE; i++) {
  8.                 sorted[i] = Read_ADC(); // 讀取ADC值
  9.     }
  10.         // 冒泡排序 sorted 數組
  11.         for (j = 0; j < ARRAY_SIZE - 1; j++) {
  12.                 for (k = 0; k < ARRAY_SIZE - j - 1; k++) {
  13.                         if (sorted[k] > sorted[k + 1]) {
  14.                                 // 交換
  15.                                 unsigned char temp = sorted[k];
  16.                                 sorted[k] = sorted[k + 1];
  17.                                 sorted[k + 1] = temp;
  18.                         }
  19.                 }
  20.         }
  21.         // 找到中值并賦值給輸出
  22.    return sorted[ARRAY_SIZE / 2];
  23. }

  24. // 主函數
  25. void main(void)
  26. {
  27.         P5M0 = 0x00;
  28.         P5M1 = 0x10; // 設置P5.4為高阻輸入
  29.         P3M0 = 0x08;
  30.         P3M1 = 0xf7; // P3.3為推挽輸出
  31.         System_Init();
  32.         light_init();                //使用定時器0作pwm功能
  33.         delay_ms(5);
  34.         EA = 1;

  35.         while (1)
  36.         {
  37.                 int adc_value = median_filter();
  38.                 Check_Keys(adc_value);           // 檢查按鍵
  39.         }
  40. }
復制代碼
ID:1133081 發表于 2024-12-31 15:41
zhuls 發表于 2024-12-31 13:46
你老師說的嗎?
還是你師傅教的?
或是你哪本書上看到的?

你仔細看了樓主的代碼嗎?
ID:1034262 發表于 2024-12-31 15:18
可以參考STC官方的ADC鍵盤電路,16個鍵的。
ID:69038 發表于 2024-12-31 13:46
WL0123 發表于 2024-12-31 11:22
不宜在主循環內定義變量
// 主函數
void main(void)


你老師說的嗎?
還是你師傅教的?
或是你哪本書上看到的?

這好象說不過去啊,也不影響什么的。。
ID:1133081 發表于 2024-12-31 11:22
不宜在主循環內定義變量
// 主函數
void main(void)
{
        int adc_value;
        P5M0 = 0x00; P5M1 = 0x10; // 設置P5.4為高阻輸入
        P3M0 = 0x08; P3M1 = 0xf7; // P3.3為推挽輸出
        System_Init();
        light_init();                //使用定時器0作pwm功能
        delay_ms(5);
        EA = 1;                              
       
        while (1)
        {
                adc_value = Read_ADC(); // 讀取ADC值
                delay_ms(10);
                Check_Keys(adc_value);           // 檢查按鍵
                set_duty_cycle(brightness);
        }
}
ID:1133081 發表于 2024-12-31 11:01
stc8g1k08a有現成的硬件PWM不用?定時器中斷頻率過高有可能影響ADC。ADC連續采樣3次,拋棄前兩次數據,以第3次數據為準或連續采樣8-10次取平均值。ADC輸入端加1K電阻和102電容組成低通濾波。 Check_Keys函數去掉delay_ms(10),不需要軟件防抖。
ID:69038 發表于 2024-12-31 11:00
AD按鍵串,要沒按鍵時,電壓確實是高的,約=于電源電壓。除非你的接法比較另類。
10bit的ADC,分5檔有4個節點,平均每節點相差256個計數,為了容錯,節點上下+-128個計數:
0檔<=128;
1檔<=384,>128;
2檔<=640,>384;
3檔<=896,>640;
4檔>896;
基實,人眼對光的敏感度并不是線性的,所以,“0、25%、50%、75%、100%”的值不一定適合。。
在數據處理時,0檔和4檔不需要輸出PWM,直接IO出低電平或出高電平;
ADC在采樣時要有數字濾波比較好。
然后就是按鍵的接觸電阻要穩定、分壓電阻要穩定。。
===
我曾用電位器調整ADC的值,來控制PWM輸出實現無級調光,好用是好用,但發現有2個缺點,
就是在某些范圍內的占空比時,明顯看到燈會閃,不同的頻率周期,這個范圍也不盡相同,
可能軟件還要做個關于PWM的周期與占空比的適配。。
另一個問題是,只要配置了PWM,IO就輸出高電平,然后再按PWM配置輸出占空比,
表現為開機時燈會高亮一下,再按PWM顯示亮度。。

=====這是一個宿醉剛起、頭腦尚未完全清醒者的發言====
====以內容上僅供參考,不負任何法律或道義上的責任====
ID:192020 發表于 2024-12-31 10:50
首先Check_Keys中的delay_ms(10);沒什么作用,因為adc_value在Check_Keys運行時就不會改變,加上延遲指也是不會變的。然后Read_ADC沒做濾波,這兩個方面處理下應該好很多
                       
ID:161164 發表于 2024-12-31 09:20
官方的解釋是你的外圍電路做的不好
請按手冊來畫

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩a视频 | 午夜成人在线视频 | av影音资源| 日韩高清一区二区 | 日韩在线观看一区 | 久久久www成人免费无遮挡大片 | 国产亚洲一区二区三区 | a级黄色网| 成人自拍视频 | 中国美女一级黄色片 | 中文字幕在线精品 | 精品一区av | 五月综合久久 | 亚洲成人自拍 | 91在线看| 日本免费一区二区三区四区 | 精品国产精品三级精品av网址 | 777777777亚洲妇女 | 91精品国产综合久久婷婷香蕉 | 在线视频成人 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 99久热| 久久久久久久电影 | 国产亚洲精品精品国产亚洲综合 | 很黄很污的网站 | 国内精品视频一区二区三区 | www97影院 | 亚洲一区电影 | 国产精品一区二 | 久久青草av | 国产精品夜间视频香蕉 | 国产精品亚洲精品 | aaaaa毛片| 亚洲在线一区二区三区 | 国产午夜精品一区二区三区 | 日韩图区 | h视频在线观看免费 | 色噜噜亚洲男人的天堂 | 中文字幕一区二区三区在线视频 | 九色 在线| 欧美一级片在线 |