佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: gabrielloy

问问关于atmelAT89c51的program问题!

[复制链接]
 楼主| 发表于 9-3-2009 11:59 PM | 显示全部楼层
刚刚修正了!!不好意思
回复

使用道具 举报


ADVERTISEMENT

发表于 10-3-2009 08:01 AM | 显示全部楼层
原帖由 gabrielloy 于 9-3-2009 11:59 PM 发表
刚刚修正了!!不好意思


你的vcc怎么接pot的wiper?
vcc应该接vcc 5v.contrast接wiper才对。
你lcd vcc和cv接倒反了

busy flag和4 bit, 8 bit interface没关系。
你的lcd肯定正常吗?借你朋友的lcd来试试看。
回复

使用道具 举报

 楼主| 发表于 10-3-2009 05:57 PM | 显示全部楼层
fritzlizt大大,我的circuit run到了,可以show 我要的string了,就是“CO  inside the car in safety level",但是还有一点我不明白,那就是我的reset circuit,我接了以下的接法(注意看pin9的circuit),可是当我power on我的circuit的时候,刚开始我的lcd还会是一排的黑格没有字。但是当我把我的pin9的那条接到switch的电线拔了,也就是说pin9没有connect的时候,反而就会有字show出来了。为什么呢?
回复

使用道具 举报

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


你 C3 的值太小了,建议使用 4.7uF 比较恰当。
回复

使用道具 举报

 楼主| 发表于 10-3-2009 07:02 PM | 显示全部楼层
我已经没有用capacitor了,在reset circuit.
回复

使用道具 举报

发表于 10-3-2009 07:31 PM | 显示全部楼层
原帖由 gabrielloy 于 10-3-2009 07:02 PM 发表
我已经没有用capacitor了,在reset circuit.


哦!你知道这电容的用意没?不过没关系啦!既然没用了,那也罢。
回复

使用道具 举报

Follow Us
 楼主| 发表于 10-3-2009 08:00 PM | 显示全部楼层
不好意思,rothmans大大我还真的不是很了解这个capacitor的用意,可以请大大赐教赐教!感激不尽啊!!
回复

使用道具 举报

发表于 10-3-2009 08:07 PM | 显示全部楼层
原帖由 gabrielloy 于 10-3-2009 05:57 PM 发表
fritzlizt大大,我的circuit run到了,可以show 我要的string了,就是“CO  inside the car in safety level",但是还有一点我不明白,那就是我的reset circuit,我接了以下的接法(注意看pin9的circuit),可是当我pow ...


放一个power on reset cap下去。也就是rothman 大大讲的那个。0.1uf可能太小了。用10uf看看。



还有,你的switch 是push to on还是push to off?
你switch本来的状态是短路,按过后就开了?
还是按过后才短路的?

[ 本帖最后由 fritlizt 于 10-3-2009 08:17 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 10-3-2009 08:09 PM | 显示全部楼层
原帖由 gabrielloy 于 10-3-2009 08:00 PM 发表
不好意思,rothmans大大我还真的不是很了解这个capacitor的用意,可以请大大赐教赐教!感激不尽啊!!


它的功能是开电时,自动重组你的单片机。没了,就不能自动重组(Reset)。它的值必须像我之前说的才有效。
回复

使用道具 举报

 楼主| 发表于 10-3-2009 08:10 PM | 显示全部楼层
原来如此,我换换看!

[ 本帖最后由 gabrielloy 于 10-3-2009 08:12 PM 编辑 ]
回复

使用道具 举报

发表于 10-3-2009 08:18 PM | 显示全部楼层
原帖由 gabrielloy 于 10-3-2009 05:57 PM 发表
fritzlizt大大,我的circuit run到了,可以show 我要的string了,就是“CO  inside the car in safety level",但是还有一点我不明白,那就是我的reset circuit,我接了以下的接法(注意看pin9的circuit),可是当我pow ...


之前是什么问题?你怎么解决?
可以分享一下吗?
回复

使用道具 举报

 楼主| 发表于 10-3-2009 08:38 PM | 显示全部楼层
我啊!可以说是误打误撞得给我解决的。首先我先重新接过我的电路,接完之后试了还是不行,之后就问了一位朋友,他帮我把reset circuit的加了个switch,然后就connect 成上面的circuit,之后我就supply 电流,发觉还是不行,可是当我把我的pin9拔了,就突然间可以display了。
我还不懂为什么当我给voltage supply我的circuit的时候(我的pin9没有接),我的screen会黑黑的,然后我把pin9和switch连上又拔掉之后,我的screen就可以display了?
回复

使用道具 举报

 楼主| 发表于 10-3-2009 11:22 PM | 显示全部楼层
fritzlizt大大,如果我把program改成以下这样,我的b是代表我的buzzer也就是类似speaker这样,我的c和d代表了我要control的两样东西(用led来表示)。照这样改是不是我的p1^0有5V的时候,也就是a == 1的时候,我的p0^0,p0^1和p0^2就是run,on/off led和on 我的buzzer?
#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;
sbit b = P0^0;
sbit c = P0^1;
sbit d = P0^2;

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)
           b = 1;
           c = 1;   
           d = 0;
           lcd_print ("CO inside car in\n@danger level");
        else
           b = 0;
           c = 0;
           d = 1;
           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;
}
回复

