找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LCD1602倒計時程序?qū)懥艘话氩粫䦟懥耍埱髱椭?/span>

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:90857 發(fā)表于 2016-1-8 20:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 yujianli 于 2016-1-8 20:53 編輯

課設(shè)作業(yè),控制要求是:20S倒計時顯示在1602上,時間到后蜂鳴器響10S。要求倒計時時間和蜂鳴器響應(yīng)延時時間都顯示在1602上。
自己寫了一般的程序,寫的很爛...液晶屏數(shù)據(jù)和命令的函數(shù)都寫了,倒計時這個怎么實現(xiàn),數(shù)碼管的倒計時會一些,可是要怎么顯示在1602上,請大神們幫個忙!
#include<reg51.h>
//定義
#define uchar unsigned char
#define uint unsigned int

void init();
void set_POS(uchar);
void write_command(uchar);
void write_data(uchar);

sbit BUZZER=P1^0;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
bit busy_check();

uchar data TIME1_str[16]={"                "};   //第一行倒計時間
uchar data TIME2_str[16]={"                "};          //第二行延時
//延時函數(shù)
void delayMS(uint n)
{
   uint x,y;
    for(x=n;x>0;x--)
         for(y=110;y>0;y--);
}
//顯示函數(shù),在LCD上顯示字符串
void display_str(uchar* str,uchar lineno)
{
   uchar k;
   set_POS(lineno);
   for(k=0;k<16;k++)
   write_data(str[k]);
}
//1602測忙
bit busy_check()
{
        bit Result;
        RS=0;
        delayMS(5);
        RW=1;
        delayMS(5);
        LCD_EN=1;
        delayMS(5);
        Result=(bit)(P0&0x80);
        delayMS(5);
        EN=0;
        delayMS(5);
        return Result;
}
//寫指令
void write_command(uchat cmd)
{
        while(busy_check())        ;
        delayMS(5);
        RS=0;
        delayMS(5);
        RW=0;
        delayMS(5);
        EN=0;
        delayMS(5)
        P0=com;
        delayMS(5);
        EN=1;
        delayMS(5);
        EN=0;
        delayMS(5);
}
//寫數(shù)據(jù)
void write_data(uchar dat)
{
        while(busy_check());
        delayMS(5);
        RS=1;
        delayMS(5);
        RW=0;
        delayMS(5);
        EN=0;
        delayMS(5);
        P0=dat;
        delayMS(5);
        EN=1;
        delayMS(5);
        EN=0;
        delay=0;
}
void init()
{
    delayMS(5);
        write_command(0x38);
        delayMS(5);
        write_command(0x0c);
        delayMS(5);
        write_command(0x06);
        delayMS(5);
        write_command(0x01);
        delayMS(5);
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:90857 發(fā)表于 2016-1-9 00:32 | 只看該作者
已解決了~
回復(fù)

使用道具 舉報

板凳
ID:1 發(fā)表于 2016-1-9 04:01 | 只看該作者

怎么解決的 能分享一下嗎?
回復(fù)

使用道具 舉報

地板
ID:102500 發(fā)表于 2016-1-9 13:19 | 只看該作者
可以用數(shù)組,,然后判斷,,選擇數(shù)組里面的其中以為,,逐個來,,,也可以用左移右移的辦法
回復(fù)

使用道具 舉報

5#
ID:90857 發(fā)表于 2016-1-9 21:13 | 只看該作者
其實也挺簡單的,顯示函數(shù)更新就可以,程序如下:
#include<STC12C5A60S2.h>
//定義
#define uchar unsigned char
#define uint unsigned int

void init();
void set_POS(uchar);
void write_command(uchar);
void write_data(uchar);

sbit BUZZER=P2^5;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
bit busy_check();

uchar data BUF1_str[16]={"                "};   //第一行倒計時間
uchar data BUF2_str[16]={"                "};          //第二行延時
uint sec,min,rl_sec,rl_min,cnt=0,START=0;
//延時函數(shù)
void delayMS(uint n)
{
   uint x,y;
    for(x=n;x>0;x--)
         for(y=110;y>0;y--);
}
//顯示函數(shù),在LCD上顯示字符串
void display_str(uchar* str,uchar lineno)
{
   uchar k;
   set_POS(lineno);
   for(k=0;k<16;k++)
   write_data(str[k]);
}
//1602測忙
bit busy_check()
{
        bit Result;
        RS=0;
        delayMS(5);
        RW=1;
        delayMS(5);
        EN=1;
        delayMS(5);
        Result=(bit)(P0&0x80);
        delayMS(5);
        EN=0;
        delayMS(5);
        return Result;
}
void write_command(uchar cmd)
{
        while(busy_check())        ;
        delayMS(5);
        RS=0;
        delayMS(5);
        RW=0;
        delayMS(5);
        EN=0;
        delayMS(5);
        P0=cmd;
        delayMS(5);
        EN=1;
        delayMS(5);
        EN=0;
        delayMS(5);
}
//寫數(shù)據(jù)
void write_data(uchar dat)
{
        while(busy_check());
        delayMS(5);
        RS=1;
        delayMS(5);
        RW=0;
        delayMS(5);
        EN=0;
        delayMS(5);
        P0=dat;
        delayMS(5);
        EN=1;
        delayMS(5);
        EN=0;
        delayMS(5);
}
void init()
{
    delayMS(5);
        write_command(0x38);
        delayMS(5);
        write_command(0x0c);
        delayMS(5);
        write_command(0x06);
        delayMS(5);
        write_command(0x01);
        delayMS(5);
}
void set_POS(uchar position)
{
        write_command(position|0x80);
}
  //初始化定時器0
void inittimer0(void)
{
  TMOD=0X01;//定時器寄存器配置
  TH0=(65535-50000)/256;//定時50000us=50ms
  TL0=(65535-50000)%256;
  TR0=1;//啟動定時器0
  ET0=1;
  EA=1;//開總中斷
}
void main()
{
        inittimer0();//初始化定時器0
        delayMS(10);
        init();//初始化LCD
       
                BUF1_str[6]='T';
                BUF1_str[7]='I';
                BUF1_str[8]='M';
                BUF1_str[9]='E';

                BUF2_str[3]='W';
                BUF2_str[4]='A';
                BUF2_str[5]='R';
                BUF2_str[6]='N';
                BUF2_str[7]='I';
                BUF2_str[8]='N';
            BUF2_str[9]='G';
                min=0;sec=20;rl_min=0;rl_sec=10;
                START=1;
        while(1)
        {
                BUF1_str[11]=min%100/10+'0';
                BUF1_str[12]=min%10+'0';
                BUF1_str[13]=':';
                BUF1_str[14]=sec%100/10+'0';
                BUF1_str[15]=sec%10+'0';
               
                BUF2_str[11]=rl_min%100/10+'0';
                BUF2_str[12]=rl_min%10+'0';
                BUF2_str[13]=':';
                BUF2_str[14]=rl_sec%100/10+'0';
                BUF2_str[15]=rl_sec%10+'0';
               
          display_str(BUF1_str,0x00);//第一行顯示更新
          display_str(BUF2_str,0x40);//第二行顯示更新
        }
}
//定時器0中斷函數(shù)
timer0() interrupt 1
{
  TR0=0;
  TH0=(65535-50000)/256;//50000us=50ms
  TL0=(65535-50000)%256;
        if(START==1)//繼電器開啟倒計時開始
        {
    cnt++;
    if(cnt>=20)//20*50ms=1s
    {
      cnt=0;
            sec--;
            if(sec==0)
            {
                                sec=59;
                          min--;
                                if(min>250)
                                {
                                        START=2;
                                        sec=0;
                                        min=0;
                                        BUZZER=0;//開啟蜂鳴器
                                        cnt=0;
                                }
                  }
                }
  }
        if(START==2)//繼電器延時倒計時開始
        {
    cnt++;
    if(cnt>=20)
    {
      cnt=0;
            rl_sec--;
            if(rl_sec==0)
            {
                                rl_sec=59;
                          rl_min--;
                                if(rl_min>250)
                                {
                                        START=0;
                                        rl_sec=0;
                                        rl_min=0;
                                        BUZZER=1;//關(guān)閉蜂鳴器
                                }
                  }
                }
  }
TR0=1;
}
回復(fù)

使用道具 舉報

6#
ID:141378 發(fā)表于 2016-12-13 19:26 | 只看該作者
yujianli 發(fā)表于 2016-1-9 21:13
其實也挺簡單的,顯示函數(shù)更新就可以,程序如下:
#include
//定義

謝謝  樓上
回復(fù)

使用道具 舉報

7#
ID:154563 發(fā)表于 2016-12-13 22:48 來自手機 | 只看該作者
很好   謝謝幫助
回復(fù)

使用道具 舉報

8#
ID:356686 發(fā)表于 2018-6-22 19:02 來自手機 | 只看該作者
樓主,能把原理圖分享一下嗎?
回復(fù)

使用道具 舉報

9#
ID:111634 發(fā)表于 2018-6-23 08:09 | 只看該作者
實例96  能預(yù)置初值的倒計時秒表
Proteus仿真一下,確認(rèn)有效。
實例96 能設(shè)置初值的倒計時秒表.rar (40 KB, 下載次數(shù): 31)

以上摘自張志良編著《80C51單片機仿真設(shè)計實例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機應(yīng)用100案例,用于仿真實驗操作,書中電路和程序設(shè)計有詳細說明,電路與程序真實可靠可信可行,程序語句條條有注解。
回復(fù)

使用道具 舉報

10#
ID:418347 發(fā)表于 2018-11-5 16:14 | 只看該作者
請問樓主,if(rl_min>250)這里大于250 什么意思啊
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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