佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: gabrielloy

问问关于atmelAT89c51的program问题!

[复制链接]
发表于 6-3-2009 08:32 AM | 显示全部楼层
原帖由 gabrielloy 于 5-3-2009 06:44 PM 发表
大家说的都很有道理,关于led testing,发现了很奇怪的事。我burn了这个program进去mcu里面,准备做port 1,2 testing,

#include
int main (void)
{
    P1 = 0xAA;
    P2 = 0x55;
    while (1);
}
依照以 ...


先上传你这个 testing 电路图的接法,再说。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 6-3-2009 04:06 PM | 显示全部楼层
今天再test了led,没问题了!现在反倒不知道是什么问题了!等等我画完了电路图,在上传上来给各位大大看看。最近很忙,要准备很多东西!
回复

使用道具 举报

 楼主| 发表于 7-3-2009 04:38 PM | 显示全部楼层
想问问几位大大,如果我的一个CO sensor detect到CO然后它的output是analog output,如果我把这个analog output接到我的AT89c51的input port,port1的P1.0,我是不是要在program里set on ADC pins,那么IC才会知道input 进来的是5V的digital input?然后才会run program display string 出来。
回复

使用道具 举报

发表于 8-3-2009 05:55 PM | 显示全部楼层
原帖由 gabrielloy 于 7-3-2009 04:38 PM 发表
想问问几位大大,如果我的一个CO sensor detect到CO然后它的output是analog output,如果我把这个analog output接到我的AT89c51的input port,port1的P1.0,我是不是要在program里set on ADC pins,那么IC才会知道input  ...


。。AT89C51 该没有 ADC 输入脚才对,必须外接 ADC 转换零件。
可以参考下这个网站资料 :http://www.datasheetcatalog.org/datasheet/philips/ADC0803LCD.pdf

