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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

使用的stc8g的單片機,做溫控,沒反應,不知道啥原因

[復制鏈接]
跳轉到指定樓層
樓主

#include <intrins.h>
#include "math.h"
///**********************************************************************************************/
///**********************************************************************************************/
//“程序開發調試設置項”
#define DY_DELAY        10  // 設置每一個點顯示的時間長度(1~20)

float VCC = 3.3;       // 設置基準電壓
float Rp = 100000.0;   // 設置上拉電阻

float Bx = 3950.0;     // 設置熱敏電阻B值
float Rt;              // 熱敏電阻的實際阻值
float Tk2 = 273.15 + 25.0;
float Ka = 273.15;
float vol;             // 設置測量電壓

data unsigned char temp;        // 實際溫度
data unsigned char temp_set = 0; // 設置溫度
data unsigned char temp_set1 = 150; // 設置溫度2
data unsigned char temp_set2 = 0;   // 設置溫度2

float DTADC;

/**********************************************************************************************/
/**********************************************************************************************/


sbit DIG1 = P5 ^ 5;
sbit DIG2 = P1 ^ 2;
sbit SEG_A = P3 ^ 7;
sbit SEG_B = P3 ^ 2;
sbit SEG_C = P3 ^ 3;
sbit SEG_D = P3 ^ 5;
sbit SEG_E = P3 ^ 4;
sbit SEG_F = P3 ^ 6;
sbit SEG_G = P1 ^ 1;
sbit BUTTON1 = P1 ^ 6;
sbit BUTTON2 = P1 ^ 5;
sbit BUTTON3 = P1 ^ 4;
sbit RESET = P5 ^ 4;
sbit RELAY = P1 ^ 3;




/*Define ADC operation const for ADC_CONTR*/

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x20            //ADC完成標志位
#define ADC_START   0x40            //ADC啟動控制位
#define ADC_SPEEDLL 0x00            //ADC速度選擇

bit flag = 0;
typedef unsigned char BYTE;
data unsigned char DY_PWM; // 顯示亮度

unsigned char code disdata[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 // 數碼管段碼表(0~9)
};

/*********************************************************************************************/
void delay(unsigned int a) { // 用于點掃描的延時
    unsigned int i;
    while (--a != 0) {
        for (i = 0; i < DY_DELAY; i++);
    }                  
}
/*********************************************************************************************/
void delay1ms(unsigned int a) { // 1ms延時程序
    unsigned int i;
    while (--a != 0) {
        for (i = 0; i < 24000; i++);
    }                  
}
/*********************************************************************************************/
void dis_off(void) {
    DIG1 = 1; // 關閉所有數碼管
    DIG2 = 1;

    SEG_A = 0;
    SEG_B = 0;
    SEG_C = 0;
    SEG_D = 0;
    SEG_E = 0;
    SEG_F = 0;
    SEG_G = 0;

    delay(10 - DY_PWM);
}

/*********************************************************************************************/
void diplay_data (unsigned char digit, unsigned char value) {

    DIG1 = 0;
    DIG2 = 0;

  // 設置段碼(共陽極數碼管,段碼為高電平點亮)
    SEG_A = (value & 0x01) ? 0 : 1;
    SEG_B = (value & 0x02) ? 0 : 1;
    SEG_C = (value & 0x04) ? 0 : 1;
    SEG_D = (value & 0x08) ? 0 : 1;
    SEG_E = (value & 0x10) ? 0 : 1;
    SEG_F = (value & 0x20) ? 0 : 1;
    SEG_G = (value & 0x40) ? 0 : 1;
    // 選通對應的數碼管
    if (digit == 1) {
        DIG1 = 0;
    } else if (digit == 2) {
        DIG2 = 0;
    }

    delay(DY_DELAY); // 保持顯示時間
    dis_off();       // 關閉顯示,避免重影
}

