2024-09-01
售卖作品
00

目录

高仿真数码管电子钟
51单片机
MSP430单片机
设置时间
读取时间
PCF8583介绍
源码
帮助、问询

高仿真数码管电子钟

高仿真数码管电子钟

基本要求:

采用 6只7段 BCD 码数码管器件 7SEG;

采用 PCF8583 时钟芯片:

能显示时间。

发挥部分:

采用键盘,实现 12h/24h 切换功能:

有时间调整功能。

在这里插入图片描述

51单片机

在这里插入图片描述

MSP430单片机

在这里插入图片描述

设置时间

PCF8583是 IIC通信,当引脚A0接GND,则I2C地址为0XA0。

设置时间的步骤:

(1)向 0x00 寄存器(控制地址) 写入 0x80 数据(停止运行始终、正常计数、32768、允许读出全部内容、闹钟全部关闭,详看芯片介绍中的寄存器介绍);

(2)

向0x02 寄存器写入BCD格式的秒,低位存放秒数的个位数值,范围为0~9;高位存放秒数的十位数值,范围为0~5 ;

向0x03 寄存器写入BCD格式的分;

向0x04 寄存器写入BCD格式的时;

在这里插入图片描述

向0x05 寄存器写入BCD格式的日、年;

在这里插入图片描述

向0x06 寄存器写入BCD格式的 星期/月;

在这里插入图片描述

(3)向 0x00 寄存器(控制地址) 写入 0x00 数据,开始走时

读取时间

读取 0x02、0x03、0x04、0x05、0x06中的数值做转换即可。

PCF8583介绍

PCF8583是飞利浦(Philips)公司生产的CMOS型实时时钟芯片,它带有240B的RAM,且具有I2C串行总线接口。只需要通过单片机并行I/O口的两条引脚模拟I2C总线的数据线SDA、时钟线SCL,就可以完成对PCF8583的参数设置、读取日期和时间数据等操作。PCF8583具有接口简单,占用单片机资源少等优点,因而被广泛应用在各类智能仪器仪表和电子工程项目中。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

源码

下载:dt3.8tupian.net/2/28880a15b9990.pg3

这段代码是一个嵌入式系统中的主程序(main函数),用于控制一个数字时钟的功能。

首先,代码定义了一些变量和寄存器的配置。然后进入一个无限循环,不断执行下面的操作:

每隔4毫秒执行一次中断服务函数。

通过计数器t_j实现每50次循环(即200毫秒)执行一次读取时间的操作。

在读取时间后,根据是否是24小时制来设置显示数组disp中的小时值。

通过按键的检测修改时间:按下P5IN寄存器的BIT1增加小时,按下BIT2减少小时,按下BIT3增加分钟,按下BIT4减少分钟,按下BIT5增加秒,按下BIT6减少秒,按下BIT7切换24小时制。

每次修改时间后,调用write_time函数将修改后的时间写入到相应的存储器中。

循环继续,重复以上步骤。

整个代码的功能是实现一个数字时钟,通过按键控制时钟的设置和调整,并将时间在数码管上进行显示。

c
void main( void ) { int t_j = 0; char rchar; WDTCTL = WDTPW + WDTHOLD; /* 关闭看门狗 */ write_time(); P1DIR = 0xFF; P1OUT = 0x00; /* 数码管段选 */ P3DIR = 0xFF; P3OUT = 0x00; /* 数码管位选 */ P5DIR &= 0X01; P5REN |= 0XFE; P5OUT |= 0XFE; /* 7个按键 */ P2DIR |= BIT1; P2OUT |= BIT1; /* 小灯 */ CCTL0 = CCIE; /* CCR0 interrupt enabled */ CCR0 = 327 / 4; /* 4ms */ TACTL = TASSEL_1 + MC_1; /* ACLK, upmode */ __bis_SR_register( GIE ); while ( 1 ) { delay_ms( 2 ); t_j++; if ( t_j > 50 ) { t_j = 0; /* 读取时间 */ rchar = ReadByteEE( SECOND ); hour = (rchar >> 4) * 10 + (rchar & 0x0F); rchar = ReadByteEE( MINUTE ); second = (rchar >> 4) * 10 + (rchar & 0x0F); rchar = ReadByteEE( HOUR ); minute = (rchar >> 4) * 10 + (rchar & 0x0F); /* 将时间装入数组 */ if ( flag24 == 1 ) { disp[0] = hour % 100 / 10; disp[1] = hour % 10; }else{ if ( hour > 12 ) { disp[0] = (hour - 12) % 100 / 10; disp[1] = (hour - 12) % 10; }else { disp[0] = hour % 100 / 10; disp[1] = hour % 10; } } disp[2] = minute % 100 / 10; disp[3] = minute % 10; disp[4] = second % 100 / 10; disp[5] = second % 10; } if ( (P5IN & BIT1) == 0 ) /* 增加小时 */ { if ( flag24 == 1 ) { hour++; if ( hour > 23 ) hour = 0; } else{ hour++; if ( hour > 11 ) hour = 0; } write_time(); while ( (P5IN & BIT1) == 0 ) ; }else if ( (P5IN & BIT2) == 0 ) /* 减少小时 */ { if ( flag24 == 1 ) { if (hour > 0) { hour--; } else { hour = 23; } }else { if (hour > 0) { hour--; } else { hour = 11; } } write_time(); while ( (P5IN & BIT2) == 0 ) ; }else if ( (P5IN & BIT3) == 0 ) /* 增加分钟 */ { minute++; if ( minute > 59 ) minute = 0; write_time(); while ( (P5IN & BIT3) == 0 ) ; }else if ( (P5IN & BIT4) == 0 ) /* 减少分钟 */ { if ( minute > 0 ) { minute--; }else { minute = 59; } write_time(); while ( (P5IN & BIT4) == 0 ) ; }else if ( (P5IN & BIT5) == 0 ) /* 增加秒 */ { second++; if ( second > 59 ) second = 0; write_time(); while ( (P5IN & BIT5) == 0 ) ; }else if ( (P5IN & BIT6) == 0 ) /* 减少秒 */ { if ( second > 0 ) { second--; }else { second = 59; } write_time(); while ( (P5IN & BIT6) == 0 ) ; }else if ( (P5IN & BIT7) == 0 ) /* 切换24小时制 */ { if ( flag24 == 1 ) { flag24 = 0; P2OUT &= ~BIT1; } else{ flag24 = 1; P2OUT |= BIT1; } while ( (P5IN & BIT7) == 0 ) ; } } }

帮助、问询

csharp
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!