搜索
bottom↓
回复: 92

低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!

[复制链接]

出0入0汤圆

发表于 2005-6-9 00:02:22 | 显示全部楼层 |阅读模式
電路圖:





原程序:

// icc 6.31a , atmage48, 8m osc

#include <iom48v.h>

#include <macros.h>

#include <stdio.h>

#include <eeprom.h>



#define uchar unsigned char

#define uint unsigned int



#define LED_NUM    PORTD

#define LED_VALUE  PORTB

#define ADC_KEY    5

#define SOUND_OUT  0x04

#define DELAY_MIN  1100



uint v = 0;

uchar adc_channel = 0;

uchar hot_warning[4]={30,35,40,45};

uchar setting_mode = 0;

uchar auto_mode = 0x00;



const uchar disp_table[22] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x01,0x02,0x04,0x08,0x10};



// 溫度表 -10 度到 105 度

const uint v_table[116]={

        895,932,969,1006,1045,1085,1125,1166,1208,1250, //-10 ----  -1

        1294,1338,1382,1427,1473,1519,1566,1614,1661,1709,//0 ----  9

        1758,1807,1856,1905,1955,2004,2054,2104,2154,2204,//10 ----  19

        2253,2303,2353,2402,2451,2500,2549,2597,2645,2692,//20 ----  29

        2740,2786,2832,2878,2923,2968,3012,3056,3099,3141,//30 ----  39

        3183,3224,3265,3304,3344,3382,3420,3457,3493,3529,//40 ----  49

        3564,3599,3632,3665,3698,3729,3760,3791,3820,3849,//50 ----  59

        3878,3905,3932,3959,3985,4010,4034,4058,4082,4105,//60 ----  69

        4127,4149,4170,4191,4211,4231,4250,4269,4287,4304,//70 ----  79

        4322,4339,4355,4371,4387,4402,4417,4431,4445,4459,//80 ----  89

        4472,4485,4497,4510,4522,4533,4545,4556,4566,4577,//90 ----  99

4587,4597,4607,4616,4625,4634};//100 ----  105





const uchar sound[]={ //樂曲數据表

        0x45,0x48,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x49,0x4a,

        0x49,0x48,0x48,0x48,0x48,0x48,0x45,0x48,0x4a,0x4a,

        0x48,0x4a,0x4c,0x4c,0x4b,0x4a,0x49,0x49,0x49,0x49,

        0x49,0x4c,0x4b,0x4a,0x4a,0x4a,0x49,0x48,0x48,0x49,

        0x4a,0x4c,0x4b,0x4b,0x4b,0x4b,0x4b,0x46,0x46,0x45,

        0x45,0x45,0x47,0x48,0x49,0x49,0x4a,0x49,0x48,0x48,

        0x48,0x48,0x48,0x48,



        0x00,0x00

};



const uint TONETABLE[15]={ //音調頻率數据表

        64580,64684,64777,64820,64898,64968,65030,65058,

        65110,65157,65178,65217,65252,65283,65297

};



uint toneconst;



void delay_1ms(void)

{

        uint i;

        for (i=0;i<DELAY_MIN;i++);

        WDR();

}



void delay_nms(uint n)

{

        uint i;

        for (i=0;i<n;i++)

        delay_1ms();

}



void disp_led(uint value)

{

        uchar i,j;

  uchar led_data[5];       

       

        led_data[0] = adc_channel+17;



        if ((value & 0x8000)==0x8000)

        {

                value &= 0x7fff;

                led_data[4] = 16; // 顯示負號

        }

        else

        {

                value &= 0x7fff;

                led_data[4] = value/1000;

        };



        led_data[3] = value/100%10;

        led_data[2] = value/10%10;

        led_data[1] = value%10;



        for (j=0;j<20;j++)

        {

                for (i=0;i<5;i++)

                {

                        LED_VALUE = disp_table[led_data];

                        if(i==2)

                        {       

                                LED_VALUE |= 0x80; // 加上小數點

                        }

                        LED_NUM = ~BIT(i+3);

                        delay_nms(5);

                        LED_NUM = 0xff;

                };

        };

}



#pragma interrupt_handler adc_isr:iv_ADC

void adc_isr(void)

{   

    uint temp;

        temp = ADCL;

        temp |= (int)ADCH<<8;

        temp = (49*temp)/10;

        v += temp;

}



void get_adc_value(uchar adc_pin)

{  

    uchar i;

        v = 0x0000;

        ADMUX = (1<<REFS0)|adc_pin;

//        for(i=0;i<2;i++)

        {

//        ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);

        ADCSRA |= (1<<ADSC);

        delay_nms(1);

//  while((ADCSRA & (1<<ADIF))==0);

        ADCSRA &= ~(1<<ADSC);

//        ADCSRA &= ~(1<<ADIF);  

    }

//        v = v/2;

}



uchar get_key_value(void)

{

        get_adc_value(ADC_KEY);

        if (v < 1000)

        {

                return 0;

        }

        else

        {

                if ((v > 3000)&&(v < 3500))

                {

                        return 1;

                }

                else

                {

                        if ((v > 2000)&&(v < 2800))

                        {

                                return 2;

                        }

                        else

                        {

                                if ((v > 1000)&&(v < 1900))

                                {

                                        return 3;

                                }

                                else

                                {

                                        return 0;

                                }

                        }

                }

        }

}



void temp_setting(void)

