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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8G單片機單個io口連接6個按鍵,引腳的電壓會影響采集電壓怎么辦

  [復制鏈接]
跳轉到指定樓層
樓主
想通過adc采集電壓,讓一個引腳接6個按鍵進行不同的功能,經過計算后接入不同的電阻如原理圖,但是s1和s2處實際電壓跟算出來的不一樣,后面我把單片機1腳的電路斷開,單獨測了1腳的電壓有2.8v,s1和s2的電壓也跟計算的一樣了。有什么辦法能夠讓1腳的電壓不影響到s1和2呀,還是只能重新計算阻值了,但是那個實際的電壓我也想不通是怎么算出來的,有沒有大神救救我理論電壓:s1:0.41v s2:1.24v s3:2.07v s4:2.91v s5:3.73v s6:4.57v
實際電壓:s1:1.89v s2:1.89v s3:2.23v s4:2.94v s5:3.5v  s6:4.6v
按鍵電壓范圍:s1:0-0.83v s2:0.83-1.66v s3:1.66-2.49v s4:2.49-3.32v s5:3.32-4.15v s6:4.15-4.9v




還有一個就是我s3 s4 s5 s6的電壓跟計算的差不多,但是按鍵的功能也實現不了,調光程序是之前寫好的可以用的,我就在里面加了adc和check_keys函數,不知道為什么用不了
s1:控制燈開關和閉合 s2:將燈調為0% s3:25% s4:50% s5:75% s6:100%
程序:
#include        "config.h"
#include        "gpio.h"
#include        "UART.h"
#include        "delay.h"
#include         "stdio.h"
#include        "STC8xxxx.H"
#include        "string.h"
#include         "light.h"
#include        "my_uart.h"
#include        "timer.h"

unsigned long timer0_count = 0;
unsigned char PWM_T = 0;   //0-250占空比控制變
unsigned char current_brightness = 0;        //當前亮度
unsigned char light_switch_state = 0;        //燈開關狀態
signed int    brightness = 0;
unsigned char key_open = 1;
#define IT_HZ        100000        //中斷頻率
#define TIM0_VALUE        65536UL - (MAIN_Fosc / IT_HZ)

void        light_init(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //結構定義
        TIM_InitTypeDef                TIM_InitStructure;                                                //結構定義
/************************ P33 IO口配置 ****************************/
        GPIO_InitStructure.Pin  = LIGHT_PIN;                                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(LIGHT_PORT,&GPIO_InitStructure);        //初始化

/************************ 定時器配置 ****************************/
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_Priority    = Priority_0;                        //指定中斷優先級(低到高) Priority_0,Priority_1,Priority_2,Priority_3
        TIM_InitStructure.TIM_Interrupt = ENABLE;                                        //中斷是否允許,   ENABLE或DISABLE
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定時鐘源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否輸出高速脈沖, ENABLE或DISABLE
        // TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 100000UL);                //初值,
        TIM_InitStructure.TIM_Value     = TIM0_VALUE;                //初值,
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后啟動定時器, ENABLE或DISABLE
        Timer_Inilize(Timer0,&TIM_InitStructure);                                        //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4

}


//設置高電平占空比
//num: 0-100%
void set_duty_cycle(unsigned char num)
{
        current_brightness = num;
        if(num > 0)
        {
                light_switch_state = 1;
        }
        else
        {
                light_switch_state = 0;
        }
        PWM_T = (float)(num / 100.0)*250;
}

/********************* Timer0中斷函數************************/
void timer0_int (void) interrupt TIMER0_VECTOR
{
         timer0_count++;    //每次定時器溢出加1
         
         if(timer0_count==250)   //PWM周期 100個單位
                 {
                        timer0_count=0;  //使t=0,開始新的PWM周期
                        LIGHT = 1;        //開燈
                 }
         
         if(PWM_T==timer0_count)  //按照當前占空比切換輸出為高電平
                 {  
                        LIGHT = 0;        //關燈
                 }

}

//獲取燈光占空比
//返回值: 0-100
int get_light_pwm(void)
{
        return PWM_T*100/250;
        // return 0;
}

void light_open(void)  //通電時亮燈為25%
{
          EA = 1;
                light_switch_state = 1;
                set_duty_cycle(25);                //設置占空比
          brightness = 25;
}


#define ADC_CHANNEL 4 // 使用P5.4作為ADC輸入,對應ADC通道4
#define VCC 5000      // 供電電壓,單位mV

// 初始化系統
void System_Init(void)
        {
    P5M1 = 0x00; // 設置P5.4為模擬輸入 引腳1
    P5M0 = 0x10;

    // 設置ADC
    ADC_CONTR = 0x80 + (ADC_CHANNEL << 3); // 選擇ADC通道4
    ADC_RES = 0x00;
    ADC_RESL = 0x00;
        }

// 讀取ADC值
int Read_ADC(void)
{
    ADC_CONTR |= 0x80; // 開始ADC轉換
    while(ADC_CONTR & 0x80); // 等待轉換完成
    return (ADC_RES << 8) | ADC_RESL; // 返回10位ADC結果
}

