佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: gabrielloy

问问关于atmelAT89c51的program问题!

[复制链接]
 楼主| 发表于 21-2-2009 02:39 PM | 显示全部楼层
我改了一点,请大大帮我看看。
我在main function里加了,
int main (void)
{
        system_init ();
        if (a == 1)
        lcd_print ("CO inside car in\n@danger level");
        else
        lcd_print ("CO inside car in\n@safety level");
        while (1);
        return 0;
}
回复

使用道具 举报


ADVERTISEMENT

发表于 21-2-2009 07:13 PM | 显示全部楼层
原帖由 gabrielloy 于 21-2-2009 02:39 PM 发表
我改了一点,请大大帮我看看。
我在main function里加了,
int main (void)
{
        system_init ();
        if (a == 1)
        lcd_print ("CO inside car in\n@danger level");
        else
       ...


可以compile了没有????
回复

使用道具 举报

 楼主| 发表于 22-2-2009 12:07 AM | 显示全部楼层
用了keil uvision3 v8 compile了,还是有问题!一样的问题,undefine identifier
回复

使用道具 举报

发表于 22-2-2009 12:25 AM | 显示全部楼层
原帖由 gabrielloy 于 22-2-2009 12:07 AM 发表
用了keil uvision3 v8 compile了,还是有问题!一样的问题,undefine identifier


不懂为什么把code copy过来的时候那个#include <at89x51.h>不见了。
我更新了。 加<at89x51.h>在#include后面就可以了。
回复

使用道具 举报

 楼主| 发表于 22-2-2009 01:02 AM | 显示全部楼层
那我试试看!!等一下告诉你
回复

使用道具 举报

 楼主| 发表于 22-2-2009 01:12 AM | 显示全部楼层
确实是没有error了!还要麻烦一下大大,再帮我check以下program,我改的,在main function里加了一个if loop.有没有什么不对。它的结果会不会就是有一个input 5V进input port P1^0,就会display.
sbit a = P1^0;
int main (void)
{
        system_init ();
        if (a == 1)
        lcd_print ("CO inside car in\n@danger level");
        else
        lcd_print ("CO inside car in\n@safety level");
        while (1);
        return 0;
}
回复

使用道具 举报

Follow Us
 楼主| 发表于 22-2-2009 01:14 AM | 显示全部楼层
我compile了,那一个file才是hex code?我要burn进取chip里面
回复

使用道具 举报

发表于 22-2-2009 02:36 AM | 显示全部楼层
原帖由 gabrielloy 于 22-2-2009 01:14 AM 发表
我compile了,那一个file才是hex code?我要burn进取chip里面


default setting 是没有generate hex.click project->option for Target "xxx"->output->选create hex file.
过后就有了。
回复

使用道具 举报


ADVERTISEMENT

发表于 22-2-2009 02:45 AM | 显示全部楼层
原帖由 gabrielloy 于 22-2-2009 01:12 AM 发表
确实是没有error了!还要麻烦一下大大,再帮我check以下program,我改的,在main function里加了一个if loop.有没有什么不对。它的结果会不会就是有一个input 5V进input port P1^0,就会display.

sbit a = P1^0;
i ...


基本上是对的了。你的program在开电的时候检查P1^0,然后display lcd.,过后你怎样改P1^0,lcd都不会有反应。
如果你要你的program一直做检查。你就要用looping.
简单的while loop
  1. int main (void)
  2. {
  3.     system_init ();
  4.     while (1){
  5.         if (a == 1)
  6.             lcd_print ("a = 1";
  7.         else
  8.             lcd_print ("a = 0";
  9.         delay_ms(100);
  10.     }
  11.     while (1);
  12.     return 0;
  13. }
复制代码


这样当他display过后。等100ms再check and display过。
100ms你可以不要加。不过你会看到你的lcd 整天在refresh,看了不爽。
你也可以改去10ms.看你的要求。

还有要把io当input要把它set 成high.

system_init 这一行要改成P1 = 0xFF;

还有写program 的style要做好。 没有读你program的会很辛苦。
if else, for, while 的层次等.
好像这个code,可以compile.不过读的人会很tl.
  1. int main (void){system_init ();while (1){if (a == 1)lcd_print ("a = 1");elselcd_print ("a = 0");delay_ms(100);}while (1);return 0;}
复制代码

[ 本帖最后由 fritlizt 于 22-2-2009 02:51 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 22-2-2009 03:33 AM | 显示全部楼层
"还有要把io当input要把它set 成high.

system_init 这一行要改成P1 = 0xFF;"
是什么意思? system_init不是一个sub function来的吗?可以直接改成P1 = 0xFF,那就是在main function里,不是不会run system_init()这个sub function?
回复

使用道具 举报

发表于 22-2-2009 03:02 PM | 显示全部楼层
原帖由 gabrielloy 于 22-2-2009 03:33 AM 发表
"还有要把io当input要把它set 成high.

system_init 这一行要改成P1 = 0xFF;"
是什么意思? system_init不是一个sub function来的吗?可以直接改成P1 = 0xFF,那就是在main function里,不是不会ru ...


在main里面我有call这个sub function.在走完system_init过后, 才display lcd 的。。
你的c 要进修一下。 没有的话接下来会很难。
回复

使用道具 举报

 楼主| 发表于 22-2-2009 04:30 PM | 显示全部楼层
确实是需要进修一下了,呵呵!我明白了,谢谢fritzlizt大大!
回复

使用道具 举报

 楼主| 发表于 25-2-2009 08:41 PM | 显示全部楼层
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();
}
fritzlizt大大,我的program burn 进去了,但是还是跑不了,不知道为什么?可以帮帮我看看吗?我用了12MHz的crystal和2个33pF的capacitors.program里面也有写了lcd的initial,send 3次去initial LCD了。为什么还是跑不了,只是一排16bits亮,但是没有字display.

[ 本帖最后由 gabrielloy 于 25-2-2009 09:49 PM 编辑 ]
回复

使用道具 举报

发表于 26-2-2009 12:00 PM | 显示全部楼层
原帖由 gabrielloy 于 25-2-2009 08:41 PM 发表
为什么还是跑不了,只是一排16bits亮,但是没有字display.

是黑黑一片?
LCD 的Pin 3, contrast 有调对吗?
回复

使用道具 举报

 楼主| 发表于 26-2-2009 04:21 PM | 显示全部楼层
对对,pic大大,就是只有上面一排黑黑的格,下面一排什么都没有!
LCD的pin3 我接去ground了,这是我burn进取的c 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;
}
可以帮帮我看看program吗?pic大大,真的很紧急了,拜托了。我的circuit接法和之前第一面的fritzlizt的一样。我用了33pF的capacitors.

回复

使用道具 举报

发表于 26-2-2009 05:05 PM | 显示全部楼层
原帖由 gabrielloy 于 26-2-2009 04:21 PM 发表
对对,pic大大,就是只有上面一排黑黑的格,下面一排什么都没有!
LCD的pin3 我接去ground了,这是我burn进取的c program,
#include

#define     CLR_DISP                      0x01      
#define     DISP_ ...


schematics呢?
先检查hardware没问题。才来看program.
回复

使用道具 举报


ADVERTISEMENT

发表于 26-2-2009 05:13 PM | 显示全部楼层
原帖由 gabrielloy 于 26-2-2009 04:21 PM 发表
就是只有上面一排黑黑的格,下面一排什么都没有!
LCD的pin3 我接去ground了,

pin 3 不可以接ground。

pin 3 要接 1K~10K 的VR。
回复

使用道具 举报

 楼主| 发表于 26-2-2009 05:58 PM | 显示全部楼层
也就是说pin1接GND,pin2接5V,pin3接1K~10Kresistor,然后接5V的voltage regulator output?那pin4,5,6的接法呢是不是和下面的一样?还有pin9是直接接GND还是接5V?
回复

使用道具 举报

发表于 26-2-2009 07:40 PM | 显示全部楼层
原帖由 gabrielloy 于 26-2-2009 05:58 PM 发表
也就是说pin1接GND,pin2接5V,pin3接1K~10Kresistor,然后接5V的voltage regulator output?那pin4,5,6的接法呢是不是和下面的一样?还有pin9是直接接GND还是接5V?
http://i697.photobucket.com/albums/vv334/zicoloy/ ...


paiseh,忘了跟你讲。 有些接ground是可以work的。
有些不能。 因为maximum contrast会导致他黑黑一片。
跟pic斑竹的解法就对了
回复

使用道具 举报

 楼主| 发表于 26-2-2009 10:08 PM | 显示全部楼层
pic大大说的“pin 3 要接 1K~10K 的VR“,VR是指voltage regulator吗?
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 8-1-2025 01:13 PM , Processed in 0.146199 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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