{

        uchar key;

        key = get_key_value();



        if(key==2)

        {

                adc_channel++;

                if (adc_channel>3)

                {

                        adc_channel = 0;

                }

        }



        if(key==3)

        {

                if (adc_channel==0)

                {

                        adc_channel = 1;

                        auto_mode = ~auto_mode;

                }

                adc_channel--;

        }



        while(1) // 查鰎盤是否放開

        {

                get_adc_value(ADC_KEY);

                if(v < 500)

                {

                        break;

                };

        };



        if (key==1) setting_mode = 1;



        while(setting_mode==1)

        {

                key = get_key_value();

                if(key==1)

                {

                        adc_channel++;

                        if (adc_channel>3)

                        {

                                adc_channel = 0;

                                setting_mode = 0;

                                EEPROMwrite(0x01, hot_warning[0]);

                                delay_nms(5);

                                EEPROMwrite(0x02, hot_warning[1]);

                                delay_nms(5);

                                EEPROMwrite(0x03, hot_warning[2]);

                                delay_nms(5);

                                EEPROMwrite(0x04, hot_warning[3]);

                                delay_nms(5);

                        }

                }

                else

                {

                        if(key==2)

                        {

                                ++hot_warning[adc_channel];

                        }

                        else

                        {

                                if(key==3) --hot_warning[adc_channel];

                        };

                };



                while(1)

                {

                        get_adc_value(ADC_KEY);

                        if(v < 500)

                        {

                                break;

                        };

                };



                disp_led(hot_warning[adc_channel]);

        }



}



uint get_degree(void)

{

        uchar x,y;

        uint v_big,v_small,v_step;

       

        if (v<100) return 0x83E7; // 當沒有信號時顯示-99.9錯誤



        for (x=0;x<115;x++) // 查表

        {

                if (v_table[x] >= v) // 找出電壓區域

                {

                        v_big = v_table[x]; // 區域 高段

                        v_small = v_table[x-1]; //區域 低段

                        v_step = (v_big - v_small)/10; // 把區域細分成10份

                        for (y=0;y<10;y++) // 細分比較

                        {

                                v_small += v_step;

                                if (v < v_small) // 得出結果

                                {

                                        v = x*10+y;// 其中x*10 為整數部分, y 為小數部分

                                        if (x<10) // 少於10時為負溫度

                                        {

                                                v |= 0x8000; // 加入負號標記

                                        }

                                        else

                                        {

                                                v -= 100; // 0 度修正

                                        }

                                       return v;  

                                };

                        };

                };

                WDR();

        }  

  return v;        

}



void init_port(void)

{

  CLKPR = 0x80;

  CLKPR = 0x00;       

        DDRB = 0xff;

        PORTB = 0xff;

        DDRC = 0x00;

        PORTC = 0x00;

        DDRD = 0xff;

        PORTD = 0xff;

        CLI();

        ADMUX = (1<<REFS0);       

        ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);

        SEI();               

        WDR(); // 使用看門狗

        //WDTCR = 0x0F;

    WDTCSR = 0x0F;       

}



//**********************************************8

#pragma interrupt_handler timer1_ovf_isr:14 //iv_TIMER1_OVF

void timer1_ovf_isr(void)

{

        TCNT1=toneconst;

        PORTD^=SOUND_OUT;

}



void music(void)

{

        uchar temp,temp1;

        uint sound_add=0;

       

        TCCR1A = 0x00;

        TCCR1B =(1<<CS11);//8分頻

        temp1 = sound[sound_add];

        while(temp1!=0)

        {

                temp=temp1;

                temp&=0x0f;

                if(temp!=0)

                {

                        TIMSK1|=(1<<TOIE1);//根据SOUNDTABLE中數据的低四位產生音樂頻率

                        temp--;

                        toneconst=TONETABLE[temp];

                        TCNT1=toneconst;

                }

                temp=temp1;

                temp>>=4;

                temp&=0x0f;

                delay_nms(temp*129);//根据SOUNDTABLE中數据的高四位,控制音樂頻率持續時間

                TIMSK1&=~(1<<TOIE1);

                sound_add++;

                temp1 = sound[sound_add];

        }

        delay_nms(1000);

}

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



void main(void)

{

        uchar j;

        init_port();

        hot_warning[0] = EEPROMread(0x01);

        hot_warning[1] = EEPROMread(0x02);

        hot_warning[2] = EEPROMread(0x03);

        hot_warning[3] = EEPROMread(0x04);

        while(1)

        {

                for(j=0;j<4;j++)

                {

                        temp_setting(); // 設定

                        get_adc_value(adc_channel); // 進行adc取樣

                        get_degree(); // get_degree()的功能是把adc的值進行查表取數

                        if(v/10 > hot_warning[adc_channel]) // 檢查溫度是否超過上限

                        {

                                //disp_led(0x83E7);

                                music();

                        }

                        else

                        {

                                disp_led(v); // 顯示數據,v由get_degree()中產生

                        }

                        WDR();

                }



                if (auto_mode==0xff) // 自動模式

                {

                        adc_channel++;

                        if (adc_channel>3) adc_channel=0;

                }

        }



}



打包文件:

点击此处下载armok0152126.rar










-----此内容被avrboy于2005-06-09,00:18:53编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2005-6-9 02:35:08 | 显示全部楼层
谢谢avrboy 單片王子无私的奉献!
头像被屏蔽

出0入0汤圆

发表于 2005-6-9 07:41:43 | 显示全部楼层
谢谢 avrboy!



咦,avrboy 没有留下联系方式? 有空联系我一下吧。谢谢。

