佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: gabrielloy

问问关于atmelAT89c51的program问题!

[复制链接]
 楼主| 发表于 26-3-2009 08:32 PM | 显示全部楼层
真的没有人可以帮忙了吗?
回复

使用道具 举报


ADVERTISEMENT

发表于 26-3-2009 09:57 PM | 显示全部楼层
浪费你的cpu 资源了。
你的delay function, called 了, 那么你的 cpu 浪费多少cycle ?
你有 1 ms 的时间, 那么你会选择浪费还是做其他东西?
比如说你电话没有电, 那么你要拿去charge. 用3 小时。 那么你那个3 小时你会作其他东西? 还是那边看着你电话charge 满才作其他东西?
回复

使用道具 举报

 楼主| 发表于 26-3-2009 10:25 PM | 显示全部楼层
可是我必须要delay啊。我这样做是为了要generate两个pulse脉冲来给我的sensor,main function里我觉得先跑了interrupt,generate了两个pulse给我的sensor去on我的sensor,然后当我的sensor一有pulse就会on一秒,check看看有没有东西detect,如果有detect到,就会send 一个output 5V,然后我的mcu就会control我的buzzer,led还有display 东西了。响了10秒,buzzer就停,然后又重来。那我这样子写对不对?
回复

使用道具 举报

 楼主| 发表于 27-3-2009 02:38 AM | 显示全部楼层
我又改了改program,然后用compiler来compile没问题,不知run的到没有!!每天试试,不好意思在次麻烦哪位大大可以帮帮我看看吗?还请大大说说这样的program会有怎样的效果呢,等我明天test了circuit,再来看看大大的分析,谢谢!!千万句拜托了
#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 input = P1^0;
sbit b = P0^0;
sbit air_con = P0^1;
sbit wdw= P0^2;
sbit pulse1 = P1^1;
sbit pulse2 = P1^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);
void External_INT0 (void);

int main (void)
{
        system_init ();
        External_INT0 ();
        while (1){
                if (input == 1){
                        b = 0;
                        air_con = 1;   
                        wdw = 0;
                        lcd_print ("CO inside car in\n unhealthy level");
                        delay_ms(10000);
                        b = 1;
                        delay_ms(3000);          
                }
                else{
                        b = 1;
                        air_con = 0;
                        wdw = 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;
}

void External_INT0 (void)
{
       
        pulse2 = 1;
        pulse1 = 1;
        delay_ms(5);
        pulse2 = 0;
        delay_ms(9);
        pulse1 = 0;
        delay_ms(986);
               
               
}
回复

使用道具 举报

发表于 28-3-2009 09:30 PM | 显示全部楼层
你要用什么来generate interrupt?
single pulse? continous pulse?
你的方法我不知道对还是错。因为我不懂你要怎样generate pulse
回复

使用道具 举报

 楼主| 发表于 29-3-2009 01:42 AM | 显示全部楼层
那我想问问要怎样写program,才会generate像下面的两个pulse呢?我不是没有写,只是写了,烧进取mcu了跑不了。就好像下面这样,我写的program用来generate pulse的,不知对不对?
void External_INT0 (void)
{
       pulse2 = 1;     //pulse2 我把它set成是 89c51里面的port 1^2, 等于1是让它成为5V
        pulse1 = 1;     //pulse1 我把它set成是 89c51里面的port 1^1, 等于1是让它成为5V
        delay_ms(5);  //delay 的sub-function我用下面的,这样写可以5ms
        pulse2 = 0;     //5ms后,就set pulse2=0
        delay_ms(9);  //在delay 9ms
        pulse1 = 0;      //delay 9 ms后,才set pulse1=0
        delay_ms(986);  //然后又delay 986ms
}
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;
        }
}
               
               
就是这两个pulse,一个Vc,一个VH,不知道我写的program,到底对不对呢?fritzlizt大大,可以尽快恢复我吗?下个星期,就是叫project的期限了!!!很迫切!!!拜托了
回复

