找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4154|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

快瘋了!新手求幫忙寫個電子時(shí)鐘的程序,實(shí)在寫不來了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:119032 發(fā)表于 2016-5-9 23:01 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
15黑幣
單片機(jī)用的是STC89C52RC,晶振為24M。DS1302時(shí)鐘+DS18B20+LCD12864顯示,四按鍵操作(設(shè)置鍵+加減+減鍵+復(fù)位鍵),要求實(shí)現(xiàn)萬年歷和溫度顯示,可調(diào)鬧鐘及時(shí)間等。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:117574 發(fā)表于 2016-5-9 23:08 來自手機(jī) | 只看該作者
查論壇里

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

板凳
ID:119032 發(fā)表于 2016-5-9 23:16 | 只看該作者
圖片怎么上傳啊。。
回復(fù)

使用道具 舉報(bào)

地板
ID:119032 發(fā)表于 2016-5-9 23:18 | 只看該作者
與你飲冰 發(fā)表于 2016-5-9 23:16
圖片怎么上傳啊。。

各部分引腳圖在我相冊里,希望大神能幫我看一下,感激不盡!
回復(fù)

使用道具 舉報(bào)

5#
ID:119032 發(fā)表于 2016-5-9 23:20 | 只看該作者
各部分原理圖和引腳在我的相冊里,希望有大神能幫我看下,感激不盡!
回復(fù)

使用道具 舉報(bào)

6#
ID:119032 發(fā)表于 2016-5-9 23:21 | 只看該作者

我照著修改了些,可是LCD老是只有背光卻顯示不出字來!
回復(fù)

使用道具 舉報(bào)

7#
ID:119744 發(fā)表于 2016-5-10 11:34 | 只看該作者
一、本次實(shí)驗(yàn)所需器材

1、Arduino板

2、1602液晶板:也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點(diǎn)陣型液晶模塊。它由若干個5X7或者5X11等點(diǎn)陣字符位組成,每個點(diǎn)陣字符位都可以顯示一個字符,每位之間有一個點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形。目前,盡管各廠家對其各自產(chǎn)品命名不盡相同,但均提供幾乎都同樣規(guī)格的1602模塊或者兼容模塊。1602最初采用的LCD控制器是HD44780,在各廠家生產(chǎn)的1602模塊中,基本上也都采用了與之兼容的控制IC,所以從特性上基本上是一樣的。因此,我們買到的1602模塊,在端口標(biāo)記上可能有所不同,有的從左向右,有的從右向左,但特性上是一樣的。本實(shí)驗(yàn)中使用的1602板,最里面的孔為1號,最靠近邊上的那個為16號。

1602實(shí)物圖片:

1

1602的規(guī)格情況:
顯示容量         16*2個字符
芯片工作電壓         4.5-5.5V
工作電流         2,0MA(5.0V)
模塊最佳工作電壓         5.0V
字符尺寸         2.95*4.35(WXH)mm

1602管腳介紹:

第1腳:VSS為電源負(fù)極

第2腳:VCC接5V電源正極

第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時(shí)對比度最弱,接地電源時(shí)對比度最高(對比度過高時(shí)會產(chǎn)生“鬼影”,使用時(shí)可以通過一個10K的電位器調(diào)整對比度,本實(shí)驗(yàn)使用了一個1KΩ電阻)。

第4腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。

第5腳:RW為讀寫信號線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作。

第6腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令。

第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。

第15~16腳:背燈電源。15腳背光正極,16腳背光負(fù)極。

1602字符集介紹:

      1602液晶模塊內(nèi)部的字符發(fā)生存儲器已經(jīng)存儲了160個不同的點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來,我們就能看到字母“A”。

     1602的16進(jìn)制ASCII碼表地址可從百度搜索,這里不在列出,只寫用法。如:感嘆號!的ASCII為0x21,字母B的ASCII為0x42。

1602指令集:

image

3、電阻:1KΩ(1個)

4、杜邦線:若干

5、面包板:一個
二、8位連接法實(shí)驗(yàn)







1、硬件連接方式1602-8_bb

2、代碼:
復(fù)制代碼