出0入0汤圆

 楼主| 发表于 2005-6-9 10:21:12 | 显示全部楼层
我的email是 define_john_me@yahoo.com.hk , 多交流!

出0入0汤圆

发表于 2005-6-9 14:16:08 | 显示全部楼层
好东东,顶~~!

出0入0汤圆

 楼主| 发表于 2005-6-9 15:34:21 | 显示全部楼层
炎夏來了,正準備改一下,用它來控制機箱的風扉!!

出0入0汤圆

发表于 2005-6-9 17:58:13 | 显示全部楼层
好东西,盯。

只是有点可惜,不是GCC的,不能直接用。

我刚学AVR,只懂GCC。

出0入0汤圆

 楼主| 发表于 2005-6-9 22:12:52 | 显示全部楼层
都沒有用什麼特別的涵數, 想信改一下就可以.

出0入0汤圆

发表于 2006-3-15 13:08:53 | 显示全部楼层
那就改一下啊!

出0入0汤圆

发表于 2006-3-15 18:00:55 | 显示全部楼层
热敏电阻的B值是多少啊?

出0入0汤圆

发表于 2006-3-15 22:54:44 | 显示全部楼层
溫度表 -10 度到 105 度的值是怎么计算来的

出0入0汤圆

发表于 2006-3-16 12:04:27 | 显示全部楼层
顶起!

出0入0汤圆

发表于 2006-3-16 16:47:45 | 显示全部楼层
我尝试改成ATMEGA16,然后用在马老师的调试板上,可用PROTELUS仿真就是不通过。

下面是我改动的部分:如果你有空,请看一下好吗?顺便给小弟解说下里面的疑问,好吗?

#define LED_NUM    PORTD

#define LED_VALUE  PORTB //我改为PORTC口输出

。。。。。。。。。。。。。。。。。。。。。。。。。。

void disp_led(uint value)

{

        uchar i,j;

  uchar led_data[5];       

       

        led_data[0] = adc_channel+17;//为何要加17呢?

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

for (j=0;j<20;j++)

   {

      for (i=0;i<5;i++)

      {

         LED_VALUE = disp_table[led_data]; //由于我的仿真文件是用共阳极数码管

                                              //所以我在这里按位取反~

                                             

         if(i==2)

         {   

            LED_VALUE |= 0x80;               //按位取反~ 0X7F

         }

         LED_NUM = ~BIT(i+3);                //为何要加三呢?我去掉了加三

         delay_nms(5);

         LED_NUM = 0x00;                     //关闭为0x00  

     };

   };

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。



ADMUX = (1<<REFS0)|adc_pin;                //我直接将REF接VCC,所以去掉了选择电压

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

ADMUX = (1<<REFS0);                       //去掉该项,使用REF



WDTCSR = 0x0F;                           //改为WDTCR

。。。。。。。。。。。。。。。。。。。。。。。。。。。。

DDRB = 0xff;      //DDRC = 0xFF;

PORTB = 0xff;     //PORTC = 0x00;

DDRC = 0x00;      //DDRA = 0x00;

PORTC = 0x00;     //PORTA = 0x00;

DDRD = 0xff;

PORTD = 0xff;     //PORTD = 0x00;

我晚上把仿真文件传上来。
-----此内容被alisha于2006-03-16,16:50:20编辑过

出0入0汤圆

发表于 2006-3-16 20:49:40 | 显示全部楼层
仿真程序如下



点击此处下载armok01108166.rar

出0入0汤圆

发表于 2006-3-16 22:22:55 | 显示全部楼层
楼主不厚道,程序里有问题,那个17就是多余的,现在已经能正常显示了。我做好后就传上来,虽然没有人解答,我自己用了十几个小时,也要谢谢楼主!

出0入0汤圆

发表于 2006-3-17 13:00:04 | 显示全部楼层
请教那个表是怎么算出来的?

还有热敏电阻的B值是多少?

多谢了!

出0入0汤圆

 楼主| 发表于 2006-3-18 11:29:47 | 显示全部楼层
"楼主不厚道,程序里有问题,那个17就是多余的"

---------------------------------------------------------

首先很多謝你的支持, 是啊, 因為之前的的實驗是用4個led代替7段數碼管,後來晝電路圖時改了, 忘了更正過來, 17之後就是0x01,0x02,0x04,0x08,0x10



还有热敏电阻的B值是多少?

--------------------------------

热敏电阻:10KΩ B值:3380                                                



上傳一份excel給你看看吧.

点击此处打开armok01108570.xls

出0入0汤圆

发表于 2006-3-18 13:03:40 | 显示全部楼层
谢谢,非常感谢!

出0入0汤圆

发表于 2006-6-11 18:49:32 | 显示全部楼层
溫度表 -10 度到 105 度的值是怎么计算来的

出0入0汤圆

发表于 2006-6-12 10:51:22 | 显示全部楼层
仿真的程序也有问题拉

出0入0汤圆

发表于 2006-6-13 06:32:52 | 显示全部楼层

出0入0汤圆

发表于 2006-6-16 12:19:13 | 显示全部楼层
avrboy 你好,请问你excel文档里和程序里的几个参数意义,从哪里所得。



excel文档:

       sheet2里的C1,D1 ,其中C1=5 ,D1=10.5,这两个值是计算工式的重要值=$C$1*($D$1/($D$1+B2))



程序:

       void adc_isr(void)

{   

    uint temp;

   temp = ADCL;

   temp |= (int)ADCH<<8;

   temp = (49*temp)/10;

   v += temp;

}

    公式:(49*temp)/10 ,其中49和10又是如何所得呢?敬请指教。





【18楼】 wb8899

积分:30

派别:

等级:------

来自:

溫度表 -10 度到 105 度的值是怎么计算来的   



温度表的值是通过公式=$C$1*($D$1/($D$1+B2))计算所得。

出0入0汤圆

 楼主| 发表于 2006-6-16 12:47:44 | 显示全部楼层
C1=5 ,D1=10.5,这两个值是计算工式的重要值=$C$1*($D$1/($D$1+B2))

C1=5 即電源5v

D1=10.5 是分壓電阻, 10.5k



(49*temp)/10

49是 5v(ad參考源)/1024 得的 , 為了不計算小數就取整49,再除10

出0入0汤圆

发表于 2006-6-16 12:58:28 | 显示全部楼层
多谢指教!

出0入0汤圆

发表于 2006-6-16 16:59:36 | 显示全部楼层
我也帖一下我常用的热敏电阻测温程序模块....



如下是在AVR MEGA16下的应用.

//boy123

// email: mcu123@gmail.com

//www.mcu123.net/bbs



//#include "main.h"



//#include "Structure.h"

#include <iom16v.h>

#pragma interrupt_handler Adc_Isr:15



unsigned int Adc_Data[2];

unsigned char T_ok;

unsigned char AD_Count;          //测量温度次数

unsigned int V_Data;          //电压值

//unsigned int R_ok;



//10K的热敏电阻0-50度所对应的码表值

const unsigned  int Temp_code[]=

{

//        0-25

        2843,2718,2599,2486,2379,2277,2180,2087,1999,1916,1836,1760,1688,1619,1553,1490,1430,1373,1319,1266,1217,1169,1124,1081,1039,1000,

//        26--50

        962,925,891,857,826,795,766,738,711,686,661,638,615,593,573,553,534,515,497,480,464,449,433,419,405,

//        51-75

//        392,379,366,355,343,332,321,311,301,292,283,274,265,257,249,242,234,227,220,214,208,201,195,190,184,

//        76--100

//        179,174,169,164,159,155,150,146,142,138,134,131,127,124,120,117,114,111,108,105,102,100,97,94,92

               

       

};



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

//查电阻值所对应的温度是多少

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





unsigned char check_code(unsigned int k)

{

        unsigned char i;

        if(k<405)return(51);        //大于50度以上都显示为51度

        for(i=0;k<Temp_code;i++);

        return (i-1);

       

}



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

//R=30K或20K

//RT=10K

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





unsigned int Totemp(unsigned int AD)

{       

        unsigned int Itemp;

        unsigned int Tk;

        Tk=1023-AD;



        Itemp=(unsigned int)(((unsigned long)1000*AD)/Tk);                //扩大100倍

        return(Itemp);

}



/*



*/

void Adc_Init(void)

{

AD_Count=0;

ADCSRA=0X00;

ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<MUX1);//启动第2路AD

ACSR=(1<<ACD);

ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);



}