/*********************************************************************************************/
//void GetADCResult(BYTE ch) {
//    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
//    _nop_(); // 必須等待才能查詢
//    _nop_();
//    _nop_();
//    _nop_();
//    while (!(ADC_CONTR & ADC_FLAG)); // 等待完成標志
//    ADC_CONTR &= ~ADC_FLAG; // 關閉ADC
//}
void GetADCResult(BYTE ch)
// uint GetADCResult(uchar CH)
{
        ADC_CONTR=ADC_POWER|ADC_START|CH;//啟動轉換1100 1000
        _nop_();_nop_();                                //小延時
        while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成標志置位 1010 0000
        ADC_CONTR &=~ADC_FLAG;                        //清完成標志
//返回十位ADC結果
}
/*Define ADC operation const for ADC_CONTR*/

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x20            //ADC完成標志位
#define ADC_START   0x40            //ADC啟動控制位
#define ADC_SPEEDLL 0x00            //ADC速度選擇

/*********************************************************************************************/
void InitADC() {   
    P1M1 |= 0x80;  // 開P1.7的ADC功能
    P1M0 &= ~0x80;
    ADC_RES = 0;
    ADC_CONTR = ADC_POWER;  // 開P1.7的ADC功能
}

/*********************************************************************************************/
void init(void) { // 上電初始化
    // 設置I/O口工作方式
    P1M0 = 0x1F;  // P1.0, P1.1, P1.2, P1.3為推挽輸出,P1.4-P1.6按鍵輸入,P1.7為ADC輸入
    P1M1 = 0x80;  // P1.7配置為ADC輸入,其余引腳為推挽輸出或準雙向口

    P3M0 = 0xFC;  // P3.2-P3.7為推挽輸出,P3.0和P3.1為準雙向口(用于TX/RX)
    P3M1 = 0x00;  // 設置為準雙向口

    P5M0 = 0x20;  // P5.4為復位引腳,P5.5為數碼管位控制(推挽輸出)
    P5M1 = 0x00;  // 設置為準雙向口

    DY_PWM = 9;
    dis_off();
}

/*********************************************************************************************/
void process_buttons(void) {
    if (BUTTON1 == 0) {
        delay1ms(10);  // 簡單的防抖
        if (BUTTON1 == 0) {
            // 處理按鍵1被按下的事件
        }
    }

    if (BUTTON2 == 0) {
        delay1ms(10);  
        if (BUTTON2 == 0) {
            // 處理按鍵2被按下的事件
        }
    }

    if (BUTTON3 == 0) {
        delay1ms(10);  
        if (BUTTON3 == 0) {
            // 處理按鍵3被按下的事件
        }
    }

    if (RESET == 0) {
        // 復位系統或執行相應的操作
    }
}


/*********************************************************************************************/
void main (void){ //主程序
        init();
        InitADC();                      //Init ADC sfr
   DTADC=0;
        temp_set=0;
  delay1ms(100);
      
        while (1){
   unsigned int i;
                unsigned int a;

                i=i+1;
               
                GetADCResult(6);
                temp_set=ADC_RES;
               
                GetADCResult(7);      
                DTADC=ADC_RES+DTADC;
                DTADC=(ADC_RES<<2)+ADC_RESL +DTADC;
         
    if(i==10)
      {
                        i=0;               
                        if(a>0)        a--;
                        else flag=0;
                        DTADC=DTADC/10;
                        temp_set1=temp_set;

                                if((temp_set1>(temp_set2+2)) ||(temp_set1<(temp_set2-2))){ flag=1; a=200;  }
                                temp_set2=temp_set1;
                        vol=DTADC*VCC/256;
                                DTADC=0;
        temp_set=0;

                                Rt=(vol * Rp ) / (VCC-vol);

                                temp=1/(1/Tk2+ log(Rt/Rp)/Bx)-Ka+0.5;
      

         }
         
        if (flag == 0) { // 顯示當前溫度
            diplay_data (1, disdata[temp / 10]); // 顯示十位
            diplay_data (2, disdata[temp % 10]); // 顯示個位
        } else { // 顯示設置溫度
            diplay_data (1, disdata[temp_set1 / 10]);
            diplay_data (2, disdata[temp_set1 % 10]);
        }
    }
}


