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

QQ登錄

只需一步,快速開始

搜索
查看: 355|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

stc代碼學(xué)習(xí)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1092316 發(fā)表于 2025-3-23 17:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
如以下代碼均實(shí)際可用:   

#include <stc15.h>       // 包含STC15系列單片機(jī)頭文件
#include "intrins.h"//不顯示
#define IR_PIN P33       // 紅外接收模塊連接到P3.3引腳

unsigned char ir_data[4]; // 存儲(chǔ)接收的32位數(shù)據(jù)
unsigned char key_value;  // 解析后的按鍵值
bit flag = 0;

// 微秒級(jí)延時(shí)函數(shù)
void delay_us(unsigned int us) {
    while (us--) {
        _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_();
    }
}

// 紅外接收初始化
void ir_init() {
    P3M1 &= ~0x08;  // 設(shè)置P3.3為準(zhǔn)雙向模式
    P3M0 &= ~0x08;

    IT1 = 1;         // 外部中斷1下降沿觸發(fā)
    EX1 = 1;         // 使能外部中斷1
    EA = 1;          // 全局中斷使能
}

// 外部中斷1服務(wù)函數(shù)
void ir_isr() interrupt 2 {
    unsigned char i, j;
    unsigned char byte = 0;

    // 跳過(guò)9ms引導(dǎo)碼
    while (IR_PIN == 0);  // 等待高電平
    delay_us(9000);       // 延時(shí)確認(rèn)引導(dǎo)碼

    // 接收32位數(shù)據(jù)
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 8; j++) {
            while (IR_PIN == 0);  // 等待高電平
            delay_us(560);        // 560us基準(zhǔn)延時(shí)

            if (IR_PIN == 1) {    // 檢測(cè)邏輯1(1.68ms)
                byte |= (1 << j);
                delay_us(1680 - 560);  // 補(bǔ)足剩余時(shí)間
            } else {              // 邏輯0(560us)
                byte &= ~(1 << j);
            }
        }
        ir_data[i] = byte;
    }
    flag = 1;

    // 解析按鍵值(數(shù)據(jù)碼)
    key_value = ir_data[2];

    // 顯示到P1口(低6位)和P3.6/P3.7(高2位)
    P1 = key_value & 0x3F;
    P36 = (key_value >> 6) & 0x01;
    P37 = (key_value >> 7) & 0x01;

    flag = 0;
}

void main() {
    // 初始化IO口
    P1M0 = 0x00;   // P1口設(shè)置為準(zhǔn)雙向
    P1M1 = 0x00;
    P3M0 = 0x00;   // P3.6/P3.7設(shè)為準(zhǔn)雙向
    P3M1 = 0x00;

    P1 = 0xFF;     // 初始高電平
    P36 = 1;
    P37 = 1;

    ir_init();      // 初始化紅外接收

    while(1) {
        if(flag) {  // 可根據(jù)需要添加狀態(tài)處理
            flag = 0;
        }

        // 按鍵功能處理
        switch(key_value) {
            case 0x00: break;  // 無(wú)按鍵
            case 0x01: /* 執(zhí)行按鍵1動(dòng)作 */ break;
            case 0x02: /* 執(zhí)行按鍵2動(dòng)作 */ break;
            // 添加更多按鍵處理...
            default: break;
        }
    }
}

#include "stc15.h"//模數(shù)
#include "intrins.h"
sfr ADC_LOW2 = 0xBE;  // ADC低2位結(jié)果
typedef unsigned char BYTE;
typedef unsigned int WORD;

#define ADC_POWER   0x80  // ADC電源控制位
#define ADC_FLAG    0x10  // ADC完成標(biāo)志
#define ADC_START   0x08  // ADC起始控制位
#define ADC_SPEEDLL 0x00  // 540個(gè)時(shí)鐘

void InitADC();
WORD GetADCResult(BYTE ch);  // 返回10位ADC結(jié)果

void Delay1us(unsigned int us) {
    unsigned int i, j;
    for (i = us; i > 0; i--)
        for (j = 1085; j > 0; j--);  // 1us 延時(shí)
}

void main() {
    // 初始化所有端口為準(zhǔn)雙向模式
    P0M0 = P0M1 = 0x00;
    P1M0 = P1M1 = 0x00;
    P2M0 = P2M1 = 0x00;
    P3M0 = 0xFF; P3M1 = 0x00;  // P3口配置
    P4M0 = P4M1 = 0x00;
    P5M0 = P5M1 = 0x00;
    P6M0 = P6M1 = 0x00;
    P7M0 = P7M1 = 0x00;

    InitADC();  // 初始化ADC

    while (1) {
        // 讀取ADC通道0和通道1的值,并控制P3.2和P3.3
        if (GetADCResult(0) > 1000) {  // 10位ADC,閾值改為512(對(duì)應(yīng)8位的128)
            P32 = 0;  // 如果通道0的值大于512,P3.2置為0
        } else {
            P32 = 1;  // 否則P3.2置為1
        }

        if (GetADCResult(1) > 900) {  // 10位ADC,閾值改為500
            P33 = 1;  // 如果通道1的值大于500,P3.3置為1
        } else {
            P33 = 0;  // 否則P3.3置為0
        }
    }
}

WORD GetADCResult(BYTE ch) {
    WORD result;  // 在函數(shù)開頭聲明result變量

    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;  // 啟動(dòng)ADC轉(zhuǎn)換
    _nop_();  // 等待1個(gè)機(jī)器周期
    _nop_();  // 等待1個(gè)機(jī)器周期
    _nop_();  // 等待1個(gè)機(jī)器周期
    Delay1us(22);  // 延時(shí)22微秒,確保ADC初始化和信號(hào)穩(wěn)定
    while (!(ADC_CONTR & ADC_FLAG));  // 等待ADC轉(zhuǎn)換完成
    ADC_CONTR &= ~ADC_FLAG;  // 清除ADC完成標(biāo)志

    // 組合高8位和低2位,得到10位ADC結(jié)果
    result = (ADC_RES << 2) | (ADC_LOW2 & 0x03);  // 高8位左移2位,低2位直接拼接
    return result;  // 返回10位ADC結(jié)果
}

void InitADC() {
    P1ASF = 0xFF;  // 設(shè)置P1口為AD口
    ADC_RES = 0;   // 清除結(jié)果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;  // 啟動(dòng)ADC
    Delay1us(10);  // ADC上電并延時(shí)


stc代碼學(xué)習(xí)1新OK.zip

44.49 KB, 下載次數(shù): 0

stc代碼學(xué)習(xí)okkk.zip

10.95 KB, 下載次數(shù): 0

stc代碼學(xué)習(xí)新OK.zip

15 KB, 下載次數(shù): 0

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

使用道具 舉報(bào)

沙發(fā)
ID:759144 發(fā)表于 2025-3-25 23:24 | 只看該作者
新手學(xué)習(xí),感謝分享!
回復(fù)

使用道具 舉報(bào)

板凳
ID:876947 發(fā)表于 2025-3-27 19:25 | 只看該作者
這個(gè)挺有用
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表