佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1610|回复: 7

PIC温度计

[复制链接]
发表于 26-3-2008 06:57 PM | 显示全部楼层 |阅读模式
我需要用pic来显示箱子里面的温度。我用的temperature sensor是LM35D,还有PIC16F877A和7-segment display。我找到了类似的program但那是for LCD display。所以我改了一点,但不知道为什么好像不能用。我不知道是不是我写的code出错了。我用的compiler是MPLAB里面的HI-TECH C Compiler。是我用了不对的compiler吗?这是我第一次用PIC,希望大家可以帮帮忙...谢谢!

//==================include=================================
#include<pic.h>
//===============configuration==============================
__CONFIG (0x3F32);
//===============define IO port=============================
#define                sseg                PORTC
#define                digit1                RA2
#define                digit2                RA4
#define                zero                0b11000000
#define                one                0b11111001
#define                two                0b10100100
#define                three                0b10110000
#define                four                0b10011001
#define                five                0b10010010
#define                six                0b10000010
#define                seven                0b11011000
#define                eight                0b10000000
#define                nine                0b10010000
//==============FUNCTION PROTOTYPE=========================
void delay(unsigned short i);
void send_char(unsigned char data);
void send_config(unsigned char data);
void dis_num(unsigned long data);
void increment(unsigned long data);
void read_adc(void);
unsigned short read_temp(void);
//====================MAIN================================
unsigned short result;
unsigned short temp;
unsigned short i;

void main(void)
{
        ADRESH=0;                                        //clear A/D result
        ADRESL=0;                                        //clear A/D result

        //setting ADCON1 Register
        ADCON1=0b11000101;                        // A/D result right justified,                        
                                                // configure RA4 and RA5 as digital I/O
        ADCON0=0b10000001;                        // AN0

        TRISA=0b11101011;                        //configure PORTA I/O direction
        TRISB=0b00000000;                        //configure PORTB as output
        TRISC=0b00000000;                        //configure PORTC as output

        PORTA=0;
        PORTB=0;
        digit1=1;
        digit2=1;
        
        while(1)                                //infinity loop        
        {
                read_adc();

                temp=read_temp();
                for(i=3000;i>0;i--)
                {
                        digit1=0;
                        dis_num(temp/10);
                        delay(2000);
                        digit1=1;
                        digit2=0;
                        dis_num(temp%10);
                        delay(2000);
                        digit2=1;
                }
        }               
}               
//==================subroutine 7 segment setting ==========================

void dis_num(unsigned long data)
{        
        if(data==1)
        {        sseg=one;
        }
        else if(data==2)
        {        sseg=two;
        }
        else if(data==3)
        {        sseg=three;
        }
        else if(data==4)
        {        sseg=four;
        }
        else if(data==5)
        {        sseg=five;
        }
        else if(data==6)
        {        sseg=six;
        }
        else if(data==7)
        {        sseg=seven;
        }
        else if(data==8)
        {        sseg=eight;
        }
        else if(data==9)
        {        sseg=nine;
        }
        else
        {        sseg=zero;
        }
}

//==================subroutine ADC=========================

void read_adc(void)
{
        unsigned short i;
        unsigned long result_temp=0;
        for(i=2000;i>0;i-=1)                        //looping 2000 times for getting average value
        {
                ADGO = 1;                        //ADGO is the bit 2 of the ADCON0 register
                while(ADGO==1);                        //ADC start, ADGO=0 after finish ADC progress
                result=ADRESH;
                result=result<<8;                        //shift to left for 8 bit
                result=result|ADRESL;                //10 bit result from ADC

                result_temp+=result;               
        }
        result = result_temp/2000;                //getting average value

}

unsigned short read_temp(void)
{
        unsigned short temp;
        temp=result;
        return temp;

}

//==================subroutine DELAY==========================
void delay(unsigned short i)
{        
        for(;i>0;i--);
}
回复

使用道具 举报


ADVERTISEMENT

