|
LM35D接PIC16F877A (LCD ADC)
[复制链接]
|
|
发表于 4-1-2007 11:37 AM
|
显示全部楼层
原帖由 gab102001 于 3-1-2007 09:42 PM 发表
不好意思,想问问pic 大大,%2.1f 表示什么?? value output 了会有两个位数和一个小数点??
例如:26.5 degree ???
这不正是你要的吗?
%2f 表示预留2个“个位”数,显示所有的小数点。
%2.3f 表示预留2个“个位”数,显示3个小数点。
%2.1f 表示预留2个“个位”数,显示1个小数点。
自己改变看看它的分别。 |
|
|
|
|
|
|
|
楼主 |
发表于 5-1-2007 05:07 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 6-1-2007 12:38 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 6-1-2007 09:02 PM
|
显示全部楼层
回复 #23 pic 的帖子
PIC 大大。。。我还想问问。。。
以下的coding里,send_nibble 代表什么???
void lcd_send_nibble( byte n )
{
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}
void lcd_send_byte( byte address, byte n )
{
lcd.rs = 0;
delay_ms(5);
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
} |
|
|
|
|
|
|
|
发表于 7-1-2007 05:17 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 7-1-2007 07:50 PM
|
显示全部楼层
回复 #25 pic 的帖子
明鸟。。。。谢谢PIC大大。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 19-1-2007 09:57 PM
|
显示全部楼层
PIC大大,我看了那全部source code。。。
我也看了LCD的data sheet,有很多不同的方法启动那LCD。。。
我觉得你的source code是这样启动LCD的。。。
0x28是function set
0xc是Display on off control
1是clear display
6是entry mode set
但为什么一开始就send了两次byte 3和三次byte 2?
然后是怎样让LCD分辨display第一排和第二排?
我也看了几次CA3162的data sheet。发现你所谓的Driver timing是high speed mode,大约0.5us。而AT89C4051的timing只有几us罢了。所以AT89C4051是很难捕捉到CA3162的MSB和BCD output。就是因为CA3162的timing太快,所以temperature reading一直在快速的变。
我这样的说法对吗?
[ 本帖最后由 Right 于 19-1-2007 11:07 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 20-1-2007 08:28 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 12-3-2007 01:35 AM
|
显示全部楼层
谢谢PIC大大的指导。。。
虽然FYP完了,但是我还有一个疑问。。。
我看了LCD上dislay的温度,然后直接用multimeter量LM35D的output,发现温度和LM35D的output voltage不吻合,大概差1度左右。
我觉得是ADC的gain(0.48828)不对了或output voltage过了ADC后除了问题。哪我直接换它的gain,这样做对吗? |
|
|
|
|
|
|
|
发表于 13-3-2007 06:52 PM
|
显示全部楼层
原帖由 Right 于 12-3-2007 01:35 AM 发表
我看了LCD上dislay的温度,然后直接用multimeter量LM35D的output,发现温度和LM35D的output voltage不吻合,大概差1度左右。
我觉得是ADC的gain(0.48828)不对了或output voltage过了ADC后除了问题。哪我直接换它的gain,这样做对吗?
差1度。。。太多了。。。
你可以Calibrate ,你的Reference voltage, VCC要稳, 才不会跑太多。 |
|
|
|
|
|
|
|
楼主 |
发表于 13-3-2007 07:45 PM
|
显示全部楼层
原帖由 pic 于 13-3-2007 06:52 PM 发表
差1度。。。太多了。。。
你可以Calibrate ,你的Reference voltage, VCC要稳, 才不会跑太多。
这样我想应该是Power Supply的问题。。。
因为它的supply voltage不稳定。。。
我用multimeter量了,不稳定。。。
可能是那个Power Supply的品质没那么好吧。。。 |
|
|
|
|
|
|
|
发表于 31-8-2007 05:47 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 1-9-2007 09:50 AM
|
显示全部楼层
回复 #32 sadsack 的帖子
回覆前,可以先看你的电路图吗? |
|
|
|
|
|
|
|
发表于 1-9-2007 01:03 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 1-9-2007 04:12 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 1-9-2007 04:25 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 1-9-2007 08:56 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 4-5-2008 05:27 PM
|
显示全部楼层
原帖由 Right 于 28-12-2006 04:09 PM 发表
我使用了您介绍的PIC16F877A接LM35D...我改了一些您给的program...如下:
#include <16F877A.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
///////////////////////////////////////////////////////////////////////////////
// LCD Driver
///////////////////////////////////////////////////////////////////////////////
// As defined in the following structure the pin connection is as follows:
/*
LCD 16 X 2 line
PortD.0-> RS
PortD.1-> RW
PortD.2-> E
PortD.3
PortD.4-> D4
PortD.5-> D5
PortD.6-> D6
PortD.7-> D7
*/
/////////////////////////////////////////////////////////////////
// LCD Driver
struct lcd_pin_map { // This structure is overlayed
boolean rs; // on to an I/O port to gain
boolean rw; // access to the LCD pins.
boolean enable; // The bits are allocated from
boolean unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;
#byte lcd = 0x08 // on to port D (at address 0x08)
byte CONST LCD_INIT_STRING[4] = {0x28, 0xc, 1, 6};
void lcd_send_nibble( byte n )
{
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}
void lcd_send_byte( byte address, byte n )
{
lcd.rs = 0;
delay_ms(5);
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init()
{
byte i;
set_tris_d(0);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
{
lcd_send_byte(0,LCD_INIT_STRING);
}
}
void lcd_gotoxy( byte x, byte y)
{
byte address;
if(y!=1)
address=0x40;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c)
{
switch (c) {
case '\f' : lcd_send_byte(0,1); //delay_ms(5);
break;
case '\n' : lcd_gotoxy(1,2); break;
default : lcd_send_byte(1,c); break;
}
}
///////////////////////////////////////////////////////////////////////////////
void main()
{
long value;
lcd_init();
delay_ms(6);
lcd_putc("\fTemperature");
lcd_putc("\nReading");
delay_ms(1000);
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
while(TRUE)
{
value = Read_ADC();
printf(lcd_putc,"\fReading: %lu ",value);
delay_ms(500);
}
}
可是,今天我试了之后,LCD完全没反应,没错的话,PIC16F877A是用XT oscillator如果我们用20MHz Crystal.它的pin11,12,31,32的Vss和Vdd都接了。。
那会是什么问题呢??
hihi,"Right 兄台“
我想像您询问下,您介意让我参考下您的 delay_ms(), delay_us, delay_cycles() 的函数 (function) 吗?
想像您询问,假如你丢“10“ 到 delay_ms() 和 delay_us() ,那么你 delay 的 时间是 10milisecond 和 10microsecond (误差少许) 吗?因为有 study datasheet 的关系,我看到 datasheet 里也是有讲说,on power 15 milisecond 里,"No data should be transferred to or from the display during this time".
void lcd_init()
{
byte i;
set_tris_d(0);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15); // <<=== 是真的delay 15 milisecond 吗?
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
那么 delay_cycles() 是怎样准准如果我想 delay 两个 cycles 就两个 cycle 呢?
我是用别的 mcu, 我自己有写 delay 的 function, 用 mcu 的 timer 来做 delay, 也是满准的,但如果是用 一个 loop 来做 delay 的话行吗(当我用 60 Mhz 的情况地下)? |
|
|
|
|
|
|
|
发表于 4-5-2008 05:55 PM
|
显示全部楼层
原帖由 半夜鬼 于 4-5-2008 05:27 PM 发表
hihi,"Right 兄台“
我想像您询问下,您介意让我参考下您的 delay_ms(), delay_us, delay_cycles() 的函数 (function) 吗?
想像您询问,假如你丢“10“ 到 delay_ms() 和 delay_us() ,那么你 delay 的 时间 ...
delay_ms, delay_us 和delay_cycles是compiler 内建的function.
help file里面有讲到-〉This function works by executing a precise number of instructions to cause the requested delay. It does not use any timers. If interrupts are enabled the time spent in an interrupt routine is not counted toward the time.
也就是说这个delay是准的。。不过当有interrupt的时候会不准。如果算到一半interrupt occur,他就停止, 直到从interrupt回来为止。
delay_cycles也是compiler自己内建的函数。
我写一个简单的delay_cycles。 再看会asm/list file.发觉他只是加入nop instruction而已。
.................... delay_cycles(6);
*
003E: NOP
003F: NOP
0040: NOP
0041: NOP
0042: NOP
0043: NOP
用timer来做delay是很准。 interrupt的时候还会继续算。 如果用loop就好像内建的delay_ms 函数。crystal speed不是问题。 只要你instuction execution time算得准就可以了。
[ 本帖最后由 fritlizt 于 4-5-2008 05:58 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 4-5-2008 06:53 PM
|
显示全部楼层
原帖由 fritlizt 于 4-5-2008 05:55 PM 发表
delay_ms, delay_us 和delay_cycles是compiler 内建的function.
help file里面有讲到-〉This function works by executing a precise number of instructions to cause the requested delay. It does not use any timers. If interrupts are enabled the time spent in an interrupt routine is not counted toward the time.
也就是说这个delay是准的。。不过当有interrupt的时候会不准。如果算到一半interrupt occur,他就停止, 直到从interrupt回来为止。
delay_cycles也是compiler自己内建的函数。
我写一个简单的delay_cycles。 再看会asm/list file.发觉他只是加入nop instruction而已。
.................... delay_cycles(6);
*
003E: NOP
003F: NOP
0040: NOP
0041: NOP
0042: NOP
0043: NOP
用timer来做delay是很准。 interrupt的时候还会继续算。 如果用loop就好像内建的delay_ms 函数。crystal speed不是问题。 只要你instuction execution time算得准就可以了。
明白,谢谢fritlizt 大大。。
不过我是用 C 来写,不知道单单一个单纯的
while(1); //<== 需要用多少时间
or
for (i=0; i<10; i++) ; //<== 需要用多少时间
用示波器看看应该可以了。。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|