arduino创意作品——时间可调电子时钟

本文详细介绍了如何使用ArduinoUNO板配合LCD1602进行时间显示,并通过PS2手柄实现时分秒的调整以及通过电位器控制LCD对比度。利用定时器1和定时器2进行精确的时间更新和状态切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


实验准备

实验所用元件:

元件功能
Arduino UNO板编程开发
LCD 1602时间显示
手柄时间调整
杜邦线若干元件连接
电位器对比度调节

实验连线:

ArduinoLCD 1602
GNDVSS
5VVDD
Pin 6V0
Pin 12RS
GNDRW
Pin 11EN
Pin 5D4
Pin 4D5
Pin 3D6
Pin 2D7
GNDBLK(K)
Arduino电位器
3.3VVCC
GNDGND
LCD 1602电位器
BLA(A)S

实验原理

1.使用LCD1602库函数<LiquidCrystal.h>实现数字显示,利用定时器1和定时器2的库函数:<TimerOne.h>和<MsTimer2.h>实现时间的更新显示。
Arduino UNO有三个定时器:
timer0:一个被Arduino的delay(), millis()和micros()使用的8位定时器
timer1:一个被Arduino的Servo()库使用的16位定时器
timer2:一个被Arduino的Tone()库使用的8位定时器
常见的定时器使用方式有自定义触发、MsTimer2库、TimeOne库三种方式,操作寄存器比较复杂,所以本实验采用库函数的操作方式。

2.PS2手柄左右移动切换到需要调整的位置,上下移动控制当前位置值(时分秒)的增减。

3.电位器旋转时可以输出不同大小的电压值,而LCD显示器的对比度可以通过3号引脚的输入电压控制,故可以将电位器输出接至LCD的3号引脚,实现通过旋钮电位器模块调整LCD显示屏的对比度。

4.控制状态转换原理图:
在这里插入图片描述
在这里插入图片描述

实验代码

#include <LiquidCrystal.h> // 加载LCD1602的库
#include <MsTimer2.h>      //加载定时器2的库
#include <TimerOne.h>      //加载定时器1的库
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;  // 定义引脚
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);   // 根据引脚,创建一个 lcd 实例
int Hour=0,Min=0,Sec=0,flag=0;               //初始化时分秒
  
void tick(){
  if(Sec>=59)
  {
    Sec=0;
    Min=Min+1;
    lcd.setCursor(7,0);
    lcd.print(" "); 
  }
  if(Min==60)
  {
    Min=0;
    Hour=Hour+1;
  }
  if(Hour==24)
  {
    Hour=0;
  }
  Sec=Sec+1;
  //LCD时间显示
  lcd.setCursor(0,0); 
  lcd.print(Hour);  
  lcd.setCursor(2,0); 
  lcd.print(":");  
  lcd.setCursor(3,0); 
  lcd.print(Min);
  lcd.setCursor(5,0);
  lcd.print(":");  
  lcd.setCursor(6,0);
  lcd.print(Sec); 
}
//时钟位调整函数
void H()
{  //PS2手柄向上
   if ((analogRead(A1)) == 1023) {
    Hour++;
    lcd.setCursor(0,0); 
    lcd.print("  ");  
      if(Hour>=24)
    {
      Hour=0;
    }
    lcd.setCursor(0,0);
    lcd.print(Hour);
  } else {
    //PS2手柄向下
    if ((analogRead(A1)) == 0) {
      Hour--;
      lcd.setCursor(0,0); 
      lcd.print("  ");  
      if(Hour<=-1)
      {
        Hour=23;
      }
      lcd.setCursor(0,0);
      lcd.print(Hour);
      
    }
    }
    
}
//分钟位调整函数
void M()
{  //PS2手柄向上
   if ((analogRead(A1)) == 1023) {
    Min++;
    lcd.setCursor(3,0); 
    lcd.print("  "); 
    if(Min>=59)
    {
      Min=0;
    }
    lcd.setCursor(3,0); 
    lcd.print(Min); 
  } else {
    //PS2手柄向下
    if ((analogRead(A1)) == 0) {
      Min--;
      lcd.setCursor(3,0);
      lcd.print("  "); 
      if(Min<=-1)
      {
        Min=59;
      }
      lcd.setCursor(3,0); 
      lcd.print(Min); 
    }
    }
}
//秒钟位调整函数
void S()
{  //PS2手柄向上
   if ((analogRead(A1)) == 1023) {
      Sec=0;
      lcd.setCursor(7,0); 
      lcd.print(" "); }
   //PS2手柄向下
    if ((analogRead(A1)) == 0) {
      
        Sec=0;
        lcd.setCursor(7,0); 
        lcd.print(" "); 
      }
    }
    

void timer1(){
  //PS2手柄向右
  if ((analogRead(A0)) == 1023) {
    flag++;
    if(flag==4)
    {
      flag=0;
    }
  } else {
    // PS2手柄向左
    if ((analogRead(A0)) == 0) {
      flag--;
      if(flag==-1)
      {
        flag=3;
      }
    }
    }
    //时间调整状态切换
   switch(flag){
    case 1:{
        lcd.setCursor(0,1); 
        lcd.print("^^");
        lcd.setCursor(2,1); 
        lcd.print("  ");
        lcd.setCursor(4,1); 
        lcd.print("  ");
        H();
        break;
    }
    case 2:{
        lcd.setCursor(3,1); 
        lcd.print("^^");
        lcd.setCursor(0,1); 
        lcd.print("  ");
        lcd.setCursor(6,1); 
        lcd.print("  ");
        M();
        break;
    }
    case 3:{
        lcd.setCursor(6,1); 
        lcd.print("^^");
        lcd.setCursor(3,1); 
        lcd.print("  ");
        lcd.setCursor(0,1); 
        lcd.print("  ");
        S();
        break;
    }
    default:{
        lcd.setCursor(6,1); 
        lcd.print("  ");
        lcd.setCursor(3,1); 
        lcd.print("  ");
        lcd.setCursor(0,1);
        lcd.print("  ");
    }
   }
}
void setup() {
  lcd.begin(16, 2); //   初始化lcd ,并定义LCD1602的规格
  MsTimer2::set(1000,tick);//1000ms的刷新频率
  MsTimer2::start();
  Timer1.initialize(200000);//200ms的刷新频率
  Timer1.attachInterrupt(timer1);
}

void loop() 
{}

实验结果

时钟显示部分

在这里插入图片描述

整体展示

在这里插入图片描述

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值