Thông báo

Collapse
No announcement yet.

XIN CODE HIỆN SỐ LẦN BẤM NÚT LÊN LCD- ai giúp e với ak

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • XIN CODE HIỆN SỐ LẦN BẤM NÚT LÊN LCD- ai giúp e với ak

    đã thử viết nhưng k thành công,ai có thể cho e xin đoạn code hiện số lần bấm nút lên LCD dùng keilc đc không ak
    đọc cmt nên e up bài của e lên để mọi ng nghiên cứu,thảo luận sửa giúp e với
    - đề tài là mạch đo nhiệt độ co nút set mức nhiệt độ báo động
    e đã hoàn thành xong phần đo nhiệt độ và hiển thị
    - phần mức cảnh báo :nếu e gán giá trị trực tiếp là 1 hằng số thì hoạt động tốt
    nhưng nếu gán thành biến x và dùng 2 chân p2.5 và p2.6 làm 2 nút tăng giảm giá trị x để so sánh đưa ra cảnh báo thì lại không hoạt động,và e không hiển thị được giá trị x lên lcd
    code đây ak,file mach bên dưới đấy ạ
    #include<stdio.h>
    #include<reg51.h>
    sbit DQ = P2^0;
    sbit hot = P3^1;
    sbit good = P3^0;
    sbit tang = P2^5;
    char readdata[2];
    unsigned int t1,nhietdo,x;
    // Khai bao cho LCD --
    sbit RS = P2^3;
    sbit RW = P2^2;
    sbit EN = P2^1;
    #define lcd_PORT P1
    //===========================
    void delay_ms1(int n)
    {
    int k,j;
    for(k=0;k<n;k++)
    {
    for(j=0;j<500;j++);
    }
    }
    //==========================
    void delay_5ms(){
    int i,j;
    for(i=0;i<250;i++)
    for(j=0;j<4;j++){}
    }
    //===========================
    void delay_15ms(){
    int i,j;
    for(i=0;i<250;i++)
    for(j=0;j<100;j++){}
    }
    //CT con ghi du lieu len LCD
    void lcd_command(unsigned char c)
    {
    RS=0;
    RW=0;
    lcd_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
    }
    //CT con doc du lieu tu LCD
    void lcd_data(unsigned char c)
    {
    RS=1;
    lcd_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
    }

    //===============================
    void lcd_init() // Khoi tao LCD
    {
    delay_15ms();
    lcd_command(0x38);
    lcd_command(0x0C);
    lcd_command(0x01); // Xoa man hinh LCD
    }
    //=============================
    void lcd_putsf(unsigned char *s)
    {
    while (*s)
    {
    lcd_data(*s);
    s++;
    }
    }

    //------------------DS18b20---------------------------------------------------------------------
    void DelayUs(int us)
    {
    int i;
    for (i=0; i<us; i++);
    }
    // Reset DS1820
    bit ResetDS1820(void)
    {
    bit presence;
    DQ = 0; //pull DQ line low
    DelayUs(29); // leave it low for about 490us
    DQ = 1; // allow line to return high
    DelayUs(3); // wait for presence 55 uS
    presence = DQ; // get presence signal
    DelayUs(25); // wait for end of timeslot 316 uS
    return(presence); // presence signal returned
    } // 0=presence, 1 = no part
    // Doc 1 bit tu DS18s20
    unsigned char ReadBit(void)
    {
    unsigned char i;
    DQ = 0; // pull DQ low to start timeslot
    DQ=1;
    for (i=0; i<3; i++); // delay 17 us from start of timeslot
    return(DQ); // return value of DQ line
    }
    // viet 1 bit vao DS1820
    void WriteBit(char bitval)
    {
    DQ=0;
    if(bitval==1)
    DQ = 1;
    DelayUs(5); // delay about 39 uS
    DQ = 1;
    }

    //-----------------------------------------
    // Doc 1 byte tu DS1820
    //-----------------------------------------
    unsigned char ReadByte(void)
    {
    unsigned char i;
    unsigned char value = 0;
    for (i=0;i<8;i++)
    {
    if(ReadBit()) value|=0x01<<i;
    DelayUs(6);
    }
    return(value);
    }
    // viet 1 byte tu ds1820
    void WriteByte(char val)
    {
    unsigned char i;
    unsigned char temp;

    for (i=0; i<8; i++) // writes byte, one bit at a time
    {
    temp = val>> i;
    temp &=0x01;
    WriteBit(temp);
    }
    DelayUs(5);
    }
    // Doc nhiet do thuc
    void ReadTemp(void)
    {
    int k;
    int thap, cao=0;
    ResetDS1820();
    WriteByte(0xcc); // skip ROM
    WriteByte(0x44); // perform temperatur conversion
    while (ReadByte()==0xff); // wait for conversion complete
    ResetDS1820();
    WriteByte(0xcc); // skip ROM
    WriteByte(0xbe); // read the result
    for (k=0; k<9; k++) // read 9 bytes but, use only one byte
    {
    readdata[k]=ReadByte(); // read DS1820
    }
    thap = readdata[0];
    cao = readdata[1];
    readdata[1]=readdata[1]<<4;
    readdata[1]=readdata[1] & 0x70;
    thap=readdata[0];
    thap=thap>>4;
    thap=thap & 0x0f;
    readdata[1]=readdata[1] | thap;
    thap=2;
    t1=readdata[1];
    } // 0=presence, 1 = no part
    // Ham hien thi nhiet do
    void HienThi_ADC(unsigned char so)
    {
    if ( so<100)
    {
    //lcd_data(t/100+48);
    lcd_data(((so/10)%10)+48);
    lcd_data(so%10+48);
    }
    else
    {
    lcd_data(so/100+48);
    lcd_data(((so/10)%10)+48);
    lcd_data(so%10+48);
    }
    }
    //=============================================
    //-------------------------------------------- }
    //--------------------------------------------
    void canhbao (void)
    { if (t1 >= 20)
    { hot = 1;
    delay_ms1(40);
    hot = 0;
    delay_ms1(40);
    lcd_init();
    IE=0XAF;
    IT0=1;
    lcd_command(0x01);
    lcd_command(0x83);
    lcd_putsf ("* CANH BAO *");
    delay_ms1(110);

    }
    else {good = 1;
    delay_ms1(200);
    good = 0;
    delay_ms1(200);
    }
    }
    void main (void)
    {
    lcd_init();

    IE=0XAF;
    IT0=1;
    lcd_command(0x01);
    lcd_command(0x80);
    lcd_putsf ("HANOI");
    lcd_command(0xC0);
    lcd_putsf ("2/12/2012");
    lcd_command(0x01);
    while(1)
    {
    canhbao();
    lcd_command(0x80);
    lcd_putsf("DHDL PHUONG DONG");
    lcd_command(0xC0);
    lcd_putsf("Nhiet do: ");
    ReadTemp();
    nhietdo = t1;
    HienThi_ADC(nhietdo);
    lcd_command(0xc0+13);
    lcd_putsf("oC ");
    delay_ms1(20);
    }
    }

    mach code.zip
    Last edited by soccon_yeu; 17-12-2012, 21:07.

  • #2
    Theo mình nghĩ thì với yêu cầu của bạn thì sẽ chẳng ai ngồi viết code cho bạn đâu.
    Mình nghĩ là bạn nên đưa đoạn code đó lên thì mọi người sẽ cùng phân tích để chỉ ra chỗ sai cho bạn,cũng như là sẽ xây dựng giải thuật cho bạn.
    |

    Comment


    • #3
      up...............

      Comment


      • #4
        up.............

        Comment


        • #5
          có gì khó đâu nhỉ, lúc khởi động thì gáng giá trị mặc định. nếu có chỉnh (bấm nút tăng hoặc giảm) thì tăng giảm giá trị x theo yêu cầu thôi. rồi lại hiển thị lên LCD giống như hiển thị LCD cái nhiệt độ bạn đo được thôi.

          Comment


          • #6
            vâng nge thì có vẻ dễ nhưng màv vbawts tay vào làm thì lại báo mấy lỗi lận
            cvhar biết phải thêm bớt ntn nữa ak

            Comment


            • #7
              up huhu.....

              Comment


              • #8
                Bạn nên đưa ra thuật toán rồi code sai chỗ nào thì đưa ra.Mà code bạn tự viết đây hả?nghi lắm đó..theo mình nên set nhiệt đọ là 1 hằng số rồi dùng ngắt ngoài là ô kê con đê.
                unsigned int set_temp;
                void main ()
                {
                IE=....;
                IP=...'
                IT=...;
                }
                void ngat () onterrupt 0
                {
                set_temp++;
                }
                tương tự với ngắt kia
                chúc may mắn

                Comment


                • #9
                  Dùng ngắt đi bạn, mình dùng 2 ngắt tăng giảm đó, OK luôn. thử nhé. Nói thật chứ nhìn code của bạn kồng kềnh quá, chẳng chịu lập trình cấu trúc gì cả. Cái hàm LCD thì có đầy đó mà không sử dụng, mỗi lần làm viết lại hoài rất mất thời gian.

                  #include<stdio.h>
                  #include<reg51.h>
                  sbit DQ = P2^0;
                  sbit hot = P3^1;
                  sbit good = P3^0;
                  sbit tang = P2^5;
                  char readdata[2];
                  unsigned int t1,nhietdo,x, temp = 20;
                  // Khai bao cho LCD --
                  sbit RS = P2^3;
                  sbit RW = P2^2;
                  sbit EN = P2^1;
                  #define lcd_PORT P1
                  //===========================
                  void delay_ms1(int n)
                  {
                  int k,j;
                  for(k=0;k<n;k++)
                  {
                  for(j=0;j<500;j++);
                  }
                  }
                  //==========================
                  void delay_5ms(){
                  int i,j;
                  for(i=0;i<250;i++)
                  for(j=0;j<4;j++){}
                  }
                  //===========================
                  void delay_15ms(){
                  int i,j;
                  for(i=0;i<250;i++)
                  for(j=0;j<100;j++){}
                  }
                  void delay_1s()
                  {
                  int i;
                  for(i=0;i<70;i++)
                  {delay_15ms();}
                  }
                  //CT con ghi du lieu len LCD
                  void lcd_command(unsigned char c)
                  {
                  RS=0;
                  RW=0;
                  lcd_PORT=c;
                  EN=1;
                  EN=0;
                  delay_5ms();
                  }
                  //CT con doc du lieu tu LCD
                  void lcd_data(unsigned char c)
                  {
                  RS=1;
                  lcd_PORT=c;
                  EN=1;
                  EN=0;
                  delay_5ms();
                  }

                  //===============================
                  void lcd_init() // Khoi tao LCD
                  {
                  delay_15ms();
                  lcd_command(0x38);
                  lcd_command(0x0C);
                  lcd_command(0x01); // Xoa man hinh LCD
                  }
                  //=============================
                  void lcd_putsf(unsigned char *s)
                  {
                  while (*s)
                  {
                  lcd_data(*s);
                  s++;
                  }
                  }

                  //------------------DS18b20---------------------------------------------------------------------
                  void DelayUs(int us)
                  {
                  int i;
                  for (i=0; i<us; i++);
                  }
                  // Reset DS1820
                  bit ResetDS1820(void)
                  {
                  bit presence;
                  DQ = 0; //pull DQ line low
                  DelayUs(29); // leave it low for about 490us
                  DQ = 1; // allow line to return high
                  DelayUs(3); // wait for presence 55 uS
                  presence = DQ; // get presence signal
                  DelayUs(25); // wait for end of timeslot 316 uS
                  return(presence); // presence signal returned
                  } // 0=presence, 1 = no part
                  // Doc 1 bit tu DS18s20
                  unsigned char ReadBit(void)
                  {
                  unsigned char i;
                  DQ = 0; // pull DQ low to start timeslot
                  DQ=1;
                  for (i=0; i<3; i++); // delay 17 us from start of timeslot
                  return(DQ); // return value of DQ line
                  }
                  // viet 1 bit vao DS1820
                  void WriteBit(char bitval)
                  {
                  DQ=0;
                  if(bitval==1)
                  DQ = 1;
                  DelayUs(5); // delay about 39 uS
                  DQ = 1;
                  }

                  //-----------------------------------------
                  // Doc 1 byte tu DS1820
                  //-----------------------------------------
                  unsigned char ReadByte(void)
                  {
                  unsigned char i;
                  unsigned char value = 0;
                  for (i=0;i<8;i++)
                  {
                  if(ReadBit()) value|=0x01<<i;
                  DelayUs(6);
                  }
                  return(value);
                  }
                  // viet 1 byte tu ds1820
                  void WriteByte(char val)
                  {
                  unsigned char i;
                  unsigned char temp;

                  for (i=0; i<8; i++) // writes byte, one bit at a time
                  {
                  temp = val>> i;
                  temp &=0x01;
                  WriteBit(temp);
                  }
                  DelayUs(5);
                  }
                  // Doc nhiet do thuc
                  void ReadTemp(void)
                  {
                  int k;
                  int thap, cao=0;
                  ResetDS1820();
                  WriteByte(0xcc); // skip ROM
                  WriteByte(0x44); // perform temperatur conversion
                  while (ReadByte()==0xff); // wait for conversion complete
                  ResetDS1820();
                  WriteByte(0xcc); // skip ROM
                  WriteByte(0xbe); // read the result
                  for (k=0; k<9; k++) // read 9 bytes but, use only one byte
                  {
                  readdata[k]=ReadByte(); // read DS1820
                  }
                  thap = readdata[0];
                  cao = readdata[1];
                  readdata[1]=readdata[1]<<4;
                  readdata[1]=readdata[1] & 0x70;
                  thap=readdata[0];
                  thap=thap>>4;
                  thap=thap & 0x0f;
                  readdata[1]=readdata[1] | thap;
                  thap=2;
                  t1=readdata[1];
                  } // 0=presence, 1 = no part
                  // Ham hien thi nhiet do
                  void HienThi_ADC(unsigned char so)
                  {
                  if ( so<100)
                  {
                  //lcd_data(t/100+48);
                  lcd_data(((so/10)%10)+48);
                  lcd_data(so%10+48);
                  }
                  else
                  {
                  lcd_data(so/100+48);
                  lcd_data(((so/10)%10)+48);
                  lcd_data(so%10+48);
                  }
                  }
                  //=============================================
                  //-------------------------------------------- }
                  //--------------------------------------------
                  void canhbao (void)
                  {
                  if (t1 >= temp)
                  {
                  hot = 1;
                  delay_ms1(40);
                  hot = 0;
                  delay_ms1(40);
                  lcd_init();
                  IE=0XAF;
                  IT0=1;
                  lcd_command(0x01);
                  lcd_command(0x83);
                  lcd_putsf ("* CANH BAO *");
                  delay_ms1(110);

                  }
                  else
                  {
                  good = 1;
                  delay_ms1(200);
                  good = 0;
                  delay_ms1(200);
                  }
                  }

                  void f1(void) interrupt 0
                  {
                  temp++;
                  lcd_command(0x01);
                  lcd_command(0x80);
                  lcd_putsf ("T DAT:");
                  lcd_command(0x86);
                  HienThi_ADC(temp);
                  delay_ms1(40);
                  }

                  void f2(void) interrupt 2
                  {
                  temp--;
                  lcd_command(0x01);
                  lcd_command(0x80);
                  lcd_putsf ("T DAT:");
                  lcd_command(0x86);
                  HienThi_ADC(temp);
                  delay_ms1(40);
                  }

                  void main (void)
                  {
                  EA = 1, EX1 = 1, EX0 = 1;
                  IT1 = 1, IT0 = 1;

                  lcd_init();

                  IE=0XAF;
                  IT0=1;
                  lcd_command(0x01);
                  lcd_command(0x80);
                  lcd_putsf ("HANOI");
                  lcd_command(0xC0);
                  lcd_putsf ("2/12/2012");
                  lcd_command(0x01);
                  while(1)
                  {
                  canhbao();
                  lcd_command(0x80);
                  lcd_putsf("DHDL PHUONG DONG");
                  lcd_command(0xC0);
                  lcd_putsf("Nhiet do: ");
                  ReadTemp();
                  nhietdo = t1;
                  HienThi_ADC(nhietdo);
                  lcd_command(0xc0+13);
                  lcd_putsf("oC ");
                  delay_ms1(20);
                  }
                  }

                  Comment


                  • #10
                    m mới chuyển sang hc 89 nên hơi ngu tý,vsai sót nhiều nên mới nhờ mọi ng giúp đỡ mà
                    thaks

                    Comment


                    • #11
                      ok rồi.thank ban [MENTION=152938]vothienso01[/MENTION] nhiều hn đi cafe nhá
                      Last edited by soccon_yeu; 24-12-2012, 13:18.

                      Comment

                      Về tác giả

                      Collapse

                      soccon_yeu Tìm hiểu thêm về soccon_yeu

                      Bài viết mới nhất

                      Collapse

                      Đang tải...
                      X