arduino的创意时钟(数码管电子时钟制作过程)
arduino的创意时钟(数码管电子时钟制作过程)加载DS3231库#include <DS3231.h>A5 (SCL) <---> SCLGND <---> GND5V <---> VCCA4(SDA) <---> SDA
DS3231时钟模块DS3231时钟模块使用I2C通信协议,这使得与arduino开发板的连接非常容易。
I2C协议是双向双线串行总线,其提供集成电路之间的通信链路。
使主设备能够与同一双线总线上的其它外围设备通信专用于数据传输,一条线专用于数据传输,而另一条用于时钟信号。
Arduino Uno DS3231
GND <---> GND
5V <---> VCC
A4(SDA) <---> SDA
A5 (SCL) <---> SCL
加载DS3231库#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
//clock.setDateTime(__DATE__ __TIME__);
第一次运行时取消注释 让DS3231获取计算机系统时间
dt=clock.getDateTime(); //获取时间,4位数码管只需显示小时和分钟
int hour_a=dt.hour/10; //数码管第一位显示,小时
int hour_b=dt.hour;//
int min_a=dt.minute/10;
int min_b=dt.minute;
例如9:12 ,运算的结果 hour_a=0,hour_b=9,min_a=1,min_b=2
C语言除法运算符“/”和取模运算符“%”除法运算符"/"。二元运算符,具有左结合性。参与运算的量均为整型时,结果为整型,舍去小数。
例如:5/2=2,1/2=0
取模运算符"%",二元运算符,具有左结合性。参与运算的量均为整型。取模运算的结果等于两个数相除后的余数。
例如:5%2=1,1%2=1
如果a<b的话,这样的商为0 余数就是a
代码是共阴极数码管,虽然能正常显示时间,但有很多缺点没有解决。
delay(3),如果设置时间过长,4位数码管只能显示一个数,会按顺序显示1,2,3 4位的数字。设置delay(3)时间间隔短,欺骗眼睛,4位数码能同时显示数字,没法实现2个小数点的闪烁,
#include <DS3231.h>
#define SEG_A 2
#define SEG_B 3
#define SEG_C 4
#define SEG_D 5
#define SEG_E 6
#define SEG_F 7
#define SEG_G 8
#define SEG_H 13
#define COM1 9
#define COM2 10
#define COM3 11
#define COM4 12
DS3231 clock;
RTCDateTime dt;
unsigned char table[10][7] =
{ {1 1 1 1 1 1 0} //0
{0 1 1 0 0 0 0} //1
{1 1 0 1 1 0 1} //2
{1 1 1 1 0 0 1} //3
{0 1 1 0 0 1 1} //4
{1 0 1 1 0 1 1} //5
{1 0 1 1 1 1 1} //6
{1 1 1 0 0 0 0} //7
{1 1 1 1 1 1 1} //8
{1 1 1 1 0 1 1} //9
};
void setup()
{
Serial.begin(9600);
pinMode(SEG_A OUTPUT); //设置为输出引脚
pinMode(SEG_B OUTPUT);
pinMode(SEG_C OUTPUT);
pinMode(SEG_D OUTPUT);
pinMode(SEG_E OUTPUT);
pinMode(SEG_F OUTPUT);
pinMode(SEG_G OUTPUT);
pinMode(SEG_H OUTPUT);
pinMode(COM1 OUTPUT);
pinMode(COM2 OUTPUT);
pinMode(COM3 OUTPUT);
pinMode(COM4 OUTPUT);
clock.begin();
//clock.setDateTime(__DATE__ __TIME__);
//第一次运行时取消注释 让DS3231获取计算机时间
}
void loop()
{
dt=clock.getDateTime();
int hour_a=dt.hour/10;
int hour_b=dt.hour;
int min_a=dt.minute/10;
int min_b=dt.minute;
Display(1 hour_a); //第1位显示
delay(3);
Display(2 hour_b); //第2位显示
delay(3);
Display(3 min_a); //第3位显示
delay(3);
Display(4 min_b); //第4位显示
delay(3);
}
void Display(unsigned char com unsigned char num)
//显示函数,com可选数值范围1-4,num可选数值范围0-9
{
digitalWrite(SEG_A LOW); /
digitalWrite(SEG_B LOW);
digitalWrite(SEG_C LOW);
digitalWrite(SEG_D LOW);
digitalWrite(SEG_E LOW);
digitalWrite(SEG_F LOW);
digitalWrite(SEG_G LOW);
digitalWrite(SEG_H HIGH);
switch(com)
{
case 1:
digitalWrite(COM1 HIGH);
digitalWrite(COM2 HIGH);
digitalWrite(COM3 HIGH);
digitalWrite(COM4 LOW);
break;
case 2:
digitalWrite(COM1 HIGH);
digitalWrite(COM2 HIGH);
digitalWrite(COM3 LOW);
digitalWrite(COM4 HIGH);
break;
case 3:
digitalWrite(COM1 HIGH);
digitalWrite(COM2 LOW);
digitalWrite(COM3 HIGH);
digitalWrite(COM4 HIGH);
break;
case 4:
digitalWrite(COM1 LOW);
digitalWrite(COM2 HIGH);
digitalWrite(COM3 HIGH);
digitalWrite(COM4 HIGH);
break;
default :
break;
}
digitalWrite(SEG_A table[num][0]);
digitalWrite(SEG_B table[num][1]);
digitalWrite(SEG_C table[num][2]);
digitalWrite(SEG_D table[num][3]);
digitalWrite(SEG_E table[num][4]);
digitalWrite(SEG_F table[num][5]);
digitalWrite(SEG_G table[num][6]);
}