使用道具 举报

Follow Us
 楼主| 发表于 29-3-2009 01:45 AM | 显示全部楼层
Vh的pulse是4.8V 14ms,然后0V 986ms.
Vc的pulse是5V 5ms,然后0V 995ms
回复

使用道具 举报

发表于 29-3-2009 10:59 PM | 显示全部楼层
原帖由 gabrielloy 于 29-3-2009 01:45 AM 发表
Vh的pulse是4.8V 14ms,然后0V 986ms.
Vc的pulse是5V 5ms,然后0V 995ms


首先, 你懂你要怎样read你的sensor吗?
pwm和你的sensor有什么关系?
我看得你给你那一面。似乎不是这样简单。
回复

使用道具 举报


ADVERTISEMENT

发表于 29-3-2009 11:06 PM | 显示全部楼层

回复 167# gabrielloy 的帖子

很关键的一个问题, 我是不会89c51,请问楼主用的MCU 有ADC吗?
如果没有, 要怎样读CO sensor 的analog voltage?
回复

使用道具 举报

 楼主| 发表于 29-3-2009 11:30 PM | 显示全部楼层
我也知道没有这么简单,但是没办法了。最主要是先generate,两个pulse,用来给我的sensor circuit操作,就像下面的图,
回复

使用道具 举报

 楼主| 发表于 29-3-2009 11:38 PM | 显示全部楼层
89c51好像没有ADC build in的, fritzlizt大大我说的对吗? 我有买了一个ADC0804的IC chip, 不过我从网上看到也可以用555timer来做ADC,http://www.bobblick.com/techref/projects/a2d555/a2d555.html
回复

使用道具 举报

发表于 30-3-2009 11:53 AM | 显示全部楼层
原帖由 gabrielloy 于 29-3-2009 11:38 PM 发表
89c51好像没有ADC build in的, fritzlizt大大我说的对吗? 我有买了一个ADC0804的IC chip, 不过我从网上看到也可以用555timer来做ADC,http://www.bobblick.com/techref/projects/a2d555/a2d555.html


你的pulse是要synchronize的吧?
还有什么detection point之类的。好像不能随便两个pulse就搞定了。
先解释这一part.我不明白。

一步一步来。先知道sensor怎样work把。
adc先不要想。555 timer更不用想。
要一步登天,跌下来包你死。
回复

使用道具 举报

 楼主| 发表于 30-3-2009 11:58 PM | 显示全部楼层
那个detection point的意思是,如果要实现sensor的最佳传感特性,sensor的ouput,应该是测量Vc这个5V pulse的5毫秒的中点的值。也就是说拿5V Vc在2.5ms的value当output,这个sensor的操作才会是最佳的操作。但是没有的话,也应该没有多大问题
两个pulse应该是同步的
回复

使用道具 举报

 楼主| 发表于 31-3-2009 02:17 PM | 显示全部楼层
现在我的整个project就差不多剩下这一sensor的操作部分了,programming用来display LCD,响buzzer还有两led的部分都可以了。基本的提供5V电压的电路也没有问题。
剩下的就是这个一直很让我头痛的sensor circuit。第一点:我要怎样才可以产生像166楼的那两个脉冲呢?用555 timer可以吗?我是用过555timer来产生脉冲,但是所产生出来的,我用oscilloscope来看,并不是我要的。我使用了以下的电路图,我用R1= 300k,R2=3.9k,C=4.7uF,我也用公式算过了,这样接会产生1Hz的pulse.我想问问,这个电路所指的1Hz pulse,是不是指这个脉冲会维持5V,1秒的时间?