顯示溫度顯示不對是什么原因?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1109793 發表于 2025-1-9 07:46 | 只看該作者
diplay_data 里面說是共陽極,但是又說高電平點亮,矛盾。
開始DIG是都=0,設置了段碼后,還是DIG = 0;是幾個意思?
段碼設置時,那些?有用嗎?
原理圖里面段碼不是接在P1上面?為何代碼里面都不對?是不是圖上傳錯了?
dis_off里面,共陽的數碼管,這樣不是全亮了?
NTC精度的話,直接用5V電源座參考。另外,8G的話好像不是這個腳,8H才是參考輸入吧。的確,原理圖是8H的,你這個圖不對,代碼里面是兩位顯示,圖是4位的。
回復

使用道具 舉報

板凳
ID:72649 發表于 2025-1-9 10:53 | 只看該作者
xiaobendan001 發表于 2025-1-9 07:46
diplay_data 里面說是共陽極,但是又說高電平點亮,矛盾。
開始DIG是都=0,設置了段碼后,還是DIG = 0;是 ...


回復

使用道具 舉報

地板
ID:72649 發表于 2025-1-9 13:10 | 只看該作者
xiaobendan001 發表于 2025-1-9 07:46
diplay_data 里面說是共陽極,但是又說高電平點亮,矛盾。
開始DIG是都=0,設置了段碼后,還是DIG = 0;是 ...


回復

使用道具 舉報

5#
ID:1109793 發表于 2025-1-9 14:09 | 只看該作者

0.36寸,2位,還用啥三極管啊。
小聲文一下,電源變壓器是買的現成的嗎?
回復

使用道具 舉報

6#
ID:92781 發表于 2025-1-10 10:03 | 只看該作者
結果不準確是因為這個地方不對
                DTADC=ADC_RES+DTADC;
                DTADC=(ADC_RES<<2)+ADC_RESL +DTADC;為高8,adcresl
ADCRES儲存的是高8位,ADCRESL的7:6位儲存低2位,而不是1:0位儲存低二位,改為以下試試
int ADCH,ADCL;//合成結果是10位,要用16位及以上數據類型,但是不要用float,float低二位是尾數位,要用int或long
    ADCRH=ADC_RES<<2;
    ADCRL=ADC_RESL>>6;
    DTADC=ADCRH+ ADCRL ;
回復

使用道具 舉報

7#
ID:161164 發表于 2025-1-10 14:22 | 只看該作者
啥叫沒反應?
有問題請描述問題,預計表現,實際表現,提供代碼,報錯信息
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男人天堂99| 亚洲精品九九 | 亚洲视频在线看 | 99精品电影 | avmans最新导航地址 | 喷潮网站| 中文字幕动漫成人 | 狠狠色综合久久婷婷 | 欧美寡妇偷汉性猛交 | 在线天堂免费中文字幕视频 | 亚洲91视频| 亚洲欧美一区二区三区国产精品 | 国产91精品在线 | 成人免费大片黄在线播放 | 伊人超碰 | 日韩精品一区二区三区高清免费 | 成人毛片在线观看 | 欧美一区二区在线观看视频 | 国产综合一区二区 | 在线视频一区二区 | 992tv人人草| 日韩精品 | a a毛片| 久久久国产一区二区三区四区小说 | 999在线精品| 国产午夜精品久久久 | 91久久久久久久 | www.av在线| 成人福利网 | 久久久精品一区二区三区 | 国产乱人伦精品一区二区 | 色视频www在线播放国产人成 | 女同久久另类99精品国产 | 成人精品一区二区 | 久久精品一 | 国产欧美日韩二区 | 成人免费三级电影 | 三级免费 | 久久99国产精品 | 日本三级网站在线观看 | 99热国产精品 |