[ 本帖最后由 rothmans 于 8-3-2009 06:03 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 9-3-2009 12:09 AM | 显示全部楼层
可是为什么我有了大大的program,还是run不了!!!全部components都没问题啊!!
回复

使用道具 举报

发表于 9-3-2009 08:35 AM | 显示全部楼层
原帖由 gabrielloy 于 9-3-2009 12:09 AM 发表
可是为什么我有了大大的program,还是run不了!!!全部components都没问题啊!!


呵呵!你这问题也太神话了吧!没问题就能操作了。那你认为是什么问题???你的原理图呢?
回复

使用道具 举报

Follow Us
发表于 9-3-2009 09:46 AM | 显示全部楼层
原帖由 gabrielloy 于 5-3-2009 06:44 PM 发表
依照以上的program,port1即p1.0~p1.7会是10101010,可是我用led测试,得出port1的output很小,led只是亮了一点点,但是是全都亮!!不是10101010。还有,port2,全部不亮,而不是program里面的01010101,反而是port3的pin亮了。可是把mcu拿上来,在从新插入,情况又变成port2全亮全部都是5Voutput,而port1保持不变。
为什么?难道是我的mcu有问题?我才刚刚换了一个新的


你的crystal capacitor 放对吗?
value 要对, 然后,看你的图, 好像没有叫做cap 的东西。。。。
回复

使用道具 举报

发表于 9-3-2009 09:49 AM | 显示全部楼层

回复 107# chan1314 的帖子

还有, crystal 不要用电线。越短越好。 直接差在同一排。因为它是 high freq。
你拿osc 来看你crystal, 有没有square wave? 不是就check 你cap 的数值
回复

使用道具 举报


ADVERTISEMENT

发表于 9-3-2009 10:21 AM | 显示全部楼层
原帖由 gabrielloy 于 9-3-2009 12:09 AM 发表
可是为什么我有了大大的program,还是run不了!!!全部components都没问题啊!!

你要不要和网友“冷血趙雲” 交流一番?
http://cforum3.cari.com.my/viewthread.php?tid=1358689&extra=&authorid=156242&page=1

他也做很类似的东西, 然后他快完成了。。可能你和他MSN 会比较有火花?
回复

使用道具 举报

发表于 9-3-2009 11:47 AM | 显示全部楼层
原帖由 chan1314 于 9-3-2009 09:49 AM 发表
还有, crystal 不要用电线。越短越好。 直接差在同一排。因为它是 high freq。
你拿osc 来看你crystal, 有没有square wave? 不是就check 你cap 的数值


->今天再test了led,没问题了!现在反倒不知道是什么问题了!等等我画完了电路图,在上传上来给各位大大看看。最近很忙,要准备很多东西!
led 都可以run了。crystal怎么会有问题。
原理图原理图pls.
没有的话我怎得不动要怎样帮你。我尽力了。。。。。
回复

使用道具 举报

 楼主| 发表于 9-3-2009 05:01 PM | 显示全部楼层
非常谢谢fritzlizt大大,和各位大大。我还是要先再次确认整个电路图。等我确认了在发上来。
回复

使用道具 举报

 楼主| 发表于 9-3-2009 05:11 PM | 显示全部楼层
还有chan1314大大所说的,我用的是33pF的capacitors,还有12MHz的cystal.

[ 本帖最后由 gabrielloy 于 9-3-2009 05:34 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 9-3-2009 06:48 PM | 显示全部楼层
我就是这样接的,可是就是不能run.用的是大大给我的program.我只是改了,p1=0xFF.
回复

使用道具 举报

发表于 9-3-2009 09:56 PM | 显示全部楼层
原帖由 gabrielloy 于 9-3-2009 06:48 PM 发表
我就是这样接的,可是就是不能run.用的是大大给我的program.我只是改了,p1=0xFF.


ok.你的led能run.你的program可以run.你的crystal 应该没问题。

你的lcd 的 vcc gnd到反了
vcc接5v.gnd接0v.也就是ground.
你改过后再发上来。我没试过到反接vcc/gnd。 你的lcd有可能会坏.
回复

使用道具 举报

 楼主| 发表于 9-3-2009 10:49 PM | 显示全部楼层
不好意思,画错了,是大大说的才对。我也是照大大的说法来接的
回复

使用道具 举报

发表于 9-3-2009 10:58 PM | 显示全部楼层
原帖由 gabrielloy 于 9-3-2009 10:49 PM 发表
不好意思,画错了,是大大说的才对。我也是照大大的说法来接的


这样可以画过再post上来吗?
然后post你用的program上来。
很靠近了。 加油。 你test led真的是10101010, 01010101吗?
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 9-3-2009 11:34 PM | 显示全部楼层
我用的就是下面的program,可不可以请大大帮我用个software,把program放进去circuit里,然后跑跑看有没有问题。还有就是我买ADC0804的Analog to Digital converter,要把我的sensor的analog output换成digital,可是我该怎么接呢?是sensor 的output直接接到ADC然后接到mcu的input port吗?那我需不需要在下面的program里加些input port的define?
#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;
}


[ 本帖最后由 gabrielloy 于 9-3-2009 11:59 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 9-3-2009 11:38 PM | 显示全部楼层
我的led test确实是10101010和01010101,但是input port的1不是5V,而只是2.4多而已
回复

使用道具 举报

发表于 9-3-2009 11:40 PM | 显示全部楼层
原帖由 gabrielloy 于 9-3-2009 06:48 PM 发表
我就是这样接的,可是就是不能run.用的是大大给我的program.我只是改了,p1=0xFF.


LCD 的数据线该是从 D4 ~ D7.,是画错还是接错?
回复

使用道具 举报

 楼主| 发表于 9-3-2009 11:46 PM | 显示全部楼层
还有我的一个朋友也是做lcd display的,他告诉我说在我的program里面的check busy flag,这个subfunction会令到mcu 一直在check lcd busy而program会停在那里,不会loop,所以他说还是不要用check busy flag比较好。他说他之前也是用4 bits mode,at89s52,也是check busy flag,也是遇到和我同样的问题,就是lcd不会run,一排黑色的格子。后来他换成了8 bits mode,没有用check busy flag,问题就解决了。那fritzlizt大大认为呢?我实在是找不出事什么问题,只好求救请教fritzlizt大大了。
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 8-1-2025 01:16 PM , Processed in 0.120951 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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