数电实训:万年历

万年历

设计任务及要求

用中、小规模集成电路设计一个能自动显示“年、月、日、星期、时、分”的数字式日历牌,能实现以下功能:

  1. 由555定时器产生1Hz的标准“秒”信号。
  2. “秒计数器”为00 ~ 59的六十进制计数器。
  3. “分计数器”为00 ~ 59的六十进制计数器。
  4. “时计数器”为00 ~ 23的二十四进制计数器。
  5. “星期计数器”为一、二、三、四、五、六、日的七进制计数器。
  6. “日计数器”根据月的不同,可为二十八、二十九、三十、三十一进制计数器。
    大月:1、3、5、7、8、10、12——31天
    小月:4、6、9、11——30天
    闰年2月:29天
    平年2月:28天
  7. “月计数器”为1 ~ 12的十二进制计数器。
  8. 具有校时功能。即只要将开关置于校时位置,可分别对“年、月、日、星期、时、分”进行手动脉冲输入或连续脉冲输入的校正。
  9. 闹钟、整点报时

设计方案

(1)用555定时器接成多谐振荡电路,调节RC,产生频率一定的脉冲信号;
(2)显示电路连接至数码管;
(3)用计数器74LS160实现计数;在每一个不同功能的计数器中,每当其下一位的进位信号或者CLK信号到达时,它开始计数;设定一个值,使得计数器在计数到此值时,向其高位计数器输出一个进位信号,当下一个脉冲信号到达时,数据清空,从头开始计数;月计数器和年计数器设置反馈信号,通过小规模器件实现闰年以及大月小月的判断,将之反馈给日计数器;日计数器需要从月和年计数器的反馈中判断其计数最小值;
(4)在每个计数器的CLK信号通过开关连接至脉冲光电源,通过控制开关实现计数器的自行计数以及接入电路计数
(5)每个计数器置零端接一个开关控制计数器的强制置零
(6)整点报时用门电路判断出是否出现0分0秒
(7)闹钟用74HC85进行比较当相等时得到高电平
系统框图

单元电路设计

555定时器
555定时器连接成多谐振荡电路,得到一个周期性的稳定的脉冲波信号

f = ( R 4 + 2 R 5 ) C l n 2 f=(R_4+2R_5)Cln2 f=(R4+2R5)Cln2
555定时器

时分秒计数器
三种单元电路类似,以分为例,由两片74LS160、译码显示器及与非门等小规模器件组成。QA、QB、QC、QD接到数码管显示器,低位片的EP、ET接到电源端,其进位端接到高位片的EP、ET端。CLK由555定时器产生的信号提供,当计数器的值计到59时,计数器向时计数器产生一个进位,等到下一个CLK信号作用时,计数器被重新置为00,即为从00至59的六十进制计数器。开关S控制两片160的置零,开关A、B分别控制分的个位十位自己计数

时分秒计数器单元电路

星期计数器
星期计数器单元电路由74LS160、译码显示器及非门等小规模器件组成。将计数器置成0001的初态,即ABCD=0001;在QAQBQCQD端通过或非门等连接至译码显示器,使得计数器计数到6时,即QAQBQCQD=0110,译码显示器显示为8。CLK由时计数器产生的进位信号提供,当CLK信号到达时,计数器开始计数。当计数到0110时,等到下一个CLK信号作用后,计数器被置为0001,即为1、2、3、4、5、8循环的六进制计数器。开关M实现自行计数

星期计数器

月、日计数器

月、日计数器

年计数器
年计数器单元电路由两片74LS160、译码显示器、闰年-闰月判断器及非门等小规模器件组成。其A、B、C、D和QA、QB、QC、QD端分别接至地端和数码管,低位片的进位端接到高位片的EP、ET端,CLK由月计数器的进位信号提供。每当CLK信号到达时,计数器开始计数。通过与门非门等门电路的判断,判断是否为闰年

年计数器
闰年判断

整点报时
对分秒进行检测,当都为00时输出高电平

整点报时

闹钟
用74HC85对输入的时间以及当前的时间进行比较,当时间相等时输出高电平

闹钟

完整电路图

万年历完整电路图

难点分析

闰年的判断
用与或非简单门电路进行判断

闰年:能被4整除但不能被100整除或者能被400整除。
分解来看:能被4整除但不能被100整除为十位个位不为零的情况,此时只需要看个位十位能否被4整除,不需要考虑千位百位。分为两种情况:
a. 当十位为偶数的时候,个位为0、4、8。
b. 当十位为奇数的时候,个位为2、6。
可以被400整除,此时说明个位十位必须都得满足为0。此为限制条件。千位百位则能被4整除即可,同上一段分析。

闰年判断

区别大小月及闰年平年的2月
利用四选一选择器并用大小月及2月出现条件构成AB选择条件
先利用74LS42这个4-10译码器将月份的个位进行进制的转换,再将是否为闰年的判断以及月份的十位数字与个位转换完的输入74LS148这个8-3优先编码器使输出能成为四选一选择器的地址码
AB闰年信号进制
00X30
01X31
10129
11028

区别大小月及闰年平年的2月演示过程

  • 20
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
以下是一个简单的C语言万年历实训报告,供您参考: 一、实训目的 本次实训的主要目的是通过编写一个简单的C语言万年历程序,巩固C语言基本语法和编程思想,提高编程能力和解决问题的能力。 二、实训要求 1、能够使用C语言基本语法和控制语句编写程序。 2、能够使用数组来存储和操作数据。 3、能够使用函数来实现模块化编程。 4、能够使用指针来操作内存中的数据。 5、能够使用文件来读取和写入数据。 三、实训内容 1、程序功能 本程序实现了一个简单的万年历功能,可以通过输入年份和月份来显示该月的日历。 2、程序实现 以下是本程序的主要代码实现: ```c #include <stdio.h> // 判断是否为闰年 int is_leap_year(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 1; } else { return 0; } } // 获取某个月份的总天数 int get_days(int year, int month) { int days[] = {31, 28 + is_leap_year(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return days[month - 1]; } // 获取某个日期是星期几 int get_weekday(int year, int month, int day) { if (month == 1 || month == 2) { year--; month += 12; } int c = year / 100; int y = year % 100; int w = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1; w = (w % 7 + 7) % 7; return w; } // 显示日历 void show_calendar(int year, int month) { int days = get_days(year, month); int weekday = get_weekday(year, month, 1); printf(" 日 一 二 三 四 五 六\n"); int i; for (i = 0; i < weekday; i++) { printf(" "); } for (i = 1; i <= days; i++) { printf("%2d ", i); if ((weekday + i) % 7 == 0) { printf("\n"); } } if ((weekday + days) % 7 != 0) { printf("\n"); } } int main() { int year, month; printf("请输入年份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); if (month < 1 || month > 12) { printf("月份输入错误!\n"); return 1; } printf(" %d年%d月\n", year, month); show_calendar(year, month); return 0; } ``` 四、实训总结 通过本次实训,我学会了如何使用C语言来编写一个简单的万年历程序,巩固了C语言基本语法和编程思想,加强了对函数、数组、指针、文件等概念和用法的理解,提高了编程能力和解决问题的能力。同时,我也意识到在编程过程中需要注重代码的规范、可读性和可维护性,这对于日后的开发工作非常重要。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sigyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值