使用道具 举报

 楼主| 发表于 11-3-2009 09:45 PM | 显示全部楼层
没有大大可以帮我吗?就差一步了,根据以上的c program,当我用keil uvision来compile的时候,出现了error。说的是main function里面的if else loop有问题,到底是什么问题呢?希望再次麻烦各位大大帮帮我。不好意思
礦ision3 Build Log
Project:
C:\Documents and Settings\Administrator\Desktop\test.uv2
Project File Date:  03/11/2009

Output:
Build target 'Target 1'
assembling STARTUP.A51...
compiling wholeprogram.c...
WHOLEPROGRAM.C(47): error C141: syntax error near 'else'
Target not created
回复

使用道具 举报

发表于 12-3-2009 12:14 AM | 显示全部楼层
int main (void)
{
        system_init ();
        while (1){
                if (a == 1)
           b = 1;
           c = 1;   
           d = 0;
           lcd_print ("CO inside car in\n@danger level");
        else
           b = 0;
           c = 0;
           d = 1;
           lcd_print ("CO inside car in\n@safety level");
        delay_ms(10);
                }

                while (1);
        return 0;
}

if else 要加{}, 不然只看下一行。
回复

使用道具 举报

 楼主| 发表于 12-3-2009 02:10 AM | 显示全部楼层
是不是这样?我用下面的program compile了,没问题了。谢谢chan1314大大!!万分感谢,还有pic大大,fritlizt大大和rothmans大大一直以来的帮忙!!
int main (void)
{
        system_init ();
        while (1){
    if (a == 1){
       b = 1;
       c = 1;   
       d = 0;
           lcd_print ("CO inside car in\n@danger level");
           }
        else{
       b = 0;
       c = 0;
       d = 1;
           lcd_print ("CO inside car in\n@safety level");
           }
        delay_ms(10);
        }

        while (1);
        return 0;
}
回复

使用道具 举报


ADVERTISEMENT

发表于 12-3-2009 10:47 AM | 显示全部楼层
原帖由 gabrielloy 于 12-3-2009 02:10 AM 发表
是不是这样?我用下面的program compile了,没问题了。谢谢chan1314大大!!万分感谢,还有pic大大,fritlizt大大和rothmans大大一直以来的帮忙!!
int main (void)
{
        system_init ();
        while  ...


可以了吗?
可以了。。。。就做summary把。 你就是第一个。 呵呵。
和大家分享分享。当然不需要formal啦。。。。要看得懂就可以了。
你project要做的东西。
你面对到的问题1。
你如何解决1。
你面对到的问题2。
你如何解决2。等等。



过后当然希望你以后可以多多上来讨论。 帮帮其他面对类似问题的人。
回复

使用道具 举报

 楼主| 发表于 12-3-2009 06:22 PM | 显示全部楼层
好的我会整理后在发贴
回复

使用道具 举报

 楼主| 发表于 13-3-2009 12:34 AM | 显示全部楼层
想再问问fritlizt大大,关于那个reset circuit,manual reset和power on reset有什么不同?如果我接的是manual reset,我的switch是normal open的,就是以下的接法,


我的switch
对我的circuit或microchip会有什么影响吗?
我用了我的switch,接了一个led.然后我接了5V,如果我没有按着switch的话,led是不会亮的,只有我按着switch的时候led才会亮。那么就上面的manual reset的circuit,那个switch button是需要这样的switch,是normal open还是normal close呢?
回复

使用道具 举报

发表于 13-3-2009 12:05 PM | 显示全部楼层
你要看你的controller 咯。 有的用high reset, 有的low.
你那个是 用high reset. 那个cap 和 resistor 就是给delay. 8051 需要最少两个machine cycle 来reset. 当你开电时,你那个reset 还是high. 直到他discharge , voltage 跌倒low 为止。 需要用多少时间, 就要看你的 mcu 多少v 是low, 然后再算, 少少数学, 电压是 exponentially decrease.
switch 是normally open. 因为你用 voltage divider , 330 和 10k.
如果按了button, 那么10k 的potential dif 比较大。 330 几乎可以忽列。
power on reset 就是看点就reset. manual reset 是, 你多一个reset button, 像你电脑那样。
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 8-1-2025 12:52 PM , Processed in 0.150068 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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