闹钟程序
- 格式:doc
- 大小:41.50 KB
- 文档页数:5
单片机时钟程序设计代码好的,由于你没有给出具体的单片机型号,下面是一个基于 51 单片机的时钟程序设计示例:```c#include <reg52.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>// 定义变量char str[20];int i=0;int j=0;int k=0;int time=0;int flag=0;int h=0,m=0,s=0;void delay(int xms){int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;time++;if(time==20){time=0;s++;if(s==60){s=0;m++;if(m==60){m=0;h++;}}}// 将时间数据转换为字符串sprintf(str," %02d:%02d:%02d",h,m,s);// 输出时间字符串for(i=0;i<16;i++){P0=str[i];delay(1000);}}void main(){// 初始化定时器 0 为 16 位定时器模式,计数初值为 50000 TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1);}```该程序利用 51 单片机的定时器 0 来产生定时中断,每 20 次中断为 1 秒,通过对秒、分、时的累计来实现时钟功能。
在中断服务函数中,将当前时间转换为字符串,并通过循环输出到 P0 口。
#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/*七段共阴和显示定义*///此表为LDE的字模,共阴数码管0-9uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码控制/*定义并初始化变量*/ucharseconde=15; //秒ucharminite=0; //分uchar hour=0; //时ucharmstcnt=0; //定时器计数,定时50ms,mstcnt满20,秒加1ucharshi=0; //闹铃功能uchar fen=0;ucharbjcs ; // 报警次数uchar c;sbit P10=P1^0; //second调整定义sbit P11=P1^1; //minite调整定义sbit P12=P1^2; //hour调整定义sbit P15=P1^5; //整点报时sbit P13=P1^3; //闹铃功能,调整时间sbit P16=P1^6; //调整时sbit P17=P1^7; //调整分sbit P14=P1^4; //关闭闹铃/*延时子程序*/void delay (uint k){uchar j;while((k--)!=0){for(j=0;j<200;j++){;}}}/*时间处理子程序*/void time(void){if(seconde==59){seconde=0;minite++;if(minite==59){minite=0;hour++;if(hour==24){hour=0;}}}}/*显示子程序*/void display(void){if(P13==1){P2=0xfb;P0=dispcode[seconde%10];//秒个位delay(1);P2=0xf7;P0=dispcode[seconde/10];//秒十位delay(1);// P2=0XFB;// P0=dispcode[10]; //间隔符// delay(1);//P2=0Xef;P0=dispcode[minite%10]; //分个位delay(1);P2=0Xdf;P0=dispcode[minite/10]; //分十位delay(1);//// P2=0Xdf;// P0=dispcode[10]; //间隔符// delay(1);P2=0Xbf;P0=dispcode[hour%10]; //时个位delay(1);P2=0X7f;P0=dispcode[hour/10]; //时十位delay(1);}}/*键盘扫描子程序*/ //设置倒计时时间voidkeyscan(void){if(P10==0)//秒位的调整{delay(30);if(P10==0){seconde++;if(seconde==59){seconde=0;}}delay(250);}if(P11==0)// 分位的调整{delay(30);if(P11==0){minite++;if(minite==59){minite=0;}}delay(250);}if(P12==0) //时位的调整{delay(30);if(P12==0){hour++;if(hour==24){hour=0;}}delay(250);}}/*倒计时*/voidjian(void){if(P14==0){P14=0;{if(c==20){c=0;seconde--;if(seconde>59){seconde=59;minite--;if(minite>59){minite=59;hour-- ;if(hour>23){hour=0;minite=0;seconde=0;}}}}}}}/*定时闹钟*/voiddingshi(void){if(P13==0) //按信P13不松,显示闹铃设置界面,分别按住P16、P17设置闹铃时间{P2=0Xfb;P0=dispcode[seconde%10]; //秒个位delay(1);P2=0Xf7;P0=dispcode[seconde/10]; //秒十位delay(1);P2=0Xef;P0=dispcode[fen%10]; //分个位delay(1);P2=0Xdf;P0=dispcode[fen/10]; //分个位delay(1);P2=0Xbf;P0=dispcode[shi%10]; //时个位delay(1);P2=0Xd7f;P0=dispcode[shi/10]; //时十位delay(1);}if(P16==0) //设定时{delay(30);if(P16==0){shi++;if(shi==24){shi=0;}}delay(250);}if(P17==0) //设定分{delay(30);if(P17==0){fen++;if(fen==60){fen=0;}}delay(250);}if((hour==shi)&(minite==fen)&(seconde==0)) //闹铃时间到,报警十次{for(bjcs=0;bjcs<2;bjcs++){P15=0;delay(10);jian();P15=1;// delay(500);}}}/*整点报警*/voidzhengdian (void){if((seconde==0)&(minite==0)) //整点报时{P15=0;delay(10);jian();P15=1;}}/*主函数*/void main(void){P0=0xff;TMOD=0X11; //time0为定时器,方式1TH0=0X3C; //预置计数初值,50msTL0=0XB0;EA=1; //总中断开ET0=1; //允许定时器0中断TR0=1; //开启定时器0while(1){keyscan(); //按键扫描dingshi(); //定时闹钟zhengdian(); //整点报时jian();display(); //显示时间}}void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次{TH0=0X3C; //手动加载计数脉冲次数TL0=0XB0;c++;// mstcnt++; //用于计算时间,每隔50ms加1// if(mstcnt==20) //mstcnt满20即为一秒// {// seconde++; //秒加1// time(); //时间处理// mstcnt=0; //对计数单元的清零,重新开始计数// }}。
基于51的电⼦闹钟设计报告(附原理图、PCB图、程序)成都信息⼯程学院第五届嵌⼊式创新技术⼤赛基于MCS51的智能电⼦闹钟设计报告姓名学院班级实物图⽬录1.电⼦时钟的设计原理和⽅法 (1)1.1设计原理 (1)1.2 硬件电路的设计 (1)1.2.1 STC89C51RC简介 (1)1.2.2 键盘电路的设计 (2)1.2.3蜂鸣器驱动电路 (3)1.2.4 数码管驱动电路 (3)1.2.5 电源电路 (4)1.3软件部分的设计 (4)1.3.1主程序部分的设计 (4)1.3.2中断计时器及时间进位 (5)1.3.3 闹钟⼦函数 (7)1.3.4 按键扫描 (8)1.3.5 时钟闹钟设置 (9)1.3.6 显⽰数字函数 (10)1.3.7 显⽰界⾯函数 (10)1.3.8 闹钟记录及读取 (11)2.硬件调试 (13)附录A:电路原理图 (15)附录B:电路PCB图 (16)附录C:源程序 (17)1.电⼦时钟的设计原理和⽅法1.1设计原理系统框图1.2硬件电路的设计1.2.1 STC89C51RC简介STC89C52R CSTC89C51RC是⼀种带8K闪烁可编程可擦除只读存储器(FPETOM-FlashProgrammabalandErasableReadOnlyMemory )的低电压、⾼性能CMOS8位微型处理器,即单⽚机芯⽚。
单⽚机的可擦除只读存储器可以反复擦除1000次,内部FLASH 擦写次数为100000次以上。
该芯⽚使⽤⾼密度⾮易失存储制造技术,与⼯业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU 和闪烁存储器集成在单个芯⽚中,使得STC89C51RC 成为了⼀种性价⽐极⾼的微型处理器芯⽚,在许多电路设计中都得到了应⽤。
STC89C51RC 单⽚机特点:⼯作电压:5.5V-3.4V ⼯作频率:0-40MHz ⽤户应⽤程序空间:8K ⽚上集成128*8RAMISP (在系统可编程)/IAP (在应⽤可编程),⽆需专⽤编程器/仿真器可通过串⼝(P3.0/P3.1)直接下载⽤户程序EEPROM 功能共3个16位定时器/计数器,其中定时0还可以当成2个8位定时器使⽤外部中断4路通⽤异步串⾏⼝(UART ),还可⽤定时器软件实现多个UART ⼯作温度范围:0-75℃引脚说明:VCC:供电电压 GND :接地P0:P0是⼀个8位漏级开路双向I/O ⼝,低8位地址复⽤总线端⼝。
基于单片机定时闹钟的设计随着科技的快速发展,嵌入式系统已经深入到我们生活的各个角落。
其中,单片机以其高效性、灵活性和低成本性,广泛应用于各种设备的设计中。
本文将探讨如何基于单片机设计一个定时闹钟。
一、硬件需求1、单片机:选择一个适合你项目的单片机。
比如Arduino UNO,它具有丰富的IO口和易于使用的开发环境。
2、显示模块:为了能直观地展示时间,你需要一个LCD显示屏。
可以选择常见的16x2字符型LCD显示屏。
3、按键模块:用于设定时间和闹钟功能。
一般可以选择4个按键,分别代表功能设置、小时加、小时减和分钟加。
4、蜂鸣器:当到达设定时间时,蜂鸣器会发出声音提醒。
二、软件需求1、开发环境:你需要一个适用于你单片机的开发环境,例如Arduino IDE。
2、编程语言:一般使用C或C++进行编程。
3、程序设计:你需要编写一个程序来控制单片机,让其根据设定时间准时唤醒。
程序应包括初始化和设定时间的功能,以及到达设定时间后的闹钟提醒功能。
三、设计流程1、硬件连接:将单片机、显示模块、按键模块和蜂鸣器按照要求连接起来。
2、初始化:在程序中初始化所有的硬件设备。
3、时间设定:通过按键模块设定时间。
你需要编写一个函数来处理按键输入,并在LCD显示屏上显示当前时间。
4、闹钟提醒:在程序中加入一个计时器,当到达设定时间时,程序会唤醒并触发蜂鸣器发出声音。
5、循环检测:在主循环中不断检测时间是否到达设定时间,如果到达则触发闹钟提醒,然后继续检测。
四、注意事项1、时钟源:你需要一个稳定的时钟源来保证闹钟的准确性。
可以考虑使用网络时钟或者GPS模块。
2、功耗优化:如果你的设备需要长时间运行,那么需要考虑到功耗的问题,比如使用低功耗的单片机或者在不需要闹钟提醒的时候关闭蜂鸣器等。
3、人机交互:考虑增加更多的功能以满足用户的需求,如设置多个闹钟、调整闹钟的音量等。
4、安全性:保证设备的电源稳定,避免在突然断电的情况下数据丢失或设备损坏。
闹钟怎么使用手机操作方法
1. 打开手机闹钟应用:大多数Android和iOS设备都自带闹钟应用。
您可以在应用程序列表中找到它,也可以通过设备主屏幕上的闹钟小部件访问它。
2. 设置闹钟时间:在应用程序中,您可以轻松设置新闹钟或编辑现有闹钟。
您需要选择时间、日期和重复选项(例如每天或周一至周五)。
您还可以为闹钟命名。
3. 配置铃声:您可以更改闹钟默认的提示音为您自己的音效或铃声。
您可以在应用程序中选择音乐文件或从设备的媒体库中选择。
4. 操作闹钟:您可以设置多个闹钟和删除无用的闹钟。
您还可以延迟闹钟铃响时间或将其关闭。
5. 保持闹钟靠谱:您应该确保您的手机闹钟应用程序在闹铃时间正常工作。
在您安排闹钟时,请务必考虑设备电池和网络连接的状态,以确保闹钟可以按时响起。
怎样修复iPhone无法正常使用闹钟应用的问题Apple iPhone是一款功能强大的智能手机,拥有众多实用的应用程序。
然而,有时候用户可能会遇到一些问题,其中之一就是无法正常使用闹钟应用程序。
这个问题可能会导致用户错过重要的约会、会议或其他日程安排。
所以,在本文中,我们将探讨如何修复iPhone无法正常使用闹钟应用的问题。
要修复iPhone闹钟应用的问题,我们可以尝试以下几个解决方案:1. 检查闹钟设置:首先,我们需要确保闹钟的设置没有出错。
打开“时钟”应用,点击“闹钟”选项,检查所需的闹钟是否已经设置并且在期望的时间进行触发。
如果设置不存在或者时间设置错误,我们需要重新设置闹钟。
2. 更新iOS系统:Apple定期发布iOS系统的更新版本,以修复已知的问题和漏洞。
如果您的iPhone正在运行较旧的iOS版本,可能会导致闹钟应用的问题。
打开“设置”应用,点击“通用”选项,选择“软件更新”并检查是否有可用的更新。
如果有可用的更新,请确保下载并安装。
3. 关闭静音模式:iPhone的静音模式会关闭所有的声音和振动,这可能会导致您错过闹钟的声音。
我们需要确保您的iPhone不处于静音模式下。
通过侧边按钮或者控制中心,关闭静音模式,并确保音量设置合适。
4. 检查其他应用程序:有时候,其他应用程序可能会干扰闹钟应用的正常工作。
我们可以尝试关闭一些可能影响闹钟的应用程序,并观察是否有改善。
5. 重新启动iPhone:重新启动设备可以清除临时文件和解决一些常见的问题。
按住电源按钮,滑动“关机”选项进行关闭,然后再次按住电源按钮启动iPhone。
6. 恢复iPhone设置:如果以上解决方案都没有解决问题,我们可以尝试恢复iPhone的设置。
这将重置所有的设置和首选项,但不会影响您的个人数据。
在“设置”应用中,选择“通用”选项,然后点击“还原”进行恢复。
请注意,如果以上方法仍然无法修复问题,可能是因为硬件故障或操作系统的更严重问题。
c语言课程设计闹钟一、教学目标本课程旨在通过学习C语言编程,使学生掌握编写简单的闹钟程序的基本技能。
具体目标如下:1.理解C语言的基本语法和数据结构。
2.掌握函数的定义和调用。
3.了解操作系统中时间相关的函数和概念。
4.能够使用C语言编写简单的程序。
5.能够通过编程实现闹钟的基本功能,如设定时间、响起闹铃等。
6.能够对程序进行调试和优化。
情感态度价值观目标:1.培养学生的逻辑思维能力和解决问题的能力。
2.培养学生对编程和计算机科学的兴趣。
3.培养学生遵守时间和纪律的良好习惯。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据结构、函数的定义和调用,以及操作系统中时间相关的函数和概念。
具体安排如下:1.C语言的基本语法和数据结构(2课时)2.函数的定义和调用(2课时)3.闹钟程序的设计和实现(4课时)4.程序调试和优化(2课时)三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。
1.讲授法:用于讲解C语言的基本语法、数据结构和函数的定义和调用。
2.案例分析法:通过分析实际案例,使学生理解和掌握闹钟程序的设计和实现。
3.实验法:让学生通过动手实践,加深对C语言编程的理解和掌握。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。
1.教材:选用《C程序设计语言》作为主教材,辅助以相关参考书。
2.多媒体资料:提供相关的教学视频和PPT,帮助学生更好地理解和掌握知识。
3.实验设备:提供计算机和相关的编程环境,让学生能够进行实际的编程实践。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以保证评估的客观性和公正性。
1.平时表现(20%):通过课堂参与、提问和小组讨论等方式评估学生的学习态度和参与程度。
2.作业(30%):布置相关的编程作业,评估学生对课程内容的掌握程度和编程能力。
3.考试(50%):期末进行闭卷考试,评估学生对课程知识的全面理解和应用能力。
六、教学安排本课程的教学安排如下:1.教学进度:按照教材的章节顺序进行教学,确保学生系统地掌握C语言编程的知识。
2.源程序ORG 0000HLJMP STARTORG 000BHLJMP TIME;********初始化*********START: MOV SP, #50HMOV 20H,#00H ;定义秒MOV 21H,#00H ;定义分MOV 22H,#00H ;定义时MOV 23H,#01H ;定义闹钟分钟MOV 24H,#01H ;定义闹钟小时MOV 25H,#00HMOV 26H,#01HMOV 30H,#00H ;定义秒BCDMOV 31H,#00HMOV 32H,#00H ;定义分BCDMOV 33H,#00HMOV 34H,#00H ;定义小时BCDMOV 35H,#00HMOV 36H,#01HMOV 37H,#00HMOV 38H,#01HMOV 39H,#00HMOV 50H,#00H ;按键次数MOV TMOD,#01H ;16位计数器MOV TH0, #03CH ;赋初值MOV TL0, #0B0HMOV IE, #87H ;中断允许SETB TR0 ;启动T0MOV R2,#14HMOV P2,#0FFH;*********主程序**********MAIN: JB P1.4,GBLCALL TIMEPRO ;调用闹钟判断GB: LCALL DISPLAY1 ;调用时间显示JB P1.3,M1 ;P1.3=1时转移 S4没有按下 LCALL SETTIME ;调用SETTIME调时子程序LJMP MAINM1: JB P1.2,M2 ;P1 g.2=1时转移S3LCALL SETATIME ;调用SETATIME子程序LJMP MAINM2: JB P1.0,M4 ;P1.0=1时转移 S1LCALL LOOKATIME ;调用LOOKATIME显示闹钟子程序M4: LJMP MAIN;*********延时子程序********DELAY: MOV R4,#030HDL00: MOV R5,#0FFHDL11: MOV R6,#9HDL12: DJNZ R6,DL12DJNZ R5,DL11DJNZ R4,DL00RET;***********时间调整*******SETTIME: ;设置时间L0: LCALL DISPLAY1MM1: JB P1.3,L1 ;P1.3=1时转移MOV C,P1.3JC MM1LCALL DELAY1 ;延时JC MM1MSTOP1: MOV C,P1.3 ;P1.3为0时转移JNC MSTOP1LCALL DELAY1 ;延时MOV A,50HINC 50HCJNE A,#00H,HJ1LJMP L0HJ1: MOV C,P1.3JNC MSTOP1INC 22H ;小时自加一MOV A,22HCJNE A,#18H,GO12 ;小时计数循环MOV 22H,#00H ;复位MOV 34H,#00HMOV 35H,#00HLJMP L0L1: JB P1.1,L2 ;P1.1=1时转移MOV C,P1.1JC L1LCALL DELAY1 ;延时JC L1MSTOP2: MOV C,P1.1 ;P1.1=0时转移JNC MSTOP2LCALL DELAY1 ;延时MOV C,P1.1JNC MSTOP2INC 21H ;分钟加一MOV A,21HCJNE A,#3CH,GO11 ;分钟计数循环MOV 21H,#00H ; 复位MOV 32H,#00HMOV 33H,#00HLJMP L0GO11: MOV B,#0AHDIV ABMOV 32H,B ; 将A的低4位存入32单元 MOV 33H,A ; 将A的高4位存入33单元 LJMP L0GO12: MOV B,#0AHDIV ABMOV 34H,B ;将A的低4位存入34单元MOV 35H,A ; 将A的高4位存入35单元 LJMP L0L2: JB P1.0,L0 ; P1.0=1时转移MOV C,P1.0JC L2LCALL DELAY1 ;延时MOV C,P1.0JC L2STOP1: MOV C,P1.0 ; P1.0=0时转移JNC STOP1LCALL DELAY1 ;延时MOV C,P1.0JNC STOP1MOV 50H,#00HLJMP MAIN;*******设置闹钟*******SETATIME:LCALL DISPLAY2 ; 调用DISPLAY2显示闹钟N0: LCALL DISPLAY2MM2: JB P1.2,N1 ;P1.2=1时转移MOV C,P1.2JC MM2LCALL DELAY1 ; 延时JC MM2MSTOP3: MOV C,P1.2 ; P1.2=0时转移JNC MSTOP3LCALL DELAY1 ; 延时MOV A,50HINC 50HCJNE A,#00H,HJ2HJ2: MOV C,P1.2JNC MSTOP3INC 24H ;小时加一MOV A,24HCJNE A,#24,GO22 ;小时计数循环MOV 24H,#00H ;复位MOV 38H,#00HMOV 39H,#00HLJMP N0N1: JB P1.1,N2 ;P1.1=1时转移MOV C,P1.1JC N1LCALL DELAY1 ;延时JC N1MSTOP4: MOV C,P1.1 ;P1.1=0时转移JNC MSTOP4LCALL DELAY1 ;延时MOV C,P1.1JNC MSTOP4INC 23H ;分钟加一MOV A,23HCJNE A,#60,GO21 ;分钟计数循环MOV 23H,#00H ;复位MOV 36H,#00HMOV 37H,#00HLJMP N0GO21: MOV B,#0AHDIV ABMOV 36H,B ;将A的低4位存入36单元 MOV 37H,A ;将A的高4位存入37单元 LJMP N0GO22: MOV B,#0AHDIV ABMOV 38H,B ;将A的低4位存入38单元 MOV 39H,A ;将A的高4位存入39单元 LJMP N0N2: JB P1.0 ,N0 ;P1.0=1时转移MOV C,P1.0JC N2LCALL DELAY1 ;延时MOV C,P1.0JC N2STOP2: MOV C,P1.0LCALL DELAY1MOV C,P1.0JNC STOP2MOV 50H,#00HLJMP MAIN;*******闹钟判断*****************TIMEPRO: MOV A,21HMOV B,23HCJNE A,B,BK ;判断定时闹钟的分钟 MOV A,22HMOV B,24HCJNE A,B,BK ;判断定时闹钟的小时 SETB 25H.0MOV C,25H.0LCALL TIMEOUT ;调用TIMEOUTBK:RET;**************喇叭报警***************** TIMEOUT:X1: LCALL BZ ;调用喇叭响应程序CLR 25H.0 ;调用喇叭响应程序结束 LCALL DELAY ;延时CLR 25H.0LJMP DISPLAY1BZ:MOV C,25H.1MOV P1.6,CCLR P1.7MOV R7,#0FFH ;喇叭响应时间T2: MOV R6,#0FFHT3: DJNZ R6,T3DJNZ R7,T2SETB P1.7RET;*************显示闹钟时间************ LOOKATIME:LCALL DISPLAY2MM: JNB P1.0,LOOKATIMELCALL DELAY1LJMP MAINDELAY1: MOV R4,#14H ;时间延时DL001: MOV R5,#0FFHDL111: DJNZ R5,DL111DJNZ R4,DL001RET;***********定时**************TIME: PUSH ACC ;保护现场PUSH PSWMOV TH0,#03CH ;初值MOV TL0,#0B0HDJNZ R2,RET0MOV R2,#14HMOV A,20HCPL 25H.1CLR CINC A ;秒自加一CJNE A,#3CH,GO1 ;秒计数循环MOV 20H,#0 ;复位MOV 30H,#0MOV 31H,#0MOV A,21HINC A ;分钟自加一CJNE A,#3CH,GO2 ;分钟计数循环MOV 21H,#0H ;复位MOV 32H,#0MOV 33H,#0MOV A,22HINC A ;小时自加一CJNE A,#18H,GO3 ;小时计数循环MOV 22H,#00H ;复位MOV 34H,#0MOV 35H,#0AJMP RET0GO1: MOV 20H,AMOV B,#0AHDIV ABMOV 31H,A ;将A的低4位存入31单元 MOV 30H,B ;将A的高4位存入30单元 AJMP RET0GO2: MOV 21H,AMOV B,#0AHDIV ABMOV 33H,A ;将A的低4位存入33单元 MOV 32H,B ;将A的高4位存入32单元AJMP RET0GO3: MOV 22H,AMOV B,#0AHDIV ABMOV 35H,A ;将A的低4位存入35单元 MOV 34H,B ;将A的高4位存入34单元AJMP RET0RET0: POP PSW ;恢复现场POP ACCRETI;********显示子程序**********DISPLAY1: MOV R0,#30HMOV R3,#0FEHMOV A,R3PLAY1: MOV P2,AMOV A,@R0 ;取要显示的数据MOV DPTR,#DSEG1 ;指向字形段码首地址 MOVC A,@A+DPTRCJNE R0,#34H,PAORL A,#80HPA:CJNE R0,#32H,PBORL A,#80HPB:CPL A ;查表取字形段码MOV P0,A ;指向P0口LCALL DL1MOV P2,#0FFHMOV A,R3 ;判断是否显示到最低位 RL A ;左移一位JNB ACC.6,LD1INC R0 ;缓冲器地址加一MOV R3,ALJMP PLAY1LD1: RETDISPLAY2: PUSH ACC ;保护现场PUSH PSWMOV R0,#36HMOV R3,#0FBHMOV A,R3PLAY2: MOV P2,AMOV A,@R0 ;取要显示的数据MOV DPTR,#DSEG1 ;指向字形段码首地址MOVC A,@A+DPTRCJNE R0,#38H,PPORL A,#80HPP:CPL A ;查表取字形段码MOV P0,A ;指向P0口LCALL DL1 ;调用DL1MOV P2,#0FFHMOV A,R3 ;判断是否显示到最低位RL A ;左移一位JNB ACC.6,LD2INC R0 ;缓冲器地址加一 MOV R3,ALJMP PLAY2 ;调用PLAY2 LD2: POP PSWPOP ACC ;恢复现场RET;******DELAY*******DL1: MOV R7,#20HDL: MOV R6,#20HDL6: DJNZ R6,$DJNZ R7,DLRETDSEG1: DB 3FH,06H,5BH,4FH,66H ;七段码表DB 6DH,7DH,07H,7FH,6FH。
本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。
电子钟设计可采用数字电路实现,也可以采用单片机来完成。
数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外,AT89C51的指令系统和引脚与8051完全兼容,片内有128B的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。
采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真实验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。
设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。
显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。
#include <gl/glut.h>#include <windows.h>#include <math.h>#include<string.h>#include<sstream>#include<fstream>#include <stdlib.h>#include <time.h>//定义头文件#define N 3000#define changecolor 1#define resumecolor 2#define quit 3int winheight=700,winwidth=500;int cx=400,cy=200,radius=0;int hradius=150,mradius=150,sradius=300;float sangle,mangle,hangle;char timebuffer[100];int ww=0,hh=0;int tt=1,ll=0;int distances=0;char a[]="定义函数";int second,miniter,hour;int second1,miniter1,hour1;float br=0.0,bg=.0,bb=255.0;float sr=0.0,sg=255.0,sb=0.0; //定义函数bool bLight=false;void drawcrpot();void drawline();void hand(int cx,int cy,int r,float thleta);void Bresenham_Circle(int x0,int y0,double radius); void CirPot(int x0,int y0,int x,int y);void drawother();void createGLUTMenus();void processMenuEvents(int option);void Myinit(void){ glClearColor(1.0,1.0,1.0,1.0);glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glLineWidth(10.0);glPointSize(2); _strtime(timebuffer);hour1=50;miniter1=60;second1=70;tt=2; }void distimbuffer(char *strings){ int lengths;lengths = (int) strlen(strings);glRasterPos2i(cx-50,cy+50);for (int mm=0;mm<lengths;mm++){ glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, strings[mm]); } } void disclock(char *string){ int length;length = (int) strlen(string);glRasterPos2i(cx-20,cy-10);for (int m=0;m<length;m++){ glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, string[m]); } } void dis(){ disclock(a);distimbuffer(timebuffer); }void Display(void) { glClear(GL_COLOR_BUFFER_BIT); drawcrpot();//划4个数字drawline();//三个指针drawother();dis();glutSwapBuffers(); }//画图void drawline(){ hradius=radius/2.2;mradius=radius/1.8;sradius=radius/1.5;cx=100+radius;cy=cx;glColor3f(sr,sg,sb);hand(cx,cy,sradius,sangle);glLineWidth(3.0);hand(cx,cy,mradius,mangle);glLineWidth(5.0);hand(cx,cy,hradius,hangle); }void drawcrpot(){ if(ww>hh) distances=hh;else distances=ww;radius=distances/2-100;glClear(GL_COLOR_BUFFER_BIT);glClearColor(br,bg,bb,30.0);//背景色glColor3f(255.0,50.0,110.0);glRasterPos2i(100+radius, 100); //光标定位,窗口左下角为(0,0)glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'6'); g lRasterPos2i(100, 100+radius);glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'9');glRasterPos2i(100+2*radius,100+radius);glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'3');glRasterPos2i(100+radius,100+2*radius);glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'1');glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, '2'); }//画出表的圆盘void hand(int cx,int cy,int r,float thleta){ float harr[2];harr[0]=cx+r*cos(thleta);harr[1]=cy+r*sin(thleta);glBegin(GL_LINES);glVertex2f(harr[0],harr[1]);glVertex2f(cx,cy);glEnd(); }void drawother(){ glColor3f(0.0,255.0,105.0);Bresenham_Circle(cx,cy,double(radius+20)); }void Bresenham_Circle(int x0,int y0,double radius){ int x,y,d;x=0;y=int(radius);d=(int)3-2*radius;while (x<=y){ CirPot(x0,y0,x,y);if (d<0) d+=4*x+1;else { d+=4*(x-y)-2;y--; }x++; } }void CirPot(int x0,int y0,int x,int y){ glBegin(GL_POINTS);glVertex2f(x0+x,y0+y);glVertex2f(x0+x,y0-y);glVertex2f(x0-x,y0+y);glVertex2f(x0-x,y0-y);glVertex2f(x0+y,y0+x);glVertex2f(x0+y,y0-x);glVertex2f(x0-y,y0+x);glVertex2f(x0-y,y0-x); glEnd(); }void myidle() { ::Sleep(1000); _strtime(timebuffer);//取系统时间到timebuffer数组中for(int i=0;i<9;i++)hour=((int)timebuffer[0]-48)*10+((int)timebuffer[1]-48);miniter=((int)timebuffer[3]-48)*10+((int)timebuffer[4]-48);second=((int)timebuffer[6]-48)*10+((int)timebuffer[7]-48);sangle=(float)(3.1415/2-(float)second*2*3.1415/60);mangle=(float)3.1415/2-(float)(miniter+(float)second/60)/60*2*3.1415;hangle=(float)3.1415/2-(float)(hour+(float)(miniter+(float)second/60)/60)*2*3.1415/12; glutPostRedisplay();void Reshape(int w, int h){ww=w;hh=h;glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-20, (GLdouble) w, -180.0, (GLdouble) h); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}void change() //改变颜色{ br=0.0,bg=255.0,bb=0.0;sr=0.0,sg=255.0,sb=0.0;}void resume() //恢复颜色{ br=0.0,bg=0.0,bb=0.0;sr=1.0,sg=1.0,sb=0.0;}void processMenuEvents(int option){switch (option){case changecolor:change();break;case resumecolor:resume();break;case quit:exit(0);break;}}void createGLUTMenus(){int menu;menu = glutCreateMenu(processMenuEvents); glutAddMenuEntry("交换颜色",changecolor); glutAddMenuEntry("恢复颜色",resumecolor); glutAddMenuEntry("退出",quit);glutAttachMenu(GLUT_RIGHT_BUTTON);int main(int argc, char** argv){glutInit(&argc, argv);glutInitWindowPosition(0, 0);glutInitWindowSize(winheight,winwidth); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutCreateWindow("计算机-11--2---蔡丰");Myinit();glutDisplayFunc(Display);glutIdleFunc(myidle);glutReshapeFunc(Reshape);createGLUTMenus();glutMainLoop();return 0;}。