/*

MUX1=1 MUX0=0 选通热敏电阻

MUX1=1 MUX0=1 选通电压测量



*/

void Adc_Isr(void)

{

unsigned int Temp;

if(ADMUX==0XC2)

{

                        Adc_Data[0]+=ADC&0X3FF;

                         AD_Count++;

                   if(AD_Count>=30)

                   {

                   AD_Count=0;

                   Adc_Data[1]=Adc_Data[0];

                   Adc_Data[0]=0;

                   }

                   ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<MUX1)|(0<<MUX0);//启动第3路AD

                  

}

else

{

                  Temp=ADC&0X3FF;

                        ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<MUX1);//启动第2路AD

                        V_Data=Temp;

}

ADCSRA|=(1<<ADSC);//开始转换

}



void Get_Temp(void)

{

T_ok=check_code(Totemp(Adc_Data[1]/30));        //转换温度

}





如下是在ARM下的应用.







void Ad_fun (void) {                             /* Delay function */

  unsigned int val;

  unsigned char t;

  AD0CR |= 0x01200000;                          /* Start A/D Conversion */

  do {

    val = AD0DR1;                                /* Read A/D Data Register */

  } while ((val & 0x80000000) == 0);            /* Wait for end of A/D Conversion */

  AD0CR &= ~0x01000000;                         /* Stop A/D Conversion */

  val = (val >> 6) & 0x03FF;                    /* Extract AIN0 Value */



  t=Get_Temp(val);

  IOPIN1 = (IOPIN1 & ~LEDMSK) | (val << 16);

  printf ("
AIN1 Result = 0x%03X
", val);       /* Output A/D Conversion Result */

  printf ("AIN1 AD = 0x%03X
", t);

  printf ("AIN1 Temperatur =  %d
", t);

}





//10K的热敏电阻0-50度所对应的码表值

const unsigned  int Temp_code[]=

{

//        0-25

        2843,2718,2599,2486,2379,2277,2180,2087,1999,1916,1836,1760,1688,1619,1553,1490,1430,1373,1319,1266,1217,1169,1124,1081,1039,1000,

//        26--50

        962,925,891,857,826,795,766,738,711,686,661,638,615,593,573,553,534,515,497,480,464,449,433,419,405,

//        51-75

//        392,379,366,355,343,332,321,311,301,292,283,274,265,257,249,242,234,227,220,214,208,201,195,190,184,

//        76--100

//        179,174,169,164,159,155,150,146,142,138,134,131,127,124,120,117,114,111,108,105,102,100,97,94,92

               

       

};



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

//查电阻值所对应的温度是多少

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





unsigned char check_code(unsigned int k)

{

        unsigned char i;

        if(k<405)return(51);        //大于50度以上都显示为51度

        for(i=0;k<Temp_code;i++);

        return (i-1);

       

}



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

//R=30K或20K

//RT=10K

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





unsigned int Totemp(unsigned int AD)

{       

        unsigned int Itemp;

        unsigned int Tk;

        Tk=1023-AD;



        Itemp=(unsigned int)(((unsigned long)1000*AD)/Tk);                //扩大100倍

        return(Itemp);

}





unsigned char  Get_Temp(unsigned int i)

{

return (check_code(Totemp(i)));        //转换温度

}

出0入8汤圆

发表于 2006-7-21 17:44:45 | 显示全部楼层
楼上各位,谢谢你们的数据,但是我有点搞不清楚的是,同样我是用10K热敏电阻。按理说是在100度试时应该查表格是920欧左右,但我测出的阻值是750左右,为何相差这么远,(我是在开水里测量的),求解,谢谢!!!!

出0入0汤圆

发表于 2006-8-22 20:07:28 | 显示全部楼层
按理说是在100度试时应该查表格是920欧左右,但我测出的阻值是750左右,为何相差这么远,(我是在开水里测量的),求解,谢谢!!!!





沸水的100度是在一个标准大气压的环境下

你家的位置一定比海平面高吧?

压力降低,沸点就降低了。

出0入0汤圆

发表于 2006-8-24 11:49:52 | 显示全部楼层
ding!

出0入0汤圆

发表于 2006-12-13 20:56:18 | 显示全部楼层
好贴,顶。学习中。。。。。。

出0入0汤圆

发表于 2007-3-14 11:05:25 | 显示全部楼层
正需要这个资料,谢谢楼主分享啊

出0入0汤圆

发表于 2007-3-15 00:58:04 | 显示全部楼层
25楼的厉害,居然能跑到开水里测电阻

出0入0汤圆

发表于 2007-4-9 11:51:18 | 显示全部楼层
刚学AVR,只会用GCC,改了几次都没成功,谁能上传个GCC的啊!!!!!

出0入0汤圆

发表于 2007-4-9 13:05:44 | 显示全部楼层
Compiling: ntc.c

avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=ntc.lst  -std=gnu99 -MD -MP -MF .dep/ntc.o.d ntc.c -o ntc.o

ntc.c: In function `temp_setting':

ntc.c:220: warning: implicit declaration of function `EEPROMwrite'

ntc.c: At top level:

ntc.c:353: warning: return type of 'main' is not `int'

ntc.c: In function `main':

ntc.c:356: warning: implicit declaration of function `EEPROMread'



Linking: BC.elf

avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=ntc.o  -std=gnu99 -MD -MP -MF .dep/BC.elf.d ntc.o --output BC.elf -Wl,-Map=BC.map,--cref    -lm

ntc.o: In function `temp_setting':

D:低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!/ntc.c:220: undefined reference to `EEPROMwrite'

D:低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!/ntc.c:222: undefined reference to `EEPROMwrite'

D:低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!/ntc.c:224: undefined reference to `EEPROMwrite'

D:低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!/ntc.c:226: undefined reference to `EEPROMwrite'

ntc.o: In function `main':

D:低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!/ntc.c:356: undefined reference to `EEPROMread'

D:低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!/ntc.c:357: undefined reference to `EEPROMread'

D:低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!/ntc.c:358: undefined reference to `EEPROMread'

D:低成本m48+熱敏電阻做的多路溫度顯示及音樂警報裝置!/ntc.c:359: undefined reference to `EEPROMread'

make.exe: *** [BC.elf] Error 1



> Process Exit Code: 2

> Time Taken: 00:02

就差这个不会改了,我改成eeprom-read-bite还是不对,应该怎么改?


-----此内容被ken524012于2007-04-09,13:11:26编辑过

出0入0汤圆

发表于 2007-8-16 09:27:59 | 显示全部楼层
真是好东东!谢谢楼主!

出0入0汤圆

发表于 2007-8-16 09:42:54 | 显示全部楼层
温度做准不容易啊,

出0入0汤圆

发表于 2007-8-16 09:52:43 | 显示全部楼层
沸水不一定是100度,但是冰水混合物应该是0度吧,因为好像定义零度的时候没有规定气压,但是100度的时候规定了要一个大气压

出0入0汤圆

发表于 2007-8-16 15:06:09 | 显示全部楼层
路过也顶下

出0入0汤圆

发表于 2007-8-16 23:18:03 | 显示全部楼层
顶下,很有参考价值

出0入0汤圆

发表于 2007-8-17 13:01:57 | 显示全部楼层
读出A/D数据后再加个软件滤波就更实用和借鉴了

出0入0汤圆

发表于 2007-8-21 12:28:40 | 显示全部楼层
学习中

出0入0汤圆

发表于 2007-8-22 19:19:02 | 显示全部楼层
还是不明白溫度表 -10 度到 105 度的值是怎么计算来的,请高手指点

还有就是$C$1*($D$1/($D$1+B2)) 中的$1是什么来的

出0入0汤圆

发表于 2008-7-11 17:48:14 | 显示全部楼层
好久的帖子啦,但楼主写的东西确实很有用啊!很受启发!!再次挺起!顶起~~

出0入0汤圆

发表于 2008-7-11 17:49:20 | 显示全部楼层
希望可以和楼主AVRBOY交流!!

出0入0汤圆

发表于 2008-7-11 17:57:31 | 显示全部楼层
good

出0入0汤圆

发表于 2008-7-11 20:31:12 | 显示全部楼层

出0入0汤圆

发表于 2008-7-11 22:56:28 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-7-12 10:08:33 | 显示全部楼层
还有就是$C$1*($D$1/($D$1+B2)) 中的$1是什么来的
EXCEL中的单元格加过$后就变成固定的,而不会随拖动而自动累加

出0入0汤圆

发表于 2008-7-12 10:27:32 | 显示全部楼层
请问 avrboy =單騙皇帝=  ,读ADC的软件滤波是哪部分,想参考一下

出0入0汤圆

发表于 2008-11-17 14:55:07 | 显示全部楼层
avrboy&nbsp;=單騙皇帝=&nbsp;&nbsp;,读ADC的软件滤波是哪部分,想参考一下&nbsp;

出0入0汤圆

发表于 2008-12-29 13:26:07 | 显示全部楼层
//&nbsp;溫度表&nbsp;-10&nbsp;度到&nbsp;105&nbsp;度&nbsp;

const&nbsp;uint&nbsp;v_table[116]={&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;895,932,969,1006,1045,1085,1125,1166,1208,1250,&nbsp;//-10&nbsp;----&nbsp;&nbsp;-1&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1294,1338,1382,1427,1473,1519,1566,1614,1661,1709,//0&nbsp;----&nbsp;&nbsp;9&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1758,1807,1856,1905,1955,2004,2054,2104,2154,2204,//10&nbsp;----&nbsp;&nbsp;19&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2253,2303,2353,2402,2451,2500,2549,2597,2645,2692,//20&nbsp;----&nbsp;&nbsp;29&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2740,2786,2832,2878,2923,2968,3012,3056,3099,3141,//30&nbsp;----&nbsp;&nbsp;39&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3183,3224,3265,3304,3344,3382,3420,3457,3493,3529,//40&nbsp;----&nbsp;&nbsp;49&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3564,3599,3632,3665,3698,3729,3760,3791,3820,3849,//50&nbsp;----&nbsp;&nbsp;59&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3878,3905,3932,3959,3985,4010,4034,4058,4082,4105,//60&nbsp;----&nbsp;&nbsp;69&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4127,4149,4170,4191,4211,4231,4250,4269,4287,4304,//70&nbsp;----&nbsp;&nbsp;79&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4322,4339,4355,4371,4387,4402,4417,4431,4445,4459,//80&nbsp;----&nbsp;&nbsp;89&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4472,4485,4497,4510,4522,4533,4545,4556,4566,4577,//90&nbsp;----&nbsp;&nbsp;99&nbsp;

4587,4597,4607,4616,4625,4634};//100&nbsp;----&nbsp;&nbsp;105&nbsp;



温度表里面的数值是什么数据?&nbsp;&nbsp;不是阻值,也不是AD值?&nbsp;&nbsp;&nbsp;

出0入0汤圆

发表于 2008-12-29 15:33:08 | 显示全部楼层
NTC线性化电阻选择软件

为了分压后得到的电压与温度的关系尽可能的线性,需要计算一下分压的电阻



点击此处下载&nbsp;ourdev_563943.rar(文件大小:31K)&nbsp;(原文件名:NTC.rar)&nbsp;





RH:最高温度对应的电阻值

RM:中点温度对应的阻值

RL:最低温度对应的阻值

出0入0汤圆

发表于 2008-12-29 15:36:19 | 显示全部楼层
如果这个电阻选择不好,即时使用查表法也公造成不同温度段的测量精度不一样。

出0入0汤圆

发表于 2008-12-29 16:53:58 | 显示全部楼层
参考加记号

出0入0汤圆

发表于 2009-3-10 22:31:27 | 显示全部楼层
记号个!!

出0入0汤圆

发表于 2009-6-3 19:52:23 | 显示全部楼层
NTC热敏电阻好处是成本低,就是精度差。一般在最低、最高的两个极值误差很大。25度的精度为5%的NTC,在105度或-55度是误差达20%左右。

出0入4汤圆

发表于 2009-6-6 01:53:03 | 显示全部楼层
收藏

出0入0汤圆

发表于 2009-6-6 10:18:40 | 显示全部楼层
学习!

出0入0汤圆

发表于 2009-6-6 12:55:41 | 显示全部楼层
很有意思

出0入0汤圆

发表于 2009-6-6 17:57:14 | 显示全部楼层
m

出0入0汤圆

发表于 2009-6-7 09:41:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-1 17:11:19 | 显示全部楼层
呵呵,学习了

出0入0汤圆

发表于 2009-10-1 18:18:51 | 显示全部楼层
收藏一下,看看线性度如何啊。

出0入0汤圆

发表于 2009-10-1 22:35:04 | 显示全部楼层
才发现

出0入0汤圆

发表于 2010-1-7 18:30:59 | 显示全部楼层
收藏

出0入0汤圆

发表于 2010-1-9 18:16:38 | 显示全部楼层
// icc 6.31a , atmage48, 8m osc
//热敏电阻:10KΩ B值:3380  
#include <iom48v.h>
#include <macros.h>
#include <stdio.h>
#include <eeprom.h>

#define uchar unsigned char
#define uint unsigned int

#define LED_NUM    PORTD
#define LED_VALUE  PORTB
#define ADC_KEY    5
#define SOUND_OUT  0x04
#define DELAY_MIN  1100

uint v = 0;
uchar adc_channel = 0;
uchar hot_warning[4]={30,35,40,45};
uchar setting_mode = 0;
uchar auto_mode = 0x00;

const uchar disp_table[22] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x01,0x02,0x04,0x08,0x10};

// 溫度表 -10 度到 105 度
const uint v_table[116]={
895,932,969,1006,1045,1085,1125,1166,1208,1250, //-10 ----  -1
1294,1338,1382,1427,1473,1519,1566,1614,1661,1709,//0 ----  9
1758,1807,1856,1905,1955,2004,2054,2104,2154,2204,//10 ----  19
2253,2303,2353,2402,2451,2500,2549,2597,2645,2692,//20 ----  29
2740,2786,2832,2878,2923,2968,3012,3056,3099,3141,//30 ----  39
3183,3224,3265,3304,3344,3382,3420,3457,3493,3529,//40 ----  49
3564,3599,3632,3665,3698,3729,3760,3791,3820,3849,//50 ----  59
3878,3905,3932,3959,3985,4010,4034,4058,4082,4105,//60 ----  69
4127,4149,4170,4191,4211,4231,4250,4269,4287,4304,//70 ----  79
4322,4339,4355,4371,4387,4402,4417,4431,4445,4459,//80 ----  89
4472,4485,4497,4510,4522,4533,4545,4556,4566,4577,//90 ----  99
4587,4597,4607,4616,4625,4634};//100 ----  105


const uchar sound[]={ //樂曲數据表
0x45,0x48,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x49,0x4a,
0x49,0x48,0x48,0x48,0x48,0x48,0x45,0x48,0x4a,0x4a,
0x48,0x4a,0x4c,0x4c,0x4b,0x4a,0x49,0x49,0x49,0x49,
0x49,0x4c,0x4b,0x4a,0x4a,0x4a,0x49,0x48,0x48,0x49,
0x4a,0x4c,0x4b,0x4b,0x4b,0x4b,0x4b,0x46,0x46,0x45,
0x45,0x45,0x47,0x48,0x49,0x49,0x4a,0x49,0x48,0x48,
0x48,0x48,0x48,0x48,

0x00,0x00
};

const uint TONETABLE[15]={ //音調頻率數据表
64580,64684,64777,64820,64898,64968,65030,65058,
65110,65157,65178,65217,65252,65283,65297
};

uint toneconst;

void delay_1ms(void)
{
uint i;
for (i=0;i<DELAY_MIN;i++);
WDR();
}

void delay_nms(uint n)
{
uint i;
for (i=0;i<n;i++)
delay_1ms();
}

void disp_led(uint value)
{
uchar i,j;
  uchar led_data[5];

led_data[0] = adc_channel;

if ((value & 0x8000)==0x8000)
{
value &= 0x7fff;
led_data[4] = 16; // 顯示負號
}
else
{
value &= 0x7fff;
led_data[4] = value/1000;
};

led_data[3] = value/100%10;
led_data[2] = value/10%10;
led_data[1] = value%10;

for (j=0;j<20;j++)
{
for (i=0;i<5;i++)
{
LED_VALUE = disp_table[led_data];
if(i==2)
{
LED_VALUE |= 0x80; // 加上小數點
}
LED_NUM = ~BIT(i+3);
delay_nms(5);
LED_NUM = 0xff;
};
};
}

#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{   
    uint temp;
temp = ADCL;
temp |= (int)ADCH<<8;
temp = (49*temp)/10;
v += temp;
}

void get_adc_value(uchar adc_pin)
{   
    uchar i;
v = 0x0000;
ADMUX = (1<<REFS0)|adc_pin;
// for(i=0;i<2;i++)
{
// ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
ADCSRA |= (1<<ADSC);
delay_nms(1);
//  while((ADCSRA & (1<<ADIF))==0);  
ADCSRA &= ~(1<<ADSC);
// ADCSRA &= ~(1<<ADIF);   
    }
// v = v/2;
}

uchar get_key_value(void)
{
get_adc_value(ADC_KEY);
if (v < 1000)
{
return 0;
}
else
{
if ((v > 3000)&&(v < 3500))
{
return 1;
}
else
{
if ((v > 2000)&&(v < 2800))
{
return 2;
}
else
{
if ((v > 1000)&&(v < 1900))
{
return 3;
}
else
{
return 0;
}
}
}
}
}

void temp_setting(void)
{
uchar key;
key = get_key_value();

if(key==2)
{
adc_channel++;
if (adc_channel>3)
{
adc_channel = 0;
}
}

if(key==3)
{
if (adc_channel==0)
{
adc_channel = 1;
auto_mode = ~auto_mode;
}
adc_channel--;
}

while(1) // 查鰎盤是否放開
{
get_adc_value(ADC_KEY);
if(v < 500)
{
break;
};
};

if (key==1) setting_mode = 1;

while(setting_mode==1)
{
key = get_key_value();
if(key==1)
{
adc_channel++;
if (adc_channel>3)
{
adc_channel = 0;
setting_mode = 0;
EEPROMwrite(0x01, hot_warning[0]);
delay_nms(5);
EEPROMwrite(0x02, hot_warning[1]);
delay_nms(5);
EEPROMwrite(0x03, hot_warning[2]);
delay_nms(5);
EEPROMwrite(0x04, hot_warning[3]);
delay_nms(5);
}
}
else
{
if(key==2)
{
++hot_warning[adc_channel];
}
else
{
if(key==3) --hot_warning[adc_channel];
};
};

while(1)
{
get_adc_value(ADC_KEY);
if(v < 500)
{
break;
};
};

disp_led(hot_warning[adc_channel]);
}

}

uint get_degree(void)
{
uchar x,y;
uint v_big,v_small,v_step;

if (v<100) return 0x83E7; // 當沒有信號時顯示-99.9錯誤

for (x=0;x<115;x++) // 查表
{
if (v_table[x] >= v) // 找出電壓區域
{
v_big = v_table[x]; // 區域 高段
v_small = v_table[x-1]; //區域 低段
v_step = (v_big - v_small)/10; // 把區域細分成10份
for (y=0;y<10;y++) // 細分比較
{
v_small += v_step;
if (v < v_small) // 得出結果
{
v = x*10+y;// 其中x*10 為整數部分, y 為小數部分
if (x<10) // 少於10時為負溫度
{
v |= 0x8000; // 加入負號標記
}
else
{
v -= 100; // 0 度修正
}
        return v;   
};
};
};
WDR();
}   
  return v;  
}

void init_port(void)
{
  CLKPR = 0x80;
  CLKPR = 0x00;
DDRB = 0xff;
PORTB = 0xff;
DDRC = 0x00;
PORTC = 0x00;
DDRD = 0xff;
PORTD = 0xff;
CLI();
ADMUX = (1<<REFS0);
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
SEI();
WDR(); // 使用看門狗
//WDTCR = 0x0F;
    WDTCSR = 0x0F;
}

//**********************************************8
#pragma interrupt_handler timer1_ovf_isr:14 //iv_TIMER1_OVF
void timer1_ovf_isr(void)
{
TCNT1=toneconst;
PORTD^=SOUND_OUT;
}

void music(void)
{
uchar temp,temp1;
uint sound_add=0;

TCCR1A = 0x00;
TCCR1B =(1<<CS11);//8分頻
temp1 = sound[sound_add];
while(temp1!=0)
{
temp=temp1;
temp&=0x0f;
if(temp!=0)
{
TIMSK1|=(1<<TOIE1);//根据SOUNDTABLE中數据的低四位產生音樂頻率
temp--;
toneconst=TONETABLE[temp];
TCNT1=toneconst;
}
temp=temp1;
temp>>=4;
temp&=0x0f;
delay_nms(temp*129);//根据SOUNDTABLE中數据的高四位,控制音樂頻率持續時間
TIMSK1&=~(1<<TOIE1);
sound_add++;
temp1 = sound[sound_add];
}
delay_nms(1000);
}
//****************************************************

void main(void)
{
uchar j;
init_port();
hot_warning[0] = EEPROMread(0x01);
hot_warning[1] = EEPROMread(0x02);
hot_warning[2] = EEPROMread(0x03);
hot_warning[3] = EEPROMread(0x04);
while(1)
{
for(j=0;j<4;j++)
{
temp_setting(); // 設定
get_adc_value(adc_channel); // 進行adc取樣
get_degree(); // get_degree()的功能是把adc的值進行查表取數
if(v/10 > hot_warning[adc_channel]) // 檢查溫度是否超過上限
{
//disp_led(0x83E7);
music();
}
else
{
disp_led(v); // 顯示數據,v由get_degree()中產生
}
WDR();
}

if (auto_mode==0xff) // 自動模式
{
adc_channel++;
if (adc_channel>3) adc_channel=0;
}
}

}

出0入0汤圆

发表于 2010-1-11 10:38:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-30 23:45:42 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-1-31 18:46:58 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2010-1-31 19:13:38 | 显示全部楼层
hao

出0入0汤圆

发表于 2010-2-8 10:47:51 | 显示全部楼层
ding!

出0入0汤圆

发表于 2010-2-8 16:40:19 | 显示全部楼层
很好,收藏一下

出0入0汤圆

发表于 2010-2-8 18:10:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-22 16:15:30 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-2-9 18:09:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-9 22:12:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-8 12:08:23 | 显示全部楼层
mark

出50入0汤圆

发表于 2011-3-16 18:10:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-17 16:53:23 | 显示全部楼层
低成本?一听到Mage48 Mega8就足够吓死客户了!

出0入0汤圆

发表于 2011-3-17 23:05:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-19 22:36:27 | 显示全部楼层
很有参考价值

出0入0汤圆

发表于 2011-6-19 22:49:15 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-6-19 22:51:55 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-9-20 16:34:52 | 显示全部楼层
mark 温度测量

出0入0汤圆

发表于 2011-9-20 20:18:00 | 显示全部楼层
留个记号

出0入0汤圆

发表于 2011-9-23 17:25:45 | 显示全部楼层
记号。

出0入0汤圆

发表于 2011-9-23 18:53:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-23 20:07:28 | 显示全部楼层
好东西

出0入0汤圆

发表于 2011-9-23 21:00:02 | 显示全部楼层
顶古老贴。

出0入0汤圆

发表于 2011-9-25 10:00:27 | 显示全部楼层
怎么查表呢,怎么将数据写入flash中呢

出0入0汤圆

发表于 2012-2-4 09:59:49 | 显示全部楼层
很多仪器仪表全都是用的这种NTC或者PTC的探头!-50~90度范围测量还行
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 11:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表