发表于 26-3-2008 07:40 PM | 显示全部楼层
请放你的电路。

也请参考:
LM35D接PIC16F877A (LCD + ADC)
回复

使用道具 举报

 楼主| 发表于 26-3-2008 10:22 PM | 显示全部楼层
我没有真正的电路图,但类似以下这个。但我只是用两个7-segment,portC接去7-segment,LM35D接去AN0,RA4和RA5来控制7-segment。
关于那个贴,我之前看过了,跟我找到的差不多,他们都是用LCD,所以code有些不同。我的code也是从LCD改去7-segment,但不知道对不对,所以希望有人帮我看看。


[ 本帖最后由 remora 于 26-3-2008 10:35 PM 编辑 ]
回复

使用道具 举报

发表于 26-3-2008 10:50 PM | 显示全部楼层
原帖由 remora 于 26-3-2008 06:57 PM 发表
我需要用pic来显示箱子里面的温度。我用的temperature sensor是LM35D,还有PIC16F877A和7-segment display。我找到了类似的program但那是for LCD display。所以我改了一点,但不知道为什么好像不能用。我不知道是不是 ...


你只是说不能用,未免也开广了些吧?你有用什么 debugger 吗?或只是烧了才试验不能用,请一一道来。
如果是 ADC 读不到资料也请参考 :“adc 读不到资料”.
回复

使用道具 举报

 楼主| 发表于 26-3-2008 11:28 PM | 显示全部楼层

回复 4# rothmans 的帖子

我用HI-TECH C Compiler来compile上面的code,然后我用bootloader将hex file send去PIC。我用LED来代替7-segment,因为我还没有7-segment。我将7个LED接去port C,用VR来代替LM35D以方便我testing。RA3我接去1V reference voltage。然后我reset PIC,可是那些LED都不能亮。无论我怎么改变input voltage,结果都是一样,所以我觉得可能是我的code写错了。
还有一个问题,不同的C Compiler是不是都有不同的C code???
回复

使用道具 举报

发表于 27-3-2008 08:22 PM | 显示全部楼层
原帖由 remora 于 26-3-2008 11:28 PM 发表
我用HI-TECH C Compiler来compile上面的code,然后我用bootloader将hex file send去PIC。我用LED来代替7-segment,因为我还没有7-segment。我将7个LED接去port C,用VR来代替LM35D以方便我testing。RA3我接去1V refe ...

你需要几个digit? 2个可以吗?
回复

使用道具 举报

Follow Us
 楼主| 发表于 27-3-2008 09:49 PM | 显示全部楼层

回复 6# pic 的帖子

应该够吧..因为量的温度在10-80摄氏度里面。而且也不需要太准确。我试着先从简单的开始。
到现在那个code还有问题,LED不能随着input的改变而改变。我不懂是哪一部分错了,会是delay那边吗?因为我不知道那delay的时间,所以就随便放个value下去。
回复

使用道具 举报

发表于 28-3-2008 10:29 PM | 显示全部楼层
原帖由 remora 于 27-3-2008 09:49 PM 发表
应该够吧..因为量的温度在10-80摄氏度里面。而且也不需要太准确。我试着先从简单的开始。
到现在那个code还有问题,LED不能随着input的改变而改变。我不懂是哪一部分错了,会是delay那边吗?因为我不知道那delay的时 ...

如是两个Digit, 你可以直接用16F877A的PortD, PortC 或PortB 接7Segment。


//                          0    1    2    3    4    5    6    7    8    9  
byte CONST LED_MAP[17] = {0x03,0x9f,0x25,0x0D,0x99,0x49,0x41,0x1f,0x01,0x09};
   
    a
  -----
f|     | b      abcd efgh
.|  g  |        8421 8421
  -----         0000 0011=0
e|     | c      1001 1111=1
.|     |        
  -----  o h
    d
回复

使用道具 举报


ADVERTISEMENT

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 1-2-2025 01:02 PM , Processed in 0.124597 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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