// 判斷按鍵
void Check_Keys(int adc_value)
        {
    if (adc_value > 0 && adc_value < 170)  //按鍵s1
                        {
                                        if(light_switch_state==1)  //如果燈是開的就關閉
                                        {
                                                light_switch_state=0;
                                                EA = 0;
                                                set_duty_cycle(0);
                                                LIGHT = 0;                        
                                        }
                                        else     //燈是滅的就打開并設置為50%
                                        {
                                                EA = 1;
                                                light_switch_state=1;
                                                brightness = 50;
                                                set_duty_cycle(brightness);                //設置占空比
                                        }
      }
                else if (adc_value >= 171 && adc_value < 340)   //按鍵s2 設置為0
                        {
                                brightness = 0;
                                set_duty_cycle(brightness);
        // 按鍵2
      }
                else if (adc_value >= 341 && adc_value < 510)  //按鍵s3 設置為25%
                        {
                                brightness = 25;
                                set_duty_cycle(brightness);
        // 按鍵3
      }
                else if (adc_value >= 511 && adc_value < 680)  //按鍵s4 設置為50%
                        {
                                brightness = 50;
                                set_duty_cycle(brightness);
        // 按鍵4
      }
                else if (adc_value >= 681 && adc_value < 850)   //按鍵s5 設置為75%
                        {
                                brightness = 75;
                                set_duty_cycle(brightness);
        // 按鍵5
      }
                else if(adc_value >=851 && adc_value <1005)  //按鍵s6 設置為100%
                {
                        brightness = 100;
                        set_duty_cycle(brightness);
                }
        }

// 主函數
void main(void)
        {
            System_Init();
            light_init();                //使用定時器0作pwm功能
            EA = 0;
               
            delay_ms(5000);
            light_open();
               
    while (1)
                        {
        int adc_value = Read_ADC(); // 讀取ADC值
                                delay_ms(1);
        Check_Keys(adc_value);           // 檢查按鍵
      }
        }




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

使用道具 舉報

沙發
ID:1133081 發表于 2024-12-6 07:07 | 只看該作者
P5.4設置高阻模式   P5M0 = 0x00; P5M1 = 0x10;
回復

使用道具 舉報

板凳
ID:1109793 發表于 2024-12-6 07:38 | 只看該作者
引腳設置為高祖輸入狀態嘛
回復

使用道具 舉報

地板
ID:857072 發表于 2024-12-6 07:59 來自手機 | 只看該作者
你沒有算按鍵的阻值嗎。
回復

使用道具 舉報

5#
ID:1076567 發表于 2024-12-6 09:04 | 只看該作者
WL0123 發表于 2024-12-6 07:07
P5.4設置高阻模式   P5M0 = 0x00; P5M1 = 0x10;

就是設置成高阻模式下還有電壓
回復

使用道具 舉報

6#
ID:1076567 發表于 2024-12-6 09:08 | 只看該作者
a185980800 發表于 2024-12-6 07:59
你沒有算按鍵的阻值嗎。

按鍵的阻值,按鍵也有阻值嗎,還是說按鍵連接的電阻,這個我算好了的,但是p5.4處有電壓 s1和s2處的就不準了
回復

使用道具 舉報

7#
ID:1076567 發表于 2024-12-6 09:08 | 只看該作者
xiaobendan001 發表于 2024-12-6 07:38
引腳設置為高祖輸入狀態嘛

就是設置成高阻模式下還有電壓
回復

使用道具 舉報

8#
ID:446156 發表于 2024-12-6 10:11 | 只看該作者
用放大器跟隨一下再進IO口
回復

使用道具 舉報

9#
ID:446156 發表于 2024-12-6 10:12 | 只看該作者
再說了你這玩意為什么非要和計算的一樣才行,直接把按鍵按下去看看實際讀數然后把讀數記下來不就得了
回復

使用道具 舉報

10#
ID:1138748 發表于 2024-12-6 10:14 | 只看該作者
在按鍵上并聯0.01uf的電容
回復

使用道具 舉報

11#
ID:57657 發表于 2024-12-6 12:10 | 只看該作者
a185980800 發表于 2024-12-6 07:59
你沒有算按鍵的阻值嗎。

按鍵的阻值在毫歐級別可以忽略不計。
回復

使用道具 舉報

12#
ID:92781 發表于 2024-12-6 15:40 | 只看該作者
你可以把電阻串聯,這樣就好計算了

51hei截圖_20241206153938.png (113.25 KB, 下載次數: 0)

51hei截圖_20241206153938.png
回復

使用道具 舉報

13#
ID:1133081 發表于 2024-12-6 21:09 | 只看該作者
Dokkis 發表于 2024-12-6 09:04
就是設置成高阻模式下還有電壓

你仔細看看你的程序里設置的是什么模式!犯這么低級的錯誤。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲午夜av | 99re免费 | 91精品国产91久久久久久密臀 | 精品国产一区一区二区三亚瑟 | 中文字幕在线欧美 | 91精品在线播放 | 久久久久中文字幕 | a在线观看 | 欧美日韩综合一区 | 2018中文字幕第一页 | 欧美乱码精品一区二区三区 | 国产91精品久久久久久久网曝门 | 国产一级黄色网 | 欧美日韩精品在线免费观看 | 亚洲精品久久久久中文字幕欢迎你 | 精品久久国产视频 | wwwxx在线观看| 欧美一级视频免费看 | 久久av一区二区三区 | 亚洲网一区 | 欧美视频1区 | 国外成人在线视频网站 | 人和拘一级毛片c | 国产一级视频在线 | 亚洲精品99 | 夜夜艹 | 日日摸夜夜添夜夜添特色大片 | 天天操 夜夜操 | 国产精品毛片一区二区在线看 | 久久久久久久久淑女av国产精品 | 欧美日韩成人在线 | 久久久久久久久久久久久9999 | 五十女人一级毛片 | 日韩一区二区在线视频 | 91佛爷在线观看 | 午夜影院操 | 国产目拍亚洲精品99久久精品 | 91在线中文字幕 | 色综合色综合色综合 | xxx视频| 九九九视频在线观看 |