我也用过写program的方法用microcontroller来产生pulse,就好像第159楼的那个program那样,但是用oscilloscope来看,也是看不出来是什么,好像也不对。所以还请各位大大可以帮帮忙,告诉我用什么方法才可产生像166楼的脉冲?
第二点:就是关于sensor的analogue output的问题,sensor的analogue output我需要用ADC converter来convert后才input给microcontroller吗?还是可以用类似这个网站的方法,http://www.bobblick.com/techref/projects/a2d555/a2d555.html用555timer来当作一个ADC converter,当我的sensor的analogue output进到这个555timer的时候,output出来会是0或1(5V)呢?其实comparator的做法也是一样的,不是吗?所以我要知道sensor on还是off的话,其实用comparator就可以了?应该不需要用到ADC0804的IC chip吧?因为我只是要把sensor的output当作我的microcontroller的input,当output是1(也就是5V)的时候,就会产生效果。

[ 本帖最后由 gabrielloy 于 31-3-2009 02:19 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 1-4-2009 06:13 PM | 显示全部楼层
我想问问fritzlizt大大,之前你帮我modify的program,delay会是几秒?因为我的pulse是generate出来了,电压的值amplitude是5V对了,但是period不对,好像是2ms.
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;
        }
}
我根据下面的算法,算到如果我用的crystal是12MHz的话,我的pulse的宽会是2ms.

12M/12=1M, 1/1M=1us, 然后大大的TRO和TLO是FC18, 所以是FFFF-FC18=999(10进值),999+1=1000,然后1000*1us=1ms,所以总的T是2*1ms=2ms
回复

使用道具 举报

发表于 5-4-2009 12:52 AM | 显示全部楼层
原帖由 gabrielloy 于 1-4-2009 06:13 PM 发表
我想问问fritzlizt大大,之前你帮我modify的program,delay会是几秒?因为我的pulse是generate出来了,电压的值amplitude是5V对了,但是period不对,好像是2ms.
void system_init (void)
{
        P0 = 0xFF;     ...


你的program怎么写?
看看你的pulse generation。
我的delay 是1ms的,给12mhz xtal。没错
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 5-4-2009 05:46 PM | 显示全部楼层
我想问问at89c51可不可以用analogue input。就好像我的sensor output是5V 或小过5V的analogue voltage,可以直接进at89c51的input port呢?因为在program里,我写的是if input == 1, 就作以下动作,else就做别的动作。如果按我的program这样,当我的sensor 的analogue output 2.5V进来的时候,8051会不会有反应?因为我的sensor是没有detect的时候output是5V,当detect到后,output会开始下降,gas 的浓度是100ppm(0.1%) 的时候,output就会是2.5V.
回复

使用道具 举报

发表于 5-4-2009 06:07 PM | 显示全部楼层
原帖由 gabrielloy 于 5-4-2009 05:46 PM 发表
我想问问at89c51可不可以用analogue input。就好像我的sensor output是5V 或小过5V的analogue voltage,可以直接进at89c51的input port呢?因为在program里,我写的是if input == 1, 就作以下动作,else就做别的动作。 ...

最简单是用comparator IC 如LM339, 当你set 的voltage低过2.5V 就给Logic Output。
回复

使用道具 举报

发表于 5-4-2009 09:51 PM | 显示全部楼层
原帖由 gabrielloy 于 29-3-2009 01:45 AM 发表
Vh的pulse是4.8V 14ms,然后0V 986ms.
Vc的pulse是5V 5ms,然后0V 995ms


直接用delay.since你的program不是很critical.几ms不足于造成影响

on pin1;
on pin2;
delay_ms(5);
off pin 1;
delay_ms(9);
off pin 2;
你要做的东西。
回复

使用道具 举报

发表于 5-4-2009 09:52 PM | 显示全部楼层
原帖由 gabrielloy 于 5-4-2009 05:46 PM 发表
我想问问at89c51可不可以用analogue input。就好像我的sensor output是5V 或小过5V的analogue voltage,可以直接进at89c51的input port呢?因为在program里,我写的是if input == 1, 就作以下动作,else就做别的动作。 ...


用comparator.pic 大大介绍你的方法
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 7-1-2025 08:40 AM , Processed in 0.084001 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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