int DI = 12;
    int RW = 11;
    int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用數(shù)組來定義總線需要的管腳
    int Enable = 2;
     
    void LcdCommandWrite(int value) {
    // 定義所有引腳
    int i = 0;
    for (i=DB[0]; i <= DI; i++) //總線賦值
    {
       digitalWrite(i,value & 01);//因?yàn)?602液晶信號識別是D7-D0(不是D0-D7),這里是用來反轉(zhuǎn)信號。
       value >>= 1;
    }
    digitalWrite(Enable,LOW);
    delayMicroseconds(1);
    digitalWrite(Enable,HIGH);
    delayMicroseconds(1);  // 延時(shí)1ms
    digitalWrite(Enable,LOW);
    delayMicroseconds(1);  // 延時(shí)1ms
    }
     
    void LcdDataWrite(int value) {
    // 定義所有引腳
    int i = 0;
    digitalWrite(DI, HIGH);
    digitalWrite(RW, LOW);
    for (i=DB[0]; i <= DB[7]; i++) {
       digitalWrite(i,value & 01);
       value >>= 1;
    }
    digitalWrite(Enable,LOW);
    delayMicroseconds(1);
    digitalWrite(Enable,HIGH);
    delayMicroseconds(1);
    digitalWrite(Enable,LOW);
    delayMicroseconds(1);  // 延時(shí)1ms
    }
     
    void setup (void) {
    int i = 0;
    for (i=Enable; i <= DI; i++) {
       pinMode(i,OUTPUT);
    }
    delay(100);
    // 短暫的停頓后初始化LCD
    // 用于LCD控制需要
    LcdCommandWrite(0x38);  // 設(shè)置為8-bit接口,2行顯示,5x7文字大小                     
    delay(64);                     
    LcdCommandWrite(0x38);  // 設(shè)置為8-bit接口,2行顯示,5x7文字大小                        
    delay(50);                     
    LcdCommandWrite(0x38);  // 設(shè)置為8-bit接口,2行顯示,5x7文字大小                        
    delay(20);                     
    LcdCommandWrite(0x06);  // 輸入方式設(shè)定
                             // 自動增量,沒有顯示移位
    delay(20);                     
    LcdCommandWrite(0x0E);  // 顯示設(shè)置
                             // 開啟顯示屏,光標(biāo)顯示,無閃爍
    delay(20);                     
    LcdCommandWrite(0x01);  // 屏幕清空,光標(biāo)位置歸零  
    delay(100);                     
    LcdCommandWrite(0x80);  // 顯示設(shè)置
                             // 開啟顯示屏,光標(biāo)顯示,無閃爍
    delay(20);                     
    }
     
    void loop (void) {
      LcdCommandWrite(0x01);  // 屏幕清空,光標(biāo)位置歸零  
      delay(10);
      LcdCommandWrite(0x80+3);
      delay(10);                     
      // 寫入歡迎信息
      LcdDataWrite('H');
      LcdDataWrite('E');
      LcdDataWrite('L');
      LcdDataWrite('L');
      LcdDataWrite('O');
      LcdDataWrite(' ');
      LcdDataWrite('W');
      LcdDataWrite('O');
      LcdDataWrite('R');
      LcdDataWrite('L');
      LcdDataWrite('D');
      delay(10);
      LcdCommandWrite(0xc0+2);  // 定義光標(biāo)位置為第二行第二個位置  
      delay(10);
      LcdDataWrite('w');
      LcdDataWrite('i');
      LcdDataWrite('k');
      LcdDataWrite('i');
      LcdDataWrite('c');
      LcdDataWrite('o');
      LcdDataWrite('d');
      LcdDataWrite('e');
      LcdDataWrite('.');
      LcdDataWrite('n');
      LcdDataWrite('e');
      LcdDataWrite('t');
      delay(5000);
      LcdCommandWrite(0x01);  // 屏幕清空,光標(biāo)位置歸零  
      delay(10);
      LcdDataWrite('I');
      LcdDataWrite(' ');
      LcdDataWrite('a');
      LcdDataWrite('m');
      LcdDataWrite(' ');
      LcdDataWrite('x');
      LcdDataWrite('i');
      LcdDataWrite('a');
      LcdDataWrite('o');
      LcdDataWrite('w');
      LcdDataWrite('u');
      LcdDataWrite('y');
      LcdDataWrite('i');
      delay(3000);
      LcdCommandWrite(0x02); //設(shè)置模式為新文字替換老文字,無新文字的地方顯示不變。
      delay(10);
      LcdCommandWrite(0x80+5); //定義光標(biāo)位置為第一行第6個位置
      delay(10);  
      LcdDataWrite('t');
      LcdDataWrite('h');
      LcdDataWrite('e');
      LcdDataWrite(' ');
      LcdDataWrite('a');
      LcdDataWrite('d');
      LcdDataWrite('m');
      LcdDataWrite('i');
      LcdDataWrite('n');
      delay(5000);
    }

復(fù)制代碼



3、實(shí)驗(yàn)效果


三、四位連接法

4位連接法,可以省出幾個數(shù)字端口。

1、連接方法

1602-4_bb

2、代碼
復(fù)制代碼

int LCD1602_RS=12;   
    int LCD1602_RW=11;   
    int LCD1602_EN=10;   
    int DB[] = { 6, 7, 8, 9};
    char str1[]="Welcome to";
    char str2[]="wikicode.net";
    char str3[]="This is the";
    char str4[]="4-bit interface";
     
    void LCD_Command_Write(int command)
    {
    int i,temp;
    digitalWrite( LCD1602_RS,LOW);
    digitalWrite( LCD1602_RW,LOW);
    digitalWrite( LCD1602_EN,LOW);
     
    temp=command & 0xf0;
    for (i=DB[0]; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
     
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
     
    temp=(command & 0x0f)<<4;
    for (i=DB[0]; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
     
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
    }
     
    void LCD_Data_Write(int dat)
    {
    int i=0,temp;
    digitalWrite( LCD1602_RS,HIGH);
    digitalWrite( LCD1602_RW,LOW);
    digitalWrite( LCD1602_EN,LOW);
     
    temp=dat & 0xf0;
    for (i=DB[0]; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
     
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
     
    temp=(dat & 0x0f)<<4;
    for (i=DB[0]; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
     
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
    }
     
    void LCD_SET_XY( int x, int y )
    {
      int address;
      if (y ==0)    address = 0x80 + x;
      else          address = 0xC0 + x;
      LCD_Command_Write(address);
    }
     
    void LCD_Write_Char( int x,int y,int dat)
    {
      LCD_SET_XY( x, y );
      LCD_Data_Write(dat);
    }
     
    void LCD_Write_String(int X,int Y,char *s)
    {
        LCD_SET_XY( X, Y );    //設(shè)置地址
        while (*s)             //寫字符串
        {
          LCD_Data_Write(*s);   
          s ++;
        }
    }
     
    void setup (void)
    {
      int i = 0;
      for (i=6; i <= 12; i++)
       {
         pinMode(i,OUTPUT);
       }
      delay(100);
      LCD_Command_Write(0x28);//4線 2行 5x7
      delay(50);
      LCD_Command_Write(0x06);
      delay(50);
      LCD_Command_Write(0x0c);
      delay(50);
      LCD_Command_Write(0x80);
      delay(50);
      LCD_Command_Write(0x01);
      delay(50);
     
    }
     
    void loop (void)
    {
       LCD_Command_Write(0x01);
       delay(50);
       LCD_Write_String(3,0,str1);//第1行,第4個地址起
       delay(50);
       LCD_Write_String(2,1,str2);//第2行,第2個地址起
       delay(5000);
       LCD_Command_Write(0x01);//
       delay(50);
       LCD_Write_String(0,0,str3);
       delay(50);
       LCD_Write_String(0,1,str4);
       delay(5000);
     
    }

復(fù)制代碼



這里僅做了顯示字符串的方法,也可以利用LCD_Write_Char這個過程來顯示字符,如:LCD_Write_Char(1,0,0x3a)顯示“:”,這里不再舉例,在下面的時(shí)鐘的代碼中,會有所利用。

3、實(shí)現(xiàn)效果


四、利用Arduino+1602實(shí)現(xiàn)時(shí)鐘

1、硬件連接:采用四位連接法。

2、代碼
復(fù)制代碼

int LCD1602_RS=12;   
    int LCD1602_RW=11;   
    int LCD1602_EN=10;   
    int DB[] = { 6, 7, 8, 9};
    char logtxt[]="Local Time";
    char *sec[60]={"00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59"};

   
    void LCD_Command_Write(int command)
    {
    int i,temp;
    digitalWrite( LCD1602_RS,LOW);
    digitalWrite( LCD1602_RW,LOW);
    digitalWrite( LCD1602_EN,LOW);
     
    temp=command & 0xf0;
    for (i=DB[0]; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
     
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
     
    temp=(command & 0x0f)<<4;
    for (i=DB[0]; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
     
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
    }
     
    void LCD_Data_Write(int dat)
    {
    int i=0,temp;
    digitalWrite( LCD1602_RS,HIGH);
    digitalWrite( LCD1602_RW,LOW);
    digitalWrite( LCD1602_EN,LOW);
     
    temp=dat & 0xf0;
    for (i=DB[0]; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
     
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
     
    temp=(dat & 0x0f)<<4;
    for (i=DB[0]; i <= 9; i++)
    {
       digitalWrite(i,temp & 0x80);
       temp <<= 1;
    }
     
    digitalWrite( LCD1602_EN,HIGH);
    delayMicroseconds(1);
    digitalWrite( LCD1602_EN,LOW);
    }
     
    void LCD_SET_XY( int x, int y )
    {
      int address;
      if (y ==0)    address = 0x80 + x;
      else          address = 0xC0 + x;
      LCD_Command_Write(address);
    }
     
    void LCD_Write_Char( int x,int y,int dat)
    {
      LCD_SET_XY( x, y );
      LCD_Data_Write(dat);
    }
     
    void LCD_Write_String(int X,int Y,char *s)
    {
        LCD_SET_XY( X, Y );    //設(shè)置地址
        while (*s)             //寫字符串
        {
          LCD_Data_Write(*s);   
          s ++;
        }
    }
     
    void setup (void)
    {
      int i = 0;
      for (i=6; i <= 12; i++)
       {
         pinMode(i,OUTPUT);
       }
      delay(100);
      LCD_Command_Write(0x28);//4線 2行 5x7
      delay(50);
      LCD_Command_Write(0x06);
      delay(50);
      LCD_Command_Write(0x0c);
      delay(50);
      LCD_Command_Write(0x80);
      delay(50);
      LCD_Command_Write(0x01);
      delay(50);
     
    }
     
    void loop (void)
    {


       for(int index=0,minindex=59,hourindex=12;index<60;index++)   //這里來設(shè)定現(xiàn)在時(shí)間,目前設(shè)定為12:59:00

       {
         LCD_Command_Write(0x01);
         delay(50);
         LCD_Write_String(3,0,logtxt);
         LCD_Write_String(3,1,sec[hourindex]);
         LCD_Write_Char(6,1,0x3a);//顯示:
         LCD_Write_String(7,1,sec[minindex]);
         LCD_Write_Char(10,1,0x3a);
         LCD_Write_String(11,1,sec[index]);

         delay(950);
         if (index==59)
         {
           index=-1;
           minindex++;
           if (minindex==60)
           {
             minindex=0;
             hourindex++;
             if (hourindex==24)
             {
               hourindex=0;
             }
           }

         }
       }
     
    }

復(fù)制代碼

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

8#
ID:153199 發(fā)表于 2017-1-2 15:51 | 只看該作者
本論壇里有參考
回復(fù)

使用道具 舉報(bào)

9#
ID:159476 發(fā)表于 2017-1-2 23:11 | 只看該作者
我也在論壇里看到過
回復(fù)

使用道具 舉報(bào)

10#
ID:85726 發(fā)表于 2017-1-3 09:16 | 只看該作者
你用的是24M的晶振,如果說你直接找網(wǎng)上的程序直接用的話,像DS1302,DS18B20這些要求時(shí)序很嚴(yán)格的元件就很有可能出問題!請認(rèn)真查看數(shù)據(jù)手冊,和你程序中的延時(shí)時(shí)間!
回復(fù)

使用道具 舉報(bào)

11#
ID:15947 發(fā)表于 2017-1-3 10:01 | 只看該作者
去百度下人家的代碼,理解下不難的。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表