|
我需要用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--);
} |
|
|
|
|
|
|
|
发表于 26-3-2008 07:40 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 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个可以吗? |
|
|
|
|
|
|
|
楼主 |
发表于 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
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|