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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1123|回復(fù): 12
收起左側(cè)

STC8G單片機(jī)單個(gè)io口連接6個(gè)按鍵,引腳的電壓會(huì)影響采集電壓怎么辦

  [復(fù)制鏈接]
ID:1076567 發(fā)表于 2024-12-5 16:47 | 顯示全部樓層 |閱讀模式
想通過adc采集電壓,讓一個(gè)引腳接6個(gè)按鍵進(jìn)行不同的功能,經(jīng)過計(jì)算后接入不同的電阻如原理圖,但是s1和s2處實(shí)際電壓跟算出來的不一樣,后面我把單片機(jī)1腳的電路斷開,單獨(dú)測(cè)了1腳的電壓有2.8v,s1和s2的電壓也跟計(jì)算的一樣了。有什么辦法能夠讓1腳的電壓不影響到s1和2呀,還是只能重新計(jì)算阻值了,但是那個(gè)實(shí)際的電壓我也想不通是怎么算出來的,有沒有大神救救我理論電壓:s1:0.41v s2:1.24v s3:2.07v s4:2.91v s5:3.73v s6:4.57v
實(shí)際電壓: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
51hei圖片_20241205151950.png



還有一個(gè)就是我s3 s4 s5 s6的電壓跟計(jì)算的差不多,但是按鍵的功能也實(shí)現(xiàn)不了,調(diào)光程序是之前寫好的可以用的,我就在里面加了adc和check_keys函數(shù),不知道為什么用不了
s1:控制燈開關(guān)和閉合 s2:將燈調(diào)為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;        //當(dāng)前亮度
unsigned char light_switch_state = 0;        //燈開關(guān)狀態(tài)
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;                                //結(jié)構(gòu)定義
        TIM_InitTypeDef                TIM_InitStructure;                                                //結(jié)構(gòu)定義
/************************ 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);        //初始化

/************************ 定時(shí)器配置 ****************************/
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_Priority    = Priority_0;                        //指定中斷優(yōu)先級(jí)(低到高) Priority_0,Priority_1,Priority_2,Priority_3
        TIM_InitStructure.TIM_Interrupt = ENABLE;                                        //中斷是否允許,   ENABLE或DISABLE
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定時(shí)鐘源,     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;                                        //是否初始化后啟動(dòng)定時(shí)器, ENABLE或DISABLE
        Timer_Inilize(Timer0,&TIM_InitStructure);                                        //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4

}


//設(shè)置高電平占空比
//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中斷函數(shù)************************/
void timer0_int (void) interrupt TIMER0_VECTOR
{
         timer0_count++;    //每次定時(shí)器溢出加1
         
         if(timer0_count==250)   //PWM周期 100個(gè)單位
                 {
                        timer0_count=0;  //使t=0,開始新的PWM周期
                        LIGHT = 1;        //開燈
                 }
         
         if(PWM_T==timer0_count)  //按照當(dāng)前占空比切換輸出為高電平
                 {  
                        LIGHT = 0;        //關(guān)燈
                 }

}

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

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


#define ADC_CHANNEL 4 // 使用P5.4作為ADC輸入,對(duì)應(yīng)ADC通道4
#define VCC 5000      // 供電電壓,單位mV

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

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

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

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

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




回復(fù)

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2024-12-6 07:07 | 顯示全部樓層
P5.4設(shè)置高阻模式   P5M0 = 0x00; P5M1 = 0x10;
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-12-6 07:38 | 顯示全部樓層
引腳設(shè)置為高祖輸入狀態(tài)嘛
回復(fù)

使用道具 舉報(bào)

ID:857072 發(fā)表于 2024-12-6 07:59 來自觸屏版 | 顯示全部樓層
你沒有算按鍵的阻值嗎。
回復(fù)

使用道具 舉報(bào)

ID:1076567 發(fā)表于 2024-12-6 09:04 | 顯示全部樓層
WL0123 發(fā)表于 2024-12-6 07:07
P5.4設(shè)置高阻模式   P5M0 = 0x00; P5M1 = 0x10;

就是設(shè)置成高阻模式下還有電壓
回復(fù)

使用道具 舉報(bào)

ID:1076567 發(fā)表于 2024-12-6 09:08 | 顯示全部樓層
a185980800 發(fā)表于 2024-12-6 07:59
你沒有算按鍵的阻值嗎。

按鍵的阻值,按鍵也有阻值嗎,還是說按鍵連接的電阻,這個(gè)我算好了的,但是p5.4處有電壓 s1和s2處的就不準(zhǔn)了
回復(fù)

使用道具 舉報(bào)

ID:1076567 發(fā)表于 2024-12-6 09:08 | 顯示全部樓層
xiaobendan001 發(fā)表于 2024-12-6 07:38
引腳設(shè)置為高祖輸入狀態(tài)嘛

就是設(shè)置成高阻模式下還有電壓
回復(fù)

使用道具 舉報(bào)

ID:446156 發(fā)表于 2024-12-6 10:11 | 顯示全部樓層
用放大器跟隨一下再進(jìn)IO口
回復(fù)

使用道具 舉報(bào)

ID:446156 發(fā)表于 2024-12-6 10:12 | 顯示全部樓層
再說了你這玩意為什么非要和計(jì)算的一樣才行,直接把按鍵按下去看看實(shí)際讀數(shù)然后把讀數(shù)記下來不就得了
回復(fù)

使用道具 舉報(bào)

ID:1138748 發(fā)表于 2024-12-6 10:14 | 顯示全部樓層
在按鍵上并聯(lián)0.01uf的電容
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2024-12-6 12:10 | 顯示全部樓層
a185980800 發(fā)表于 2024-12-6 07:59
你沒有算按鍵的阻值嗎。

按鍵的阻值在毫歐級(jí)別可以忽略不計(jì)。
回復(fù)

使用道具 舉報(bào)

ID:92781 發(fā)表于 2024-12-6 15:40 | 顯示全部樓層
你可以把電阻串聯(lián),這樣就好計(jì)算了
51hei截圖_20241206153938.png
回復(fù)

使用道具 舉報(bào)

ID:1133081 發(fā)表于 2024-12-6 21:09 | 顯示全部樓層
Dokkis 發(fā)表于 2024-12-6 09:04
就是設(shè)置成高阻模式下還有電壓

你仔細(xì)看看你的程序里設(shè)置的是什么模式!犯這么低級(jí)的錯(cuò)誤。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品自在线 | 麻豆做爰免费观看 | av色婷婷 | 久久精品一区二区三区四区 | 四虎在线观看视频 | 亚洲精品乱码久久久久久 | 福利视频网站 | 天天爽夜夜爽夜夜爽精品视频 | 欧美一级片在线 | 色多多视频在线观看 | 色多多视频在线观看 | 午夜av网站 | 久久精品欧美一区 | aaaaa毛片 | 国产福利视频在线 | 久久精品小视频 | 国产a毛片| 中文在线观看免费视频 | a视频在线免费观看 | 精品一区二区三区在线观看 | 成年人视频网站 | 在线一区 | 国产精品一区在线播放 | 午夜天堂在线 | 五月天激情综合网 | 国产伦理一区二区 | 亚洲视频精品 | 欧美成人免费 | 久久香蕉精品 | 亚洲第一区在线观看 | 日本中文字幕在线视频 | 黄色片在线免费观看 | 久久亚洲成人 | 亚洲免费婷婷 | 黄色片免费在线观看 | 成 人 黄 色 片 在线播放 | 在线一区二区三区 | 国产成人精品亚洲男人的天堂 | 操综合| 成人激情综合网 | 好色影院 |