|
问问关于atmelAT89c51的program问题!
[复制链接]
|
|
发表于 26-2-2009 10:39 PM
|
显示全部楼层
原帖由 gabrielloy 于 26-2-2009 10:08 PM 发表 ![](http://cforum3.cari.com.my/images/common/back.gif)
pic大大说的“pin 3 要接 1K~10K 的VR“,VR是指voltage regulator吗?
VR=variable resistor,
你可以买Trim pot , 可变电阻。
![](http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/PCB_variable_resistors.jpg/569px-PCB_variable_resistors.jpg) |
|
|
|
|
|
|
|
![](static/image/common/ico_lz.png)
楼主 |
发表于 26-2-2009 10:56 PM
|
显示全部楼层
不好意思,没看清楚图。现在才看到时可变电阻。除了pin1,2,3外,还有什么不对的吗?例如ICchip的pin circuit,reset circuit等等。还有IC chip 的pin9是直接接GND还是接5V?还有pin 31 |
|
|
|
|
|
|
|
发表于 26-2-2009 11:10 PM
|
显示全部楼层
原帖由 gabrielloy 于 26-2-2009 10:56 PM 发表 ![](http://cforum3.cari.com.my/images/common/back.gif)
不好意思,没看清楚图。现在才看到时可变电阻。除了pin1,2,3外,还有什么不对的吗?例如ICchip的pin circuit,reset circuit等等。还有IC chip 的pin9是直接接GND还是接5V?还有pin 31
这个图不完整。我在之前有讲过。还给过你一个reference.
我的reset circuit像你一样直接接到ground就可以了吗?
-〉http://www.freewebs.com/maheshwankhede/basic.html. 我也是拿它的设计。manual reset
你自己检查看。 改正所有错误。 还是不能走才上来发问。 |
|
|
|
|
|
|
|
发表于 1-3-2009 01:56 PM
|
显示全部楼层
原帖由 gabrielloy 于 26-2-2009 10:56 PM 发表 ![](http://cforum3.cari.com.my/images/common/back.gif)
不好意思,没看清楚图。现在才看到时可变电阻。除了pin1,2,3外,还有什么不对的吗?例如ICchip的pin circuit,reset circuit等等。还有IC chip 的pin9是直接接GND还是接5V?还有pin 31
怎样?可以了吗? |
|
|
|
|
|
|
|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2-3-2009 09:28 AM
|
显示全部楼层
还是不可以run,我已经照着接了,也检查了好几次,但是就是不会run,我的pin3接了一个10k的variable resistor可变电阻,reset circuit pin9,接一个10K的resistor去GND,在接一个capacitor去voltage supply 5V.可是就是不可以run。我问了我的classmate,也是有做lcd display的,他说用4 bits mode display 会有问题,他叫我用8 bit mode 的,那8 bit mode 的program 该改哪里呢?还有就是大大,你觉得应该改吗?是这样的问题吗? |
|
|
|
|
|
|
|
发表于 2-3-2009 10:41 AM
|
显示全部楼层
原帖由 gabrielloy 于 2-3-2009 09:28 AM 发表 ![](http://cforum1.cari.com.my/images/common/back.gif)
还是不可以run,我已经照着接了,也检查了好几次,但是就是不会run,我的pin3接了一个10k的variable resistor可变电阻,reset circuit pin9,接一个10K的resistor去GND,在接一个capacitor去voltage supply 5V.可是就是 ...
你的schematics, pcb layout有吗??
要你的。不是我的。 这样比较容易看出问题在那里。 |
|
|
|
|
|
|
|
发表于 2-3-2009 11:06 AM
|
显示全部楼层
原帖由 gabrielloy 于 2-3-2009 09:28 AM 发表 ![](http://cforum2.cari.com.my/images/common/back.gif)
还是不可以run,我已经照着接了,也检查了好几次,但是就是不会run,我的pin3接了一个10k的variable resistor可变电阻,reset circuit pin9,接一个10K的resistor去GND,在接一个capacitor去voltage supply 5V.可是就是 ...
就如fritlizt所说的,先澈底檢查接线。很多时候是焊接不良,或线路接错了(如:LCD的D4~D7线接反了,即D4接到D7,D5接到D6......等等)。
如果可以,就拍些照片传上來看看。 |
|
|
|
|
|
|
|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2-3-2009 08:02 PM
|
显示全部楼层
检查完了,还是run不了,我的pin9接一个resistor到GND,和接一个capacitor到supply.33pF的capacitor和12MHZ的crystal.是不是program的问题?#include<at89x51.h>
#define CLR_DISP 0x01
#define DISP_ON 0x0C
#define DISP_OFF 0x08
#define CUR_HOME 0x02
#define CUR_OFF 0x0C
#define CUR_ON_UNDER 0x0E
#define CUR_ON_BLINK 0x0F
#define CUR_LEFT 0x10
#define CUR_RIGHT 0x14
#define CUR_UP 0x80
#define CUR_DOWN 0xC0
#define ENTER 0xC0
#define DD_RAM_ADDR 0x80
#define DD_RAM_ADDR2 0xC0
sbit D7 = P2^6;
sbit D6 = P2^5;
sbit D5 = P2^4;
sbit D4 = P2^3;
sbit EN = P2^2;
sbit RW = P2^1;
sbit RS = P2^0;
sbit a = P1^0;
void system_init (void);
void delay_ms (unsigned int milisec);
void lcd_init (void);
void lcd_write_cmd (unsigned char cmd);
void lcd_write_data (unsigned char character);
void lcd_print (char *string);
void lcd_busy (void);
int main (void)
{
system_init ();
while (1){
if (a == 1)
lcd_print ("CO inside car in\n@danger level");
else
lcd_print ("CO inside car in\n@safety level");
delay_ms(10);
}
while (1);
return 0;
}
void system_init (void)
{
P0 = 0xFF; //port initialization
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
TMOD = 0x21; // set timer 1 to 8bit auto reload mode.
lcd_init();
}
void delay_ms (unsigned int milisec)
{
unsigned int i;
for (i = 1; i <= milisec; i++){
TH0 = 0xFC;
TL0 = 0x18;
TR0 = 1;
while (!TF0);
TF0 = 0;
TR0 = 0;
}
}
void lcd_init (void)
{
unsigned char i;
delay_ms (15);
RS = 0;
RW = 0;
for (i = 0; i < 3; i++){
EN = 1;
D7 = 0;
D6 = 0;
D5 = 1;
D4 = 1;
EN = 0;
delay_ms (5);
}
EN = 1;
D7 = 0;
D6 = 0;
D5 = 1;
D4 = 0;
EN = 0;
delay_ms (5);
lcd_write_cmd (0x28); //4 bit mode
lcd_write_cmd (CUR_ON_BLINK); //display on, curser on, curcor blink on
lcd_write_cmd (CLR_DISP); //Clear Display
lcd_write_cmd (0x06); //increment cursor position
}
void lcd_write_cmd (unsigned char cmd)
{
lcd_busy();
RW = 0;
RS = 0;
EN = 1;
D7 = cmd & 0x80;
D6 = cmd & 0x40;
D5 = cmd & 0x20;
D4 = cmd & 0x10;
EN = 0;
EN = 1;
D7 = cmd & 0x08;
D6 = cmd & 0x04;
D5 = cmd & 0x02;
D4 = cmd & 0x01;
EN = 0;
}
void lcd_write_data (unsigned char character)
{
lcd_busy();
RW = 0;
RS = 1;
EN = 1;
D7 = character & 0x80;
D6 = character & 0x40;
D5 = character & 0x20;
D4 = character & 0x10;
EN = 0;
EN = 1;
D7 = character & 0x08;
D6 = character & 0x04;
D5 = character & 0x02;
D4 = character & 0x01;
EN = 0;
}
void lcd_print (char *string)
{
unsigned char temp, i = 1;
lcd_write_cmd (CLR_DISP);
for (temp = 0; string[temp]!= 0; temp++){
if (string[temp] == '\n'){
i++;
if(i > 2)
i = 1;
switch (i){
case 1:
lcd_write_cmd (CUR_UP);
break;
case 2:
lcd_write_cmd (CUR_DOWN);
break;
default:
break;
}
}
else
lcd_write_data (string[temp]);
}
}
void lcd_busy (void)
{
bit busy = 1;
RS = 0;
RW = 1;
D7 = 1;
D6 = 1;
D5 = 1;
D4 = 1;
while (busy){
EN = 0;
EN = 1;
EN = 1;
busy = D7;
EN = 0;
EN = 1;
}
EN = 0;
} ![](http://i697.photobucket.com/albums/vv334/zicoloy/Image050.jpg) |
|
|
|
|
|
|
|
发表于 2-3-2009 08:47 PM
|
显示全部楼层
reset听起来没问题 。
EA 有没有接去5v.?
有没有比较清楚地照片?
最好是多角度清楚的照片。 看到的东西比较多。
你的照片, 老实讲。 看不到什么的。pin1是哪里, pin40是那里我都看不到。
只看到有一个lcd, mcu, vr, crystal, 还有一个应该是voltage reg得咚咚。 |
|
|
|
|
|
|
|
发表于 2-3-2009 10:48 PM
|
显示全部楼层
对於照片的建义:
(1) 如fritlizt所说,要『多角度清楚的照片』,且其中一張要从正上方拍。
(2) 所有接线要排列整齊,可以清楚看到它是插proiject board的那一个洞。
(3) LCD电板的焊接脚要拍出來,可以清楚看到它的脚號码(pin1~pin14)。
还有,你的project board是新的吗?若是用过多次的,那么,有些洞的接脚已经弹性疲乏,造成接触不良。换用更粗的铜线试试看。 |
|
|
|
|
|
|
|
发表于 3-3-2009 11:36 AM
|
显示全部楼层
换一个LCD试看。
之前我有一个,就是 contrast 那里没放resistor, 先去ground, 不能然后换 Vcc, 然后还是不能, 在放resistor, 然后还是不能, 最后换 LCD 就好。可能是没放resistor 时弄坏了。 因为在proteus 没问题。
情况和你一样, 一黑一白。*烧焊没有问题。 |
|
|
|
|
|
|
|
发表于 3-3-2009 01:44 PM
|
显示全部楼层
原帖由 chan1314 于 3-3-2009 11:36 AM 发表 ![](http://cforum2.cari.com.my/images/common/back.gif)
换一个LCD试看。
之前我有一个,就是 contrast 那里没放resistor, 先去ground, 不能然后换 Vcc, 然后还是不能, 在放resistor, 然后还是不能, 最后换 LCD 就好。可能是没放resistor 时弄坏了。 因为在proteus 没问题。
情况和你一样, 一黑一白。*烧焊没有问题。
对,若电路沒接错,換个LCD试试看。我也燒过LCD,换了就OK了。 |
|
|
|
|
|
|
|
![](static/image/common/ico_lz.png)
楼主 |
发表于 3-3-2009 03:35 PM
|
显示全部楼层
检查了电路没问题,可是就是不行。我只是想知道之前我该的fritlizt大大的program有没有问题?就port initial的时候,我把P1set成0xFF,对不对?int main (void)
{
system_init ();
while (1){
if (a == 1)
lcd_print ("CO inside car in\n@danger level");
else
lcd_print ("CO inside car in\n@safety level");
delay_ms(10);
}
while (1);
return 0;
}
void system_init (void)
{
P0 = 0xFF; //port initialization
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
TMOD = 0x21; // set timer 1 to 8bit auto reload mode.
lcd_init();
} |
|
|
|
|
|
|
|
发表于 3-3-2009 04:37 PM
|
显示全部楼层
原帖由 gabrielloy 于 3-3-2009 03:35 PM 发表 ![](http://cforum6.cari.com.my/images/common/back.gif)
检查了电路没问题,可是就是不行。我只是想知道之前我该的fritlizt大大的program有没有问题?就port initial的时候,我把P1set成0xFF,对不对?
int main (void)
{
system_init ();
while (1){
...
其实你有读我的program的话。 不难发觉到我的lcd是接P2的。 不管P1,是什么。 lcd也不会受到影响。 |
|
|
|
|
|
|
|
![](static/image/common/ico_lz.png)
楼主 |
发表于 3-3-2009 04:44 PM
|
显示全部楼层
这个我知道,可是我最后要达到的效果是port1有input,5V,然后就会从port2display,所以我才要搞清楚p1的initial,对了大大,我看到你有写lcd check busy的subfunction,那之前define的p1,p2,p3,p0的0xFF会不会变,send data去Lcd的时候,不是要set成00的吗? |
|
|
|
|
|
|
|
![](static/image/common/ico_lz.png)
楼主 |
发表于 3-3-2009 04:46 PM
|
显示全部楼层
|
|
|
|
|
|
|
![](static/image/common/ico_lz.png)
楼主 |
发表于 3-3-2009 06:41 PM
|
显示全部楼层
我想请问大大,R/Wpin,要怎么接?是直接接GND这样吗?![](http://i697.photobucket.com/albums/vv334/zicoloy/lcddia.jpg)
之前pic大大的图也是这样,
![](http://i697.photobucket.com/albums/vv334/zicoloy/parlcd.gif) |
|
|
|
|
|
|
|
发表于 3-3-2009 09:48 PM
|
显示全部楼层
|
|
|
|
|
|
|
![](static/image/common/ico_lz.png)
楼主 |
发表于 3-3-2009 10:19 PM
|
显示全部楼层
我用你的4bits mode的program和circuit,但是就是不能run.是不是delay的问题,不同的lcd的delay都不同不是吗?我的很多classmate之前多是用4bits mode的,但是也是不成功,所以全部换成8bits mode的了,如果是8bits mode 的话,大大你的program要改哪里?可以直接发上来吗?我没有多少时间了,真的对不起,真的很需要,要交报告了![](static/image/smiley/default/sad.gif) |
|
|
|
|
|
|
|
发表于 4-3-2009 11:27 AM
|
显示全部楼层
原帖由 gabrielloy 于 3-3-2009 10:19 PM 发表 ![](http://cforum3.cari.com.my/images/common/back.gif)
我用你的4bits mode的program和circuit,但是就是不能run.是不是delay的问题,不同的lcd的delay都不同不是吗?我的很多classmate之前多是用4bits mode的,但是也是不成功,所以全部换成8bits mode的了,如果是8bits m ...
1。接你朋友的lcd来试试看。
先关掉backlight, 不要开. backlight很耗电。
2。如果还不能。 要查看power是否接对。用multimeter 查看。 pin40, pin31是不是5v. pin20是不是gnd. 如果没有reset.你的pin9应该会是接近0v.
3.如果都没问题, 还是不能。 看program有没有run.前提是burn 一个很简单的program进去89s51. P1 = 0xAA, P2 = 0x55.什么都不要。
- int main (void)
- {
- P1 = 0xAA;
- P2 = 0x55;
- while (1);
- }
复制代码
过后用meter查看P1 是不是10101010,p2是不是01010101.如果这个不能, 也就是说你的program没有跑。
mcu坏了,crsytal电路接错或者不稳(因为你用面包板),还是crystal真的坏了(这个是最坏结果, crystal很少坏的。换一个crystal看看)。
结果告诉我。
如果要lcd跑,你的3一定要run到。
我的除了start up,没有用delay.我用check busy flag 的。startup delay应该不会影响。
[ 本帖最后由 fritlizt 于 4-3-2009 11:40 AM 编辑 ] |
|
|
|
|
|
|
| |
本周最热论坛帖子
|