时钟综合实验,南京理工大学紫金学院单片机实验报告
单片机时钟显示实训报告
一、实训背景随着科技的不断发展,单片机技术得到了广泛应用。
单片机具有体积小、成本低、功能强大等特点,因此在电子设备中得到了广泛的应用。
本实训旨在通过设计一个基于单片机的时钟显示系统,让学生了解单片机的原理、编程方法和接口电路设计,提高学生的实践能力和创新意识。
二、实训目的1. 掌握单片机的原理和编程方法;2. 熟悉单片机的接口电路设计;3. 学会使用LCD液晶显示器和按键进行人机交互;4. 提高学生的实践能力和创新意识。
三、实训内容1. 硬件设计(1)硬件组成:本实训采用AT89C51单片机作为核心控制单元,使用LCD1602液晶显示器进行时间显示,并使用DS1302实时时钟芯片提供准确的时间。
(2)电路设计:① AT89C51单片机电路:包括电源电路、晶振电路、复位电路等;② DS1302实时时钟芯片电路:包括电源电路、时钟晶振电路、数据通信电路等;③ LCD1602液晶显示器电路:包括电源电路、数据通信电路等;④ 键盘电路:包括按键输入电路和单片机接口电路。
2. 软件设计(1)软件组成:本实训的软件设计包括主程序、按键扫描程序、时间显示程序和DS1302时钟读取程序。
(2)程序设计:① 主程序:负责系统初始化、按键扫描、时间显示和DS1302时钟读取等功能;② 按键扫描程序:负责检测按键是否被按下,并根据按键输入进行相应操作;③ 时间显示程序:负责将DS1302实时时钟芯片读取的时间显示在LCD1602液晶显示器上;④ DS1302时钟读取程序:负责从DS1302实时时钟芯片读取当前时间。
3. 系统调试(1)硬件调试:连接好硬件电路,检查各个模块的连接是否正确,并进行必要的调试;(2)软件调试:使用Proteus软件进行仿真调试,确保程序能够正常运行。
四、实训过程1. 硬件制作(1)根据电路原理图,焊接好各个模块的电路板;(2)将各个模块连接到单片机上,并检查连接是否正确。
2. 软件编写(1)使用Keil C51软件编写程序;(2)将编写好的程序烧录到单片机中。
时钟综合实验,南京理工大学紫金学院单片机实验报告
单片机实验报告实验名称:时钟综合实验姓名:学号:班级:通信时间:2013.12南京理工大学紫金学院电光系一、实验目的1、学习Proteus软件基本使用方法;2、掌握定时/计数器与外部中断工作原理;3、学习设计单片机控制的多位数码管扫描显示电路;4、理解数码管动态显示的原理。
二、实验原理AT89C51单片机为控制器,八位7段数码管分别显示小时的十位、小时的个位、连接符、分的十位、分的个位、连接符、秒的十位和秒的个位,其中数码管的位选口为P2口,段选口为P0口,小时、分和秒的能动态显示。
定时器实现1秒准确定时,外部中断0引脚外接键盘BUTTON1,实现手动校分功能;外部中断1外接键盘BUTTON2,实现清零功能。
三、实验内容根据实验任务设计要求,在Keil软件中实现程序编辑、编译与执行等操作。
对编译通过的过程可选择单步调试的方式来观察运行的结果,以及各个寄存器的值如何变化。
参考程序流程:主程序流程:开始→变量赋初值→定时器T1赋计数初值→设置外部中断控制字→开中断→开计数器→送位选字→送段选码→延时→送位选字,定时器T1中断流程:定时器T1赋计数初值→到1秒了吗?→Y秒加1 or N结束→到1分钟了吗?→Y秒清零 or N结束→分钟加1→到60分钟了吗?→Y分钟清零 or N结束→结束,外部中断0流程:分钟加1→到60分钟了吗?→Y分钟清零 or N结束→结束,外部中断1:分钟清零→秒清零→结束。
1、程序代码:#include<reg51.h>#define uint unsigned int#define uchar unsigned char//共阳 0-9uchar dis_dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar k,second,minute,secondl,secondh,minutel,minuteh;void init(){k=20;second=0;minute=0;secondl=0;minutel=0;secondh=0;minuteh=0;}void Timeinit(){TMOD=0x10;TH1=(65536-46082)/256;TL1=(65536-46082)%256;TR1=1;EA=1;ET1=1;EX0=1;EX1=1;IT0=1;IT1=1;}void delay(){uchar i,j;for(i=0;i<50;i++)for(j=0;j<100;j++);}void display(uchar a,b,c,d){P2=0x1f;P0=dis_dat[a];delay();P2=0x2f;P0=dis_dat[b];delay();P2=0x4f;P0=dis_dat[c];delay();P2=0x8f;P0=dis_dat[d];delay();}void main(){Timeinit();init();while(1){minuteh=minute/10;minutel=minute%10;secondh=second/10;secondl=second%10;display(minuteh,minutel,secondh,secondl); }}void Time1()interrupt 3{TH1=(65536-46082)/256;TL1=(65536-46082)%256; k--;if(k==0){k=20;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;second=0;}}}}void int_0()interrupt 0 {minute++;if(minute==60){minute=0;}}void int_1()interrupt 2 {minute=0;second=0;}2.实验原理图四、小结与体会通过此次实验我学会了利用定时/计数器与外部中断的工作原理,设计了一个简单的时钟,具备小时,分,秒计时与显示功能。
单片机电子时钟(LCD显示)综合实验报告
单片机综合实验报告题目:电子时钟(LCD)显示一、实验内容:以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:●使用字符型LCD显示器显示当前时间。
●显示格式为“时时:分分:秒秒”。
●用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。
功能键K1~K4功能如下。
●K1—进入设置现在的时间。
●K2—设置小时。
●K3—设置分钟。
●K4—确认完成设置。
程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。
二、实验电路及功能说明1)单片机主控制模块以AT89C51单片机为核心进行一系列控制。
2)时钟显示模块用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连,连接后用初始化程序对其进行简单的功能测试。
测试成功后即可为实验所用,如图:3)时间调整电路用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。
功能键K1~K4功能如下。
K1—进入设置现在的时间。
K2—设置小时。
K3—设置分钟。
K4—确认完成设置。
如图:三、实验程序流程图:主程序:时钟主程序流程子程序:四、实验结果分析实验结果及分析:单片机的晶振可以根据要求设定。
6MHZ为和现实时间显示相同。
实验采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。
当烧入程序后开始运行,根据初始值设定可以观察到显示的时间,这里为了更明显观察显示数据变化把起始值设为23:59:50 运行后显示,K1为进入现在设置时间,当按下K1后显示,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设置的功能;不同之处: 当进入时间设置时在按下K1设置小时,再次按下K1是设置分钟。
增加功能:进入时间设置并选择设置位置后K2键位数字增加功能,K3键为数字减小功能。
根据仿真结果能够确定编程正确,基本实现了所有功能,而且有所改进。
单片机数字时钟实验报告
数字时钟实验报告一、实验目的:通过实验进一步深刻理解单片机最小系统的工作原理。
着重掌握中断和定时器的使用,以及读键盘和LED显示程序的设计(具体设计在后面会涉及到)。
培养动手能力。
二、实验内容:使用单片机最小系统设计一个12小时制自动报时的数字时钟。
三、功能描述:★使用低六位数码管显示时、分、秒、使用第七位表示上午和下午。
符号A表示上午;符号P表示下午。
★通过按键分别调整小时位和分钟位。
★到达整点时以第八位数码管闪烁的方式报时,使用8作为显示内容。
★考虑整点报时功能。
四、设计整体思路以及个别重点部分的具体实现方式:下面这幅图展示主函数的流程下面描述的是调用T0中断时所进行的动作显示更新的函数具体见下面这幅图我们还一个对键盘进行扫描以获得有效键盘值,其具体的实现见下面这幅图● 要实现时钟的运行和时间的调整,我的设计思路是这样的:由于T0中断的时间间隔是4ms,那么我可以设置一个计数器i,在每次进入中断时进行加一调整,当i计满面250时就将时钟我秒的低位加一。
然后根据进位规则,对其后的各位依次进行调整。
●要实现整点报时功能,则可以根据时位是否为0判断是否要闪烁显示字符8。
至于闪烁的具体实现方式,见源程序。
至此,本实验的设计思路己基本介绍完毕。
下面就是本次实验的源程序代码。
/*********************************************************//** 数字时钟程序**//** **//*********************************************************/#include <absacc.h>#include <reg51.h>#define uchar unsigned char#define uint8 unsigned char#define uint16 unsigned int#define LED1 XBYTE [0xA000] //数码管地址#define LED2 XBYTE [0xA001]#define LED3 XBYTE [0xA002]#define LED4 XBYTE [0xA003]#define LED5 XBYTE [0xA004]#define LED6 XBYTE [0xA005]#define LED7 XBYTE [0xA006]#define LED8 XBYTE [0xA007]#define KEY XBYTE [0xA100] //键盘地址bit ap=0;//上下午int i=0;//计数器uchar data clock[7]={0,0,0,0,0,0,0};/*扫描键盘使用的变量 */sbit first_row = P1^4; //键盘第一行控制sbit second_row = P1^3; //键盘第二行控制bit first_getkey = 0,control_readkey = 0; //读键盘过程中的标志位bit getkey = 0; //获得有效键值标志位等于1时代表得到一个有效键值bit keyon = 0; //防止按键冲突标志位uchar keynum = 0; //获得的有效按键值寄存器/*数码管显示使用的变量和常量*/uchar lednum = 0; //数码管显示位控制寄存器uchar led[8] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D","E", "F", "P" ,"black"void leddisp(void); //数码管显示函数void readkey(void); //读键盘函数void intT0() interrupt 1 //T0 定时中断处理函数{TH0 = -2720/256; //定时器中断时间间隔 4msTL0 = -2720%256;if((clock[2]==0)&&(clock[3]==0)&&(i==125)&&(clock[5]<=5)&&(clock[4]==0))led[7]=17;if((clock[2]==0)&&(clock[3]==0)&&(i==0)&&(clock[5]<=5)&&(clock[4]==0))led[7]=8;i=i+1;if(i==250){if((clock[2]==0)&&(clock[3]==0)&&(clock[4]==0)&&(clock[5]==0)&&(clock[6]==0)){ap=!ap;if(ap==0)led[6]=10;if(ap==1)led[6]=16;}clock[5]=clock[5]+1;i=0;}if(clock[5]==10){clock[5]=0;clock[4]=clock[4]+1;}if(clock[4]==6){clock[4]=0;clock[3]=clock[3]+1;}if(clock[3]==10){clock[3]=0;clock[2]=clock[2]+1;}if(clock[2]==6){clock[2]=0;clock[6]=clock[6]+1;}if(clock[6]==12){clock[6]=0;}clock[0]=clock[6]/10;clock[1]=clock[6]%10;led[5]=clock[0];led[4]=clock[1];led[3]=clock[2];led[2]=clock[3];led[1]=clock[4];led[0]=clock[5];leddisp(); //每次定时中断显示更新一次if(control_readkey == 1) //每两次定时中断扫描一次键盘{readkey();}c ontrol_readkey = !control_readkey;}void main(void){TMOD = 0x01; //TH0 = -2720/256; //定时器中断时间间隔 4msTL0 = -2720%256;TCON = 0x10;ET0 = 1;EA = 1;while(1){if(getkey == 1) //判断是否获得有效按键{getkey = 0;switch(keynum) //判断键值,对不同键值采取相应的用户定义处理方式{case 0x01: //当按下第一行第二列键时,分加一clock[3]=clock[3]+1;break;case 0x02: ////当按下第一行的第三列键时,分减一clock[3]=clock[3]-1;break;case 0x03://当按下第一行的第四列时,时加一clock[6]=clock[6]+1;break;case 0x04:clock[6]=clock[6]-1; //当按下第一行的第五列时,时减一break;default:break;}}}}/***************************************************键盘扫描函数原型: void readkey(void);功能: 当获得有效按键时,令getkey=1,keynum为按键值****************************************************/void readkey(void){uchar M_key = 0;second_row = 0;M_key = KEY;if(M_key != 0xff) //如果有连续两次按键按下,认为有有效按键按下。
单片机设计时钟实训报告
一、引言随着科技的不断发展,单片机技术在电子领域得到了广泛的应用。
为了提高学生的实践能力,培养实际工程应用能力,我们进行了单片机设计时钟实训。
本实训以AT89C51单片机为核心,通过学习时钟电路的设计、编程和调试,使学生掌握单片机在时钟设计中的应用,提高学生的动手能力和创新思维。
二、实训目的1. 掌握单片机的基本原理和编程方法;2. 熟悉时钟电路的设计和调试;3. 培养学生的实际工程应用能力和创新思维;4. 提高学生的团队协作能力和沟通能力。
三、实训内容1. 硬件设计(1)单片机选型:选用AT89C51单片机作为核心控制单元;(2)时钟电路:采用晶振电路作为时钟源,实现1Hz的基准时钟;(3)显示电路:采用LCD1602液晶显示屏,实现时间、日期和星期等信息显示;(4)按键电路:设计4个按键,分别用于设置时间、日期、星期和闹钟功能;(5)复位电路:采用上电复位和按键复位两种方式,保证系统稳定运行。
2. 软件设计(1)系统初始化:初始化单片机,设置波特率、定时器等;(2)时间显示:通过读取实时时钟芯片(如DS1302)的数据,显示时间、日期和星期;(3)按键处理:根据按键输入,实现时间、日期、星期和闹钟的设置与修改;(4)闹钟功能:当设定的时间到达时,通过蜂鸣器发出提示音。
3. 调试与优化(1)调试方法:使用Proteus软件进行仿真调试,观察程序运行状态,分析故障原因;(2)优化方法:针对仿真过程中出现的问题,优化程序代码,提高程序运行效率。
四、实训过程1. 硬件制作(1)按照设计图纸,焊接电路板;(2)连接晶振、LCD显示屏、按键和蜂鸣器等元器件;(3)调试电路,确保各元器件正常工作。
2. 软件编写(1)使用Keil C51软件编写程序,实现时钟显示、按键处理和闹钟功能;(2)编译程序,生成HEX文件。
3. 调试与优化(1)使用Proteus软件进行仿真调试,观察程序运行状态;(2)针对仿真过程中出现的问题,优化程序代码,提高程序运行效率;(3)将优化后的程序烧录到单片机中,进行实际运行测试。
单片机数码时钟实训报告
一、实训目的本次单片机数码时钟实训旨在通过实际操作,让学生了解单片机的应用,掌握单片机数码时钟的设计与实现方法,提高学生的实践操作能力和创新思维。
二、实训内容1. 硬件设计(1)单片机:选用AT89C51单片机作为核心控制器。
(2)显示模块:采用4位数码管,实现时分秒的显示。
(3)时钟模块:采用12MHz晶振作为时钟源,通过单片机的定时器/计数器实现秒、分、时的计时。
(4)按键模块:设计启动/停止按钮、设置按钮、清零按钮等,实现对时钟的控制和设置。
(5)电源模块:采用5V电源适配器为系统供电。
2. 软件设计(1)主程序:初始化单片机,设置定时器/计数器,实现时分秒的计时。
(2)中断服务程序:实现按键控制、时间设置、清零等功能。
(3)显示程序:将计时的时分秒数据转换为数码管显示的格式。
三、实训过程1. 硬件搭建(1)按照电路图连接AT89C51单片机、数码管、晶振、按键等元件。
(2)检查电路连接是否正确,确保无短路、断路等现象。
2. 软件编写(1)编写主程序,初始化单片机,设置定时器/计数器,实现时分秒的计时。
(2)编写中断服务程序,实现按键控制、时间设置、清零等功能。
(3)编写显示程序,将计时的时分秒数据转换为数码管显示的格式。
3. 调试与测试(1)将编写好的程序烧录到单片机中。
(2)打开电源,观察数码管显示的时分秒是否正确。
(3)测试按键控制功能,包括启动/停止、设置、清零等。
(4)测试时间设置功能,包括小时、分钟、秒的设置。
四、实训结果1. 硬件方面:成功搭建了单片机数码时钟的硬件电路,包括单片机、数码管、晶振、按键等元件。
2. 软件方面:成功编写了单片机数码时钟的程序,实现了时分秒的计时、按键控制、时间设置等功能。
3. 功能实现:数码时钟能够正常显示时分秒,并通过按键控制实现启动/停止、设置、清零等功能。
五、实训总结1. 通过本次实训,使学生掌握了单片机数码时钟的设计与实现方法,提高了学生的实践操作能力和创新思维。
单片机实验电子钟报告
实验四 电子钟(定时器、中断综合实验)一、实验目的熟悉MCS51类CPU 的定时器、中断系统编程方法, 了解定时器的应用、实时程序的设计和调试技巧。
二、实验内容编写一个时钟程序, 产生一个50ms 的定时中断, 对定时中断计数, 将时、分、秒显示在数码管上。
三、程序框图主程序中断处理电子钟程序框图四、实验步骤 1.连线说明: E5 区A0 ←→ A3 区A0 E5 区CS ←→ A3 区CS5 E5 区CLK ←→ B2 区2MHzE5 区A.B.C.D ←→ G5 区A.B.C.D (排线每个8 位, 注意高低位一致) 2.时间显示在数码管上五、程序清单 ms50 DATA 31H ;存放多少个50ms sec DATA 32H ;秒 min DATA 33H ;分hour DATA 34H ;时buffer DATA 35H ;显示缓冲区EXTRN CODE(Display8)ORG 0000HLJMP STARORG 000BH ;定时器T0中断处理入口地址LJMP INT_Timer0ORG 0100HSTAR: MOV SP,#60H ;堆栈MOV ms50,A ;清零ms50MOV hour,#12 ;设定初值: 12:59:50MOV min,#59MOV sec,#50MOV TH0,#60 ;定时中断计数器初值MOV TL0,#176 ;定时50msMOV TMOD,#1 ;定时器0: 方式一MOV IE,#82H ;允许定时器0中断SETB TR0 ;开定时器T0STAR1: LCALL Display ;调用显示JNB F0,$CLR F0SJMP STAR1 ;需要重新显示时间;中断服务程序INT_Timer0: MOV TL0,#176-5MOV TH0,#60PUSH 01HMOV R1,#ms50INC @R1 ;50ms单元加1CJNE @R1,#20,ExitIntMOV @R1,#0 ;恢复初值INC R1INC @R1 ;秒加1CJNE @R1,#60,ExitInt1MOV @R1,#0INC R1INC @R1 ;分加1CJNE @R1,#60,ExitInt1MOV @R1,#0INC R1INC @R1 ;时加1CJNE @R1,#24,ExitInt1MOV @R1,#0ExitInt1: SETB F0ExitInt: POP 01HRETIHexToBCD: MOV B,#10DIV ABMOV @R0,BINC R0MOV @R0,AINC R0RETDisplay: MOV R0,#bufferMOV A,secACALL HexToBCDMOV @R0,#10H ;第三位不显示INC R0MOV A,minACALL HexToBCDMOV @R0,#10H ;第六位不显示INC R0MOV A,hourACALL HexToBCDMOV R0,#bufferLCALL Display8RETENDEXTRN CODE (Display8)BUFFER DA TA 60HORG 0000HAJMP MAINORG 000BHAJMP IT0PMAIN: MOV TMOD,#01HMOV 20H,#20HCLR AMOV 52H,A ;计数和显示MOV 51H,A ;空间清零MOV 50H,#50HMOV 40H,AMOV 41H,AMOV 43H,AMOV 44H,AMOV 46H,AMOV 47H,ASETB ET0SETB EAMOV TH0,#9EH ;计数器赋初值MOV TL0,#58HSETB TR0MOV 45H,#11HMOV 42H,#11HMOV R0,#BUFFERLCALL Display8HERE: AJMP HEREIT0P: PUSH PSWPUSH ACCMOV TH0,#9EH ;重新转入计数值MOV TL0,#58HDJNZ 20H,RETURN ;计数不满20返回MOV 20H,#20H ;重置中断次数MOV A,#01H ;秒加1ADD A,50HDA A ;秒单元十进制调制PUSH ACCCJNE A,#60H,SWS ;是否到60秒, 否则返回MOV A,#00HSWS: MOV R5,ASW AP AANL A,#0FHMOV 41H,AMOV A,R5ANL A,#0FHMOV 40H,A ;满60秒, 秒单元清零LCALL AAAPOP ACCMOV 50H,ACJNE A,#60H,RETURNMOV 50H,#00HMOV A,#01H ;分单元加1ADD A,51H ;分单元十进制调整DA APUSH ACCCJNE A,#60H,SWS1;是否到60分, 否则返回MOV A,#00HSWS1: MOV R5,A·SW AP AANL A,#0FHMOV 44H,AMOV A,R5ANL A,#0FHMOV 43H,ALCALL AAAPOP ACCMOV 51H,ACJNE A,#60H,RETURNMOV 51H,#00H ;满60分, 分单元清零MOV A,#01H ;时单元加1ADD A,52HDA APUSH ACCCJNE A,#24H,SWS2 ;是否到24小时, 否则返回MOV A,#00HSWS2: MOV R5,ASW AP AANL A,#0FHMOV 47H,AMOV A,R5ANL A,#0FHMOV 46H,ALCALL AAAPOP ACCMOV 52H,ACJNE A,#24H,RETURNMOV 52H,#00H ;满24小时, 时单元清零RETURN:POP PSWPOP ACCRETIAAA: MOV R0,#40H ;计数器的值赋MOV R1,#60H ;给显示空间MOV R5,#08HABC: MOV A,@R0MOV @R1,AINC R1INC R0DJNZ R5,ABCMOV R0,#BUFFERLCALL Display8RETEND六、思考题1.电子钟走时精度与哪些有关系?中断程序中给TL0赋值为什么与初始化程序中不一样?2、使用定时器方式二, 重新编写程序。
单片机电子钟实训报告
一、引言随着电子技术的不断发展,单片机在各个领域得到了广泛的应用。
电子钟作为单片机应用的一个重要实例,具有很高的实用价值。
本实训报告主要介绍了单片机电子钟的设计与实现过程,包括硬件电路设计、软件编程以及调试过程。
二、硬件电路设计1. 单片机选择本实训选用AT89C51单片机作为核心控制器,该单片机具有丰富的I/O端口、较强的计算能力和较大的存储空间,能够满足电子钟的设计需求。
2. 时钟芯片本实训采用DS1302时钟芯片作为时间源,该芯片具有年、月、日、周、时、分、秒的精确计时功能,并具备闰年补偿等功能。
3. 液晶显示屏本实训选用1602液晶显示屏用于显示时间、日期等信息。
1602液晶显示屏具有清晰显示多个字符和符号的特点,方便用户查看时间和其他信息。
4. 按键模块本实训设计按键模块用于用户输入和设置。
按键包括时间设置键、日期设置键、闹钟设置键等,方便用户进行各项操作。
5. 电源模块本实训采用DC5V电源模块,为整个电子钟提供稳定的电源供应。
三、软件编程1. 主程序主程序负责初始化单片机、时钟芯片、液晶显示屏等硬件设备,并进入主循环。
主循环中,程序会不断检测按键状态,根据按键输入调整时间、日期和闹钟设置。
2. 时钟控制程序时钟控制程序负责实现时钟的基本功能,包括计时、闰年补偿等。
程序通过定时器中断,每秒更新一次时间。
3. 显示程序显示程序负责将时间、日期等信息显示在液晶显示屏上。
程序使用1602液晶显示屏的指令集,动态显示时、分、秒和日期。
4. 按键扫描程序按键扫描程序负责检测按键状态,并根据按键输入调整时间、日期和闹钟设置。
程序采用轮询方式检测按键状态,以提高按键响应速度。
5. 闹钟程序闹钟程序负责实现闹钟功能,当时间达到设定的闹钟时间时,电子钟会发出蜂鸣声提示用户。
四、调试过程1. 硬件调试首先,对硬件电路进行调试,检查各元器件是否安装正确,连接是否牢固。
然后,使用万用表检测电源电压、单片机各引脚电压是否正常。
单片机电子钟实验报告
单片机电子钟实验报告单片机电子钟实验报告引言:单片机是一种集成电路,具有微处理器的功能。
它广泛应用于各种电子设备中,包括电子钟。
在这个实验中,我们通过使用单片机和其他电子元件,成功地制作了一台电子钟。
本报告将详细介绍我们的实验过程、结果和总结。
实验目的:我们的实验目的是设计和制作一台精确可靠的电子钟。
通过这个实验,我们希望了解单片机的基本原理和应用,同时提高我们的电路设计和焊接能力。
实验步骤:1. 准备工作:我们首先收集了所需的材料和工具,包括单片机、晶振、电容、电阻、显示器等。
然后,我们仔细阅读了单片机的技术规格和电路图。
2. 电路设计:根据单片机的技术规格和电路图,我们开始设计电路。
我们确定了电源电压、电路连接方式和元件数值。
然后,我们使用仿真软件验证了我们的设计。
3. 焊接电路板:在确认电路设计无误后,我们开始焊接电路板。
我们小心翼翼地将元件焊接到电路板上,并确保焊接点牢固可靠。
焊接完成后,我们使用万用表对焊接点进行了测试。
4. 编程:接下来,我们使用C语言编写了单片机的程序。
我们根据电路的功能需求,编写了显示时间、闹钟设置、闹钟响铃等功能的代码。
然后,我们使用编程器将程序烧录到单片机中。
5. 调试:在完成编程后,我们对电路进行了调试。
我们逐一测试了各个功能,确保电子钟的正常运行。
我们检查了显示、闹钟和时间设置等功能,并进行了一系列的测试。
实验结果:经过我们的不懈努力,我们成功地制作了一台功能完善的电子钟。
它能够精确显示时间,并具备闹钟功能。
在我们的测试中,电子钟的运行稳定,显示清晰可见。
实验总结:通过这个实验,我们深入了解了单片机的工作原理和应用。
我们学会了电路设计、焊接和编程等技能。
通过实际操作,我们提高了自己的动手能力和问题解决能力。
然而,我们也遇到了一些挑战。
在焊接电路板时,我们需要小心操作,以避免短路或焊接不牢固。
在编程过程中,我们需要仔细调试,以确保程序的正确性。
在未来的学习中,我们将进一步探索单片机的应用领域,并不断提高自己的技术水平。
单片机多功能时钟实验报告
单片机多功能时钟实验报告实验目的:1.掌握单片机的基本原理和使用方法;2.学习使用单片机实现多功能时钟功能;3.熟悉各种外设的接口和控制;4.提高团队合作和实践能力。
实验原理:本实验设计一个多功能时钟,包括显示时间、日期、闹钟设置和倒计时等功能。
其中,时钟和日期部分主要通过实时时钟模块和数码管实现,闹钟设置通过按键控制和时间比较实现,倒计时通过计时器模块和数码管实现。
实验器材和软件:硬件:STC89C52单片机、DS1302实时时钟模块、数码管、按键、电源、电阻、电容等;软件:Keil C51集成开发环境。
实验步骤:1.将STC89C52单片机与DS1302实时时钟模块以及数码管等器件按照电路图连接起来;2. 使用Keil C51编写程序代码,包括时钟和日期显示、按键输入检测、闹钟设置和倒计时等功能;4.调试成功后,将单片机与显示模块连接,观察时钟和日期显示是否正确;5.进行按键测试,验证闹钟设置和倒计时功能是否正常;6.完成以上步骤后,整理实验结果并撰写实验报告。
实验结果:经过实验,我们成功实现了多功能时钟的设计。
数码管正确显示了当前的时钟和日期信息,并能够通过按键设置闹钟和倒计时功能。
测试结果表明,时钟和日期显示准确无误,闹钟设置和倒计时功能正常可用。
实验总结:通过本次实验,我们深入了解了单片机的基本原理和使用方法,并掌握了多功能时钟的实现原理和方法。
在实验过程中,我们充分发挥了团队合作和实践能力,共同解决了实验中遇到的问题。
通过实验,我们不仅加深了对单片机的理解,更提高了编程和电路设计的能力。
总体而言,本次实验让我们更加熟悉了单片机的应用,并对多功能时钟有了更加全面的了解。
在今后的学习和实践中,我们将充分运用所学知识,不断提升自己的能力。
单片机综合实验报告
一、实验内容:设计一个数字时钟,显示范围为00:00:00~23:59:59。
通过5个开关进行控制,其中开关K1用于切换时间设置(调节时钟)和时钟运行(正常运行)状态;开关K2用于切换修改时、分、秒数值;开关K3用于使相应数值加1调节;开关K4用于减1调节;开关K5用于设定闹钟,闹钟同样可以设定初值,并且设定好后到时间通过实验箱音频放出一段乐曲作为闹铃。
选做增加项目:还可增加秒表功能(精确到0.01s)或年月日设定功能。
电路:(只连粗实线部分)二、实验电路及功能说明数码LED显示器电路(不需接线)电子音响电路按键键名功能说明K1 切换键校分后切换到校时校时后切换到时钟状态闹钟设定分值后切换到设定时值闹钟设定时值后切换到时钟状态K2 校时进入校时状态K3 加1键校分或校时的时候使其加1递增K4 减1键校分或校时的时候使其减1递减K5 闹钟设定键进入闹钟设定状态三、实验程序流程图:本实验设计了基于单片机的多功能数字钟的总体方案,对装置软、硬件的设计作了详细研究,并进行了相应的软件和硬件调试。
该数字钟采用AT89C51单片机作为核心控制芯片,完成整点报时、显示、定时功能。
整个系统分为几个小的电路,分别实现各自的功能。
晶振电路,12MHZ晶振和两个30pF 电容构成并连谐振接到X1和X2口。
复位电路,在RST复位输入引脚上接一10uF电容至VCC端,下接一个51K电阻到地。
控制电路,4个按键控制,进行调时,定时,复位操作。
显示电路,用6位7段数码管进行时,分,秒的显示。
装置中软件设计部分包括一个主程序、四个模块程序和二个子程序,各自执行自己的功能,完成定时,调时等设操作。
本文从整体到部分详细介绍了数字钟的设计,在比较重要的部分进行了详细的论述,并且给出了程序框图及说明。
软件程序整个流程图如下:四、实验结果分析定时程序设计:单片机的定时功能也是通过计数器的计数来实现的,此时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲,也就是每经过1个机器周期的时间,计数器加1。
定时器及外部中断实验,南京理工大学紫金学院单片机实验报告
开始
定时器赋初值
变量初始化
i--
TMOD 初始化
i=0?
TMOD=0x01;
(c)外部中断流程
TH0=(65536-46082)/256; TL0=(65536-46082)%256; EA=1; ET0=1; TR0=1; TF0=0; EX0=1; IT0=0; EX1=1; IT1=0; P1=0xff; a=0; while(1) {
b=a+(a/10*6); P1=b; if(b==160) { a=0; } } } void T0_time()interrupt 1 { TH0=(65536-46082)/256; TL0=(65536-46082)%256; num++; if(num==20) {
a++
定时器赋初值
设置外部中断 模式
P2 口显示输出值
(a)主流程图 (b)定时器中断流程图
三、 实验内容
1、 按流程编得代码: #include<reg51.h> #define uchar unsigned char
sbit p32=P3^2; sbit p33=P3^3; uchar num,a; uchar b; void main() {
num=0; a++;
} } void X0()interrupt 0 {
a++; while(!p32); } void X1()interrupt 2 { a=0; while(!p33); } 2、将代码与电路图连接调试仿真,观察到现象:
单片机数字时钟实训报告
一、实训目的本次实训旨在通过设计和实现单片机数字时钟,使学生掌握单片机的基本原理和应用技术,提高学生的动手能力和实践技能。
通过实训,使学生熟悉单片机的硬件结构、编程方法和调试技巧,了解数字时钟的设计原理和实现方法,培养学生的创新意识和团队协作能力。
二、实训内容1. 硬件设计(1)单片机选型:MSP430F5529(2)显示模块:OLED显示屏(3)按键模块:4个按键(4)蜂鸣器模块:蜂鸣器(5)电源模块:电源电路2. 软件设计(1)系统初始化:设置系统时钟、初始化OLED显示屏、按键扫描、蜂鸣器控制等(2)实时时钟(RTC)实现:通过MSP430F5529的RTC模块获取当前时间(3)时间显示:在OLED显示屏上显示年、月、日、时、分、秒等信息(4)整点报时:在整点时刻通过蜂鸣器播放音乐进行报时(5)按键控制:通过按键实现时间的设置、闹钟的设定等功能三、实训过程1. 硬件搭建(1)根据设计图纸,连接MSP430F5529单片机、OLED显示屏、按键、蜂鸣器等元器件(2)搭建电源电路,为单片机和显示屏提供稳定的电源(3)检查连接是否正确,确保电路安全可靠2. 软件编写(1)使用C语言编写程序,实现系统初始化、实时时钟获取、时间显示、整点报时、按键控制等功能(2)编写程序代码,实现各个功能模块的代码(3)调试程序,确保程序运行正确3. 系统调试(1)将程序烧录到MSP430F5529单片机中(2)连接OLED显示屏、按键、蜂鸣器等模块(3)检查系统运行情况,确保各个功能正常(4)调整程序参数,优化系统性能四、实训结果与分析1. 系统功能实现本次实训成功实现了单片机数字时钟的功能,包括时间显示、整点报时、按键控制等。
系统运行稳定,各项功能正常。
2. 系统性能分析(1)实时时钟获取:通过MSP430F5529的RTC模块获取当前时间,精度较高(2)时间显示:OLED显示屏显示清晰,信息完整(3)整点报时:在整点时刻通过蜂鸣器播放音乐进行报时,声音清晰(4)按键控制:通过按键实现时间的设置、闹钟的设定等功能,操作方便3. 系统优化(1)优化程序代码,提高程序运行效率(2)改进显示效果,提高用户体验(3)增加闹钟功能,实现定时提醒五、实训总结1. 通过本次实训,使学生掌握了单片机的基本原理和应用技术,提高了学生的动手能力和实践技能2. 学生学会了如何使用MSP430F5529单片机设计数字时钟,了解了数字时钟的设计原理和实现方法3. 学生培养了创新意识和团队协作能力,为今后的学习和工作打下了良好的基础4. 实训过程中,学生遇到了各种问题,通过查阅资料、讨论和请教老师,最终解决问题,提高了学生的解决问题的能力5. 本次实训使学生认识到理论知识与实践相结合的重要性,激发了学生的学习兴趣,为今后的学习和工作奠定了基础。
单片机电子钟实习实训报告
单片机电子钟实习实训报告一、前言随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。
为了更好地了解和掌握单片机原理及应用,提高我们的动手能力,学校组织了一次单片机电子钟实习实训。
本次实习实训的目标是设计并制作一个基于单片机的电子钟,实现小时、分钟和秒的显示,同时具备校时功能。
二、实习实训内容1. 了解单片机的基本原理和工作原理,熟悉单片机的编程环境和编程语言。
2. 学习电子钟的设计原理,掌握电子钟的显示方式、时间计算方法和校时功能实现方法。
3. 设计并制作电子钟的硬件电路,包括单片机、显示模块、按键模块等。
4. 编写电子钟的程序代码,实现小时、分钟和秒的显示,以及校时功能。
5. 进行电路仿真和实际制作,调试并优化电路性能。
三、实习实训过程1. 理论学习和准备:在实习实训开始前,我们学习了单片机的基本原理、编程环境和编程语言,了解了电子钟的设计原理和实现方法。
2. 硬件设计:根据设计要求,我们设计了一个简单的电子钟硬件电路,包括单片机、LCD显示模块、按键模块等。
其中,单片机作为核心控制器,负责时间计算和显示控制;LCD显示模块用于显示时间;按键模块用于实现校时功能。
3. 程序编写:根据硬件设计,我们编写了一个简单的电子钟程序,实现了小时、分钟和秒的显示,以及校时功能。
程序采用C语言编写,利用单片机的定时器进行时间计算,通过I/O口控制LCD显示模块和按键模块。
4. 电路仿真和实际制作:在完成程序编写后,我们使用Proteus软件对电路进行了仿真,验证了电路设计的正确性和可靠性。
随后,我们根据仿真结果实际制作了电子钟电路,并进行了调试和优化。
四、实习实训成果通过本次实习实训,我们成功地设计并制作了一个基于单片机的电子钟,实现了小时、分钟和秒的显示,以及校时功能。
在实习过程中,我们不仅学习了单片机原理和电子钟设计方法,还提高了动手实践能力,为以后的学习和工作打下了坚实的基础。
五、总结本次单片机电子钟实习实训让我们深刻体会到了理论与实践相结合的重要性。
单片机实训报告时钟电路
一、引言随着科技的不断发展,单片机技术在电子设备中的应用越来越广泛。
时钟电路作为单片机应用的一个重要模块,其设计合理与否直接影响到整个系统的稳定性和可靠性。
本次实训旨在通过设计一个基于单片机的时钟电路,掌握单片机在时钟电路中的应用,提高实践操作能力和电路设计能力。
二、实训目的1. 熟悉单片机的基本原理和编程方法。
2. 掌握时钟电路的设计方法和步骤。
3. 学会使用定时器/计数器实现时钟功能。
4. 提高电路焊接和调试能力。
三、实训原理本实训采用AT89C51单片机作为核心控制单元,利用其内置的定时器/计数器实现时钟功能。
具体原理如下:1. 晶振电路:晶振电路产生稳定的高频信号,作为单片机的时钟源。
2. 定时器/计数器:定时器/计数器用于产生时钟脉冲,通过编程设定计数器的初值,实现定时功能。
3. 中断系统:中断系统用于实现闹钟功能,当定时器/计数器计数到设定的时间时,触发中断,执行闹钟功能。
四、系统设计1. 硬件设计(1)晶振电路:采用12MHz晶振,为单片机提供时钟信号。
(2)定时器/计数器:使用定时器/计数器0,工作在模式1(16位定时器/计数器)。
(3)显示模块:使用LCD1602液晶显示器,显示时间、日期和闹钟时间。
(4)按键模块:使用4个按键,分别实现时间设置、闹钟设置、清零和启动/停止功能。
(5)蜂鸣器:用于实现闹钟功能。
2. 软件设计(1)初始化:初始化单片机系统,设置定时器/计数器初值,配置中断系统。
(2)主程序:循环检测按键输入,根据按键功能执行相应操作。
(3)定时器/计数器中断服务程序:定时器/计数器溢出时,调用中断服务程序,更新时间显示,判断是否触发闹钟。
(4)闹钟功能:当设置的时间与当前时间相同时,触发闹钟,蜂鸣器发出声音。
五、电路焊接与调试1. 电路焊接:按照电路原理图,将各个元件焊接在PCB板上。
2. 调试:连接电源,使用示波器检测晶振电路输出波形,使用逻辑分析仪检测定时器/计数器输出波形,确保电路正常工作。
单片机综合实验报告格式实验报告2
单片机综合实验报告格式实验报告2实验报告2:单片机综合实验一、实验目的本实验的目的是通过应用所学的单片机知识,综合运用各种功能模块,设计并实现一个完整的单片机系统。
二、实验器材1. STC89C52单片机开发板2. 七段数码管模块3. LED灯模块4. 蜂鸣器模块5. 按键模块6. 电阻、电容等常规元件7. 万用表等实验工具三、实验原理本实验的设计要求是实现一个闹钟功能,包括当前时间显示、闹钟时间设置和闹钟响铃等功能。
具体实现过程如下:1. 使用七段数码管模块显示当前时间,通过定时器中断实现时间的自动更新。
2. 使用按键模块设置闹钟时间,通过按键中断实现设置的功能。
3. 使用LED灯模块和蜂鸣器模块作为闹钟的响铃指示信号。
四、实验过程1. 确定使用的IO口,连接相应的模块到单片机开发板上。
2. 编写初始化程序,包括定时器的初始化配置,IO口的设置等。
3. 编写定时器中断程序,用于更新时间显示的逻辑。
4. 编写按键中断程序,用于接收设置闹钟时间的信号。
5. 编写闹钟响铃程序,通过控制LED灯和蜂鸣器的开关来实现。
6. 编写主程序,实现整个闹钟功能的循环执行。
五、实验结果经过实验测试,实现了一个完整的闹钟功能,能够准确显示当前时间,并能够根据设置的闹钟时间进行响铃。
六、实验总结通过这次实验,我巩固了单片机的基础知识,并熟悉了各种功能模块的使用方法。
同时,我也学会了如何综合运用这些知识和技能,设计并实现一个完整的单片机系统。
实践中遇到的问题和挑战也促使我进一步提高了解决问题的能力和创新思维。
总的来说,这次实验对我来说是一次很有意义和收获的实践。
单片机多功能时钟实验报告
单片机实验报告2020年4月12日一.实验要求(内容)本实验要求做出时刻显示包括时分秒,可调时刻,日期,日期转动显示,闹铃设置及到时响铃,倒计时,秒表计时和播放音乐等功能.这些功能需要的单片机知识有单片机大体寻址方式及汇编程序设计,按时与中断,数码管扫描显示,键盘扫描检测及音乐播放的大体原理等.二.硬件环境与工作原理(接口地址)设备选择了Atmel的AT89C51,设置波特率38400,频率11.0592MHz,数码管段选地址:8FFFH,数码管位选地址:9FFFH,段选和位选驱动都为高电平有效.蜂鸣器P1.6,为高电平有效.4*4的键盘复用了数码管位选地址8FFFH,写信号(/WR)操纵行,读信号(/RD)操纵列.三.资源利用键盘用了16个.按时中断T0及T1.寄放器R0~R7,贮存器如下.贮存变量概念如下:CLK EQU 20H.0CEK EQU 20H.1HOUR EQU 40HMIN EQU 41HSEC EQU 42H ;存放秒钟变量N EQU 43H ;存放5ms计数值CHH EQU 44HCMM EQU 45HCSS EQU 46H ;闹铃设置秒钟变量RUN EQU 23HDAY EQU 24H ;日期变量MONTH EQU 25HYEARL EQU 26HYEARH EQU 27HBUF1 EQU 28H ;显示缓冲区BUF2 EQU 29HBUF3 EQU 2AHBUF4 EQU 2BHBUF5 EQU 2CHBUF6 EQU 2DHBUF7 EQU 2EHBUF8 EQU 2FHBUF9 EQU 30HBUF10 EQU 31HBUF11 EQU 32HCHH_D EQU 48H ;倒数时间小时数CMM_D EQU 49HCSS_D EQU 4AHSTOP_S EQU 4BH ;秒表STOP_M EQU 4CHSTOP_MS EQU 4DHSEG1 EQU 50H ;数码管SEG2 EQU 51HSEG3 EQU 52HSEG4 EQU 53HSEG5 EQU 54HSEG6 EQU 55HSEG7 EQU 56HSEG8 EQU 57HTEMP EQU 58H ;临时变量;蜂鸣器四.程序原理与框图第一部份是变量概念区,第二部份是主函数,包括初始化和键盘循环检测.第三部份是子函数区,第四部份为常数区.子函数包括按时器初始化,年月日转换,数码管扫描显示,键盘操作,调整时刻,设置闹铃,闹铃时刻转换,检查闹铃是不是到,闹铃到了响应,倒计时程序,日期转换,日期扫描显示,日期设置,闰年判定,秒表子程序,音乐,响音乐时的显示和3个延迟子函数.主函数流程:主函数代码:MAIN:ACALL INITALLACALL INIT_TIMERMAINLOOP: ;循环区ACALL CONVACALL CLK_ONACALL SEG_DISP;设置时刻ACALL KEYBOARD ;DU DI 1 JIANCJNE A,#00H,M1ACALL SET_TIMEJMP MAINLOOP ;设置闹铃时间M1:CJNE A,#01H,M2ACALL SET_CLKJMP MAINLOOPM2: ;闹钟开关CJNE A,#0DH,M3CPL CLKJNB CLK,M2_1 ;闹铃启动LCALL BZLCALL BZJMP MAINLOOPM2_1:LCALL BZ ;闹铃停止JMP MAINLOOPM3: ;设置倒计时CJNE A,#0BH,M4ACALL SET_DOWNJMP MAINLOOPM4: ;滚动日期CJNE A,#0EH,M5ACALL DATE_DISPJMP MAINLOOP ;调整日期M5:CJNE A,#02H,M6ACALL DATA_SETJMP MAINLOOP ;秒表M6:CJNE A,#03H,M7ACALL STOPJMP MAINLOOPM7: CJNE A,#0AH,M8ACALL MUSICJMP MAINLOOPM8:JMP MAINLOOP秒表原理及流程:为了秒表计时的准确,利用了按时器作为时刻源,由于按时器为5ms按时,故先需要对它2分频,采纳奇偶方式分频.然后ms位满100进1,s位满60进1.(流程描述)利用按时器依照频率和距离产生高低转变的方波信号,使扬声器不断置高低电平,从而发声.碰到停止符,那么暂停发声,当下一个音符到来的时候,再打开按时器,继续产生方波,驱动蜂鸣器发音.<<天空之城>>译为频率和距离时刻的十六进制:DB 0FDH,0C6H,02H,0FEH,02H,02HDB 0FEH,2AH,04H,0FEH,02H,02HDB 0FEH,2AH,04H,0FEH,84H,04HDB 0FEH,02H,02HDB 00H,00H,04HDB 0FDH,08H,02H,0FDH,08H,02HMiaobiao:初始化数据Readkey;If(key==start) goto start;If(key==end) goto end;Start:读取定时器N;If(N为偶数) ms加一;Readkey;If(key==pause) goto pause;If(key==end) goto end;Pause:Readkey;If(key==start) goto start;If(key==end) goto end;End:初始化数据;Return;DB 0FDH,0C6H,03H,0FDH,80H,02HDB 0FDH,0C6H,04H,0FEH,2AH,04HDB 0FDH,80H,04DB 00H,00H,04HDB 0FDH,08H,02H,0FDH,08H,02HDB 0FDH,30H,03H,0FDH,08H,02HDB 0FDH,30H,02H,0FEH,2AH,03HDB 0FDH,08H,04HDB 00H,00H,04HDB 0FEH,2AH,02H,0FEH,2AH,02HDB 0FEH,2AH,03H,0FEH,02H,03HDB 0FDH,30H,02H,0FDH,30H,04HDB 0FEH,02H,04H,0FEH,02H,04HDB 0FFH,0FFH五.操作说明键位安排: S0到S15别离代表各键位值;S0为进入时刻设置和完成返回键;S1为进入闹铃设置和完成返回按键;S2为进入日期设置和完成按键;S3为进入秒表和退出按键;S11为进入倒计时和退出键;S4,S8,S12别离为年月日及时分秒家一按键,S5,S9,S13别离为年月日及时分秒减一按键;S6为闹钟开关键;S10为日期转动键,S14为播放音乐按键.具体见图.(键位安排)六.调试与实际运行结果调试结果: 调试进程中没有什么错误.运行结果: 所有功能皆可完美的实现,固然还存在着一些小错误和可改良的地址.能够改良的地址:1.秒表忘记了清零的键,故功能不全,能够加入.2.在音乐响完后蜂鸣器继续发声,尽管解决过,但偶然还会显现问题,缘故不明.3.键盘由于利用次数多而发生不灵的现象,可改变键盘除抖和延迟时刻加以优化.4.按时器1的按时刻隔太短,故系统负荷较重.可更改计时模式,增大距离.编译结果: Program Size: data=8.0 xdata=0 code=5453七.总结与体会这是单片机大体编程练习,未涉及硬件,因此是超级大体的.在实际的工作中,如此的简单程序只能做个电子表,而这种产品已经充满着市场,略微学习过的人都会做,因此是没有经济价值的.故对学习单片机的学习才只是个开头,以后的学习要多向实际应用进展.做他人可不能做的,才能成为高手.这次是用汇编语言做的,而C语言对汇编来讲是有他自己的优势的,因此下次应该练习用C语言写程序,以后学习综合利用C和汇编写程序,才能综合二者优势,提高编程效率.再有,硬件很重要,可不能单片机硬件确实是外行.总之在繁重的专业课之余,找时刻学习单片机!附录:ORG 0000HJMP MAINORG 000BHJMP T0_SRVORG 1000HCLK EQU 20H.0CEK EQU 20H.1HOUR EQU 40HMIN EQU 41HSEC EQU 42H ;存放秒钟变量N EQU 43H ;寄存5ms计数值CHH EQU 44HCMM EQU 45HCSS EQU 46H ;闹铃设置秒钟变量RUN EQU 23HDAY EQU 24HMONTH EQU 25HYEARL EQU 26HYEARH EQU 27HBUF1 EQU 28HBUF2 EQU 29HBUF3 EQU 2AHBUF4 EQU 2BHBUF5 EQU 2CHBUF6 EQU 2DHBUF7 EQU 2EHBUF8 EQU 2FHBUF9 EQU 30HBUF10 EQU 31HBUF11 EQU 32HSEC0 EQU 47H ;存放旧的秒数CHH_D EQU 48H ;倒数时间小时数CMM_D EQU 49HCSS_D EQU 4AHSTOP_S EQU 4BH ;秒表STOP_M EQU 4CHSTOP_MS EQU 4DHSEG1 EQU 50H ;数码管SEG2 EQU 51HSEG3 EQU 52HSEG4 EQU 53HSEG5 EQU 54HSEG6 EQU 55HSEG7 EQU 56HSEG8 EQU 57HTEMP EQU 58H;***************************************主程序区****************************** INITALL:CLR CEKCLR CLKMOV N,#0MOV S EC,#55 ;时刻MOV M IN,#19MOV H OUR,#02MOV CHH,#2 ;闹钟MOV CMM,#20MOV CSS,#0MOV CHH_D,#0 ;倒计时MOV CMM_D,#0MOV CSS_D,#0MOV DAY,#06 ;日期MOV MONTH,#03MOV YEARL,#11MOV YEARH,#20MOV TEMP,#033HRETMAIN:ACALL INITALLACALL INIT_TIMERMAINLOOP: ;循环区ACALL CONVACALL CLK_ONACALL SEG_DISP;设置时刻ACALL KEYBOARD ;DU DI 1 JIAN CJNE A,#00H,M1ACALL SET_TIMEJMP MAINLOOP ;设置闹铃时间M1:CJNE A,#01H,M2ACALL SET_CLKJMP MAINLOOPM2: ;闹钟开关CJNE A,#0DH,M3CPL CLKJNB CLK,M2_1 ;闹铃启动LCALL BZLCALL BZJMP MAINLOOPM2_1:LCALL BZ ;闹铃停止JMP MAINLOOPM3: ;设置倒计时CJNE A,#0BH,M4ACALL SET_DOWNJMP MAINLOOPM4: ;滚动日期CJNE A,#0EH,M5ACALL DATE_DISPJMP MAINLOOP ;调整日期M5:CJNE A,#02H,M6ACALL DATA_SETJMP MAINLOOP ;秒表M6:CJNE A,#03H,M7ACALL STOPJMP MAINLOOPM7: CJNE A,#0AH,M8ACALL MUSICJMP MAINLOOPM8:JMP MAINLOOP;-------------------------按时器T0模式0计时---------------------------INIT_TIMER:;初始化按时器,有效按时器T0模式0计时MOV TMOD,#00H ;设置按时器T0模式0MOV IE,#82H ;启用按时器T0中断产生MOV TL0,#00H ;加载初始化数据MOV TH0,#70HSETB TR0 ;启动按时器0开始计时RETT0_SRV: ;定时器T0中断程序每隔5ms中断一次PUSH ACCMOV TL0,#00H;重加载初始化数据MOV TH0,#70HINC N ;加1;秒输出MOV A,NCJNE A,#200,TT1MOV N,#0INC SEC ;秒计数加1MOV A,SECCJNE A,#60,TT1 ;是不是1min到了;分输出INC MIN ;分计数加1MOV SEC,#0MOV A,MINCJNE A,#60,TT1 ;是不是1h到了;时输出INC HOURMOV MIN,#0MOV A,HOURCJNE A,#24,TT1 ;是否1天到了;天输出INC DAYMOV HOUR,#0MOV DPTR,#MONTHTABMOV A,MONTHMOVC A,@A+DPTRMOV B,DAYCJNE A,B,TT1;月输出;是否1月到了INC MONTHMOV DAY,#1MOV A,MONTHCJNE A,#13,TT1 ;是否1年到了;年输出INC YEARLMOV MONTH,#1MOV A,YEARLCJNE A,#100,TT1INC YEARHMOV YEARL,#0MOV A,YEARHCJNE A,#100,TT1MOV SEC,#0HMOV MIN,#0HMOV HOUR,#0HMOV DAY,#1HMOV MONTH,#1HMOV YEARL,#0HMOV YEARH,#0HTT1: POP ACCRETICONV:MOV D PTR,#SEGTABMOV A,SECMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG2,AMOV A,BMOVC A,@A+DPTRMOV S EG1,AMOV A,MINMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG5,AMOV A,BMOVC A,@A+DPTRMOV S EG4,AMOV A,HOURMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG8,AMOV A,BMOVC A,@A+DPTRMOV S EG7,AJNB CEK,CLKOFFMOV SEG3,#80HMOV SEG6,#80HJMP ENDINGJNB CLK,CLKOFFMOV S EG3,#0C0HMOV S EG6,#0C0HRETCLKOFF:MOV S EG3,#40HMOV S EG6,#40HENDING: RET;-----------------------------数码管扫描显示-------------------------------- SEG_DISP:PUSH 00HPUSH 06HMOV R0,#SEG1MOV R6,#08HMOV A,#00HMOV R2,#01HSEG_LOOP:MOV D PTR,#9FFFHMOV A,@R0INC R0MOVX @DPTR,AMOV D PTR,#8FFFHMOV A,R2MOVX @DPTR,ARL AMOV R2,ALCALL DLY400USMOV A,#00HMOVX @DPTR,ADJNZ R6,SEG_LOOPPOP 06HPOP 00HRET;---------------------4*4键盘区------------------------- KEYBOARD:MOV D PTR,#9FFFHMOV A,#00HMOVX @DPTR,ALCALL KEY_SCANJNZ CHUDOU ;除抖LJMP END_KEYBOARD CHUDOU:LCALL DLY10MSLCALL KEY_SCANJNZ KEY_READ ;扫描LJMP END_KEYBOARDKEY_READ:MOV R3,#01HMOV B,#00HMOV A,R3KP4: MOVX @DPTR,AMOVX A,@DPTRJNB ACC.0,K1MOV A,#00HLJMP KP5K1: JNB ACC.1,K2MOV A,#04HLJMP KP5K2: JNB ACC.2,K3MOV A,#08HLJMP KP5K3: JNB ACC.3,NEXTMOV A,#0CHPUSH ACCKP3: LCALL DLY10MSLCALL KEY_SCANJNZ KP3POP ACCRETNEXT: INC BMOV A,R3JB ACC.3,END_KEYBOARDRL AMOV R3,ALJMP KP4END_KEYBOARD:MOV A,#0FFHRETKEY_SCAN:MOV D PTR,#8FFFHMOV A,#0FHMOVX @DPTR,AMOVX A,@DPTRANL A,#0FHRET;--------------调整时刻子程序-----------------------------------SET_TIME:SETB CEKCLR TR0 ;定时器工作暂停ACALL CONVACALL SEG_DISPKEY0:LCALL SEG_DISP ;扫描显示LCALL KEYBOARDCJNE A,#04H,KEY1 ;未按下S1键,那么继续扫描;S1小时调整INC HOURMOV A,HOURCJNE A,#24,L11 ;是否24小时到了MOV HOUR,#0H ;小时变量清零L11:ACALL CONV ;转换显示数据ACALL SEG_DISP ;扫描显示JMP KEY0KEY1:CJNE A,#08H,KEY3 ;未按下S2键,则继续扫描INC MINMOV A,MINCJNE A,#60,L21 ;是否60min到了MOV MIN,#0H ;分钟变量清零L21:ACALL CONVACALL SEG_DISPJMP KEY0KEY3:CJNE A,#0CH,KEY2 ;未按下S2键,则继续扫描;MIAO调整INC SECMOV A,SECCJNE A,#60,L31 ;是否60MIAO到了MOV SEC,#0H ;变量清零L31:ACALL CONVACALL SEG_DISPJMP KEY0KEY2:CJNE A,#00H,KEY0 ;未按下S3键,那么继续扫描SETB TR0 ;启动按时器CLR CEKRET;----------------设置闹铃时刻-----------------------------------;设置闹铃时刻SET_CLK:ACALL CONVA ;加载闹铃时刻数据N0:ACALL SEG_DISPACALL KEYBOARDCJNE A,#04H,N1 ;未按下S1键那么继续扫描;S1调整小时INC CHHMOV A,CHHCJNE A,#24,N11MOV CHH,#0N11:ACALL CONVAACALL SEG_DISPJMP N0N1:CJNE A,#08H,N2 ;未按下S2键则继续扫描;S2调整分钟MOV A,CMMCJNE A,#60,N21MOV CMM,#0N21:ACALL CONVAACALL SEG_DISPJMP N0N2:CJNE A,#01H,N0 ;未按下S3键则继续扫描;S3设置完成ACALL CONVRET;-------------------------加载闹铃时刻数据----------------------- CONVA:;转换数据MOV DPTR,#SEGTABMOV A,CSSMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG2,AMOV A,BMOVC A,@A+DPTRMOV S EG1,AMOV S EG3,#80HMOV A,CMMMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG5,AMOV A,BMOVC A,@A+DPTRMOV S EG4,AMOV S EG6,#80HMOV A,CHHMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG8,AMOV A,BMOVC A,@A+DPTRMOV S EG7,ARET;-------------------检查闹铃时刻处置--------------------------CLK_ON:JB CLK,TI3RETTI3:MOV A,HOURMOV B,CHHCJNE A,B,BK ;检查闹铃小不时刻MOV A,MINMOV B,CMMCJNE A,B,BK ;检查闹铃分钟时间MOV A,SECMOV B,CSSCJNE A,B,BK ;检查闹铃秒钟时刻ACALL TIME_OUT ;调用执行检查闹铃时间处理子程序BK:RET;---------------------执行闹铃时刻处置----------------------TIME_OUT: ;闹铃时间到了LCALL MUSIC ;蜂鸣器发声MOV TMOD,#00HMOV IE,#82HACALL CONVACALL SEG_DISPRET;********************倒计时程序;设置倒计不时刻SET_DOWN:ACALL DOWN_CONVACALL SEG_DISPS0:ACALL SEG_DISPACALL KEYBOARDCJNE A,#0CH,S12INC CSS_DMOV A,CSS_DCJNE A,#60,S11MOV CSS_D,#0INC CMM_DS11:ACALL DOWN_CONVACALL SEG_DISPJMP S0S12:CJNE A,#0DH,S2DEC CSS_DMOV A,CSS_DCJNE A,#0,S21MOV CSS_D,#60S21:ACALL DOWN_CONVACALL SEG_DISPJMP S0S2:CJNE A,#0FH,S4;按S3设置完成LCALL BZLCALL BZJMP S3S4: CJNE A,#08H,S5INC CMM_DMOV A,CMM_DCJNE A,#60,S111MOV CMM_D,#0S111:ACALL DOWN_CONVACALL SEG_DISPJMP S0S5: CJNE A,#0BH,S0RETS3:ACALL DOWN_TIMEACALL DOWN_CONVACALL SEG_DISPACALL KEYBOARDCJNE A,#0BH,S3MOV CMM_D,#00HMOV CSS_D,#00HRET;-------------------------加载倒计不时刻--------------------- ;显示倒数时刻DOWN_CONV:MOV D PTR,#SEGTABMOV A,CSS_DMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG2,AMOV A,BMOVC A,@A+DPTRMOV S EG1,AMOV A,CMM_DMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG5,AMOV A,BMOVC A,@A+DPTRMOV S EG4,AMOV A,#40HMOV S EG8,AMOV A,#40HMOV S EG7,AMOV S EG3,#80HMOV S EG6,#40HRET;---------检查倒计时-------------------------- ;检查倒计时DOWN_TIME:MOV A,SECMOV B,SEC0CJNE A,B,D01RETD01:MOV SEC0,SECDEC CSS_DMOV A,CSS_DCJNE A,#0,D11MOV A,CMM_DCJNE A,#0,D12;秒钟数为0且分钟数为0,那么倒数终止ACALL TIME_OUTJMP MAINLOOPRETD12:MOV CSS_D,#59DEC CMM_DD11:ACALL DOWN_CONVRET;**************************日期显示******************************** DATE_CONV:MOV D PTR,#SEGTABMOV A,DAYMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG2,AMOV A,BMOVC A,@A+DPTRMOV S EG1,AMOV A,MONTHMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG4,AMOV A,BMOVC A,@A+DPTRORL A,#80HMOV S EG3,AMOV A,YEARLMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG6,AMOV A,BMOVC A,@A+DPTRORL A,#80HMOV S EG5,AMOV A,YEARHMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG8,AMOV A,BMOVC A,@A+DPTRMOV S EG7,ARET;------------------------日期扫描显示-----------------------------DATE_DISP:MOV D PTR,#SEGTABMOV A,YEARHMOV B,#10DIV ABMOVC A,@A+DPTRMOV B UF1,AMOV A,BMOVC A,@A+DPTRMOV B UF2,AMOV A,YEARLMOV B,#10DIV ABMOVC A,@A+DPTRMOV B UF3,AMOV A,BMOVC A,@A+DPTRMOV B UF4,AMOV B UF5,#40HMOV A,MONTHMOV B,#10DIV ABMOVC A,@A+DPTRMOV B UF6,AMOV A,BMOVC A,@A+DPTRMOV B UF7,AMOV B UF8,#40HMOV A,DAYMOV B,#10DIV ABMOVC A,@A+DPTRMOV B UF9,AMOV A,BMOVC A,@A+DPTRMOV B UF10,AMOV B UF11,#80HMOV S EG1,#80HMOV S EG2,#00HMOV S EG3,#00HMOV S EG4,#00HMOV S EG5,#00HMOV S EG6,#00HMOV R6,#05HDATE_L3:MOV R0,#BUF1MOV R7,#11DATE_L2:MOV R3,#42HMOV S EG8,SEG7MOV S EG7,SEG6MOV S EG6,SEG5MOV S EG5,SEG4MOV S EG4,SEG3MOV S EG3,SEG2MOV S EG2,SEG1MOV S EG1,@R0DATE_L1:ACALL SEG_DISPLCALL KEYBOARDCJNE A,#0EH,JIXUJMP DATE_QUITJIXU: DJNZ R3,DATE_L1INC R0DJNZ R7,DATE_L2DJNZ R6,DATE_L3DATE_QUIT:AJMP CONVAJMP SEG_DISPRET;----------------------调整日期子程序----------------------------- DATA_SET:DA0:LCALL DATE_CONV ;扫描显示LCALL SEG_DISPLCALL KEYBOARDCJNE A,#04H,DA2 ;未按下S7键,则继续扫描;年调整INC YEARLMOV A,YEARLCJNE A,#100,DA21MOV YEARL,#0 ;变量清零INC YEARHMOV A,YEARHCJNE A,#100,DA21DA21:ACALL DATE_CONVACALL SEG_DISPJMP DA0DA2:CJNE A,#08H,DA3 ;未按下S9键,则继续扫描;月调整INC MONTHMOV A,MONTHCJNE A,#13,DA21MOV MONTH,#1 ;变量循环DA3:CJNE A,#0CH,DA4 ;未按下SA键,则继续扫描;日调整INC DAYACALL RUNNIANMOV A,RUNJZ DA30JMP DA31DA30:MOV DPTR,#MONTHTABJMP DA32DA31:MOV DPTR,#RUNTABJMP DA32DA32:MOV A,MONTHMOVC A,@A+DPTRMOV B,DAYCJNE A,B,DA21MOV DAY,#1 ;变量清零DA4:CJNE A,#02H,DA0 ;未按下SB键,那么继续扫描RETRUNNIAN:MOV RUN,#00HMOV B,#04H ;B中置为04H用来测试MOV A ,YEARL ;年的后两位送AJZ TJ2 ;假设后两位能被100整除那么转向条件2 DIV AB ;检测年的后两位是不是能被4整除MOV A ,B ;假假设B中的余数为零那么说明是闰年JZ LEAPJMP OVERTJ2:MOV A ,YEARH ;符合条件2(第一能被100整除)DIV AB ;假假设高位能被4整除那么说明能被400整除MOV A ,BJZ LEAP ;是闰年跳转SJMP OVERLEAP:MOV RUN,#01HOVER:RET;秒表功能程序STOP_CONV:MOV D PTR,#SEGTABMOV A,STOP_MSMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG2,AMOV A,BMOVC A,@A+DPTRMOV S EG1,AMOV A,STOP_SMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG5,AMOV A,BMOVC A,@A+DPTRMOV S EG4,AMOV A,STOP_MMOV B,#10DIV ABMOVC A,@A+DPTRMOV S EG8,AMOV A,BMOVC A,@A+DPTRMOV S EG7,AMOV S EG3,#40HMOV S EG6,#40HRETSTOP:MOV STOP_MS,#0MOV STOP_S,#0MOV STOP_M,#0ACALL STOP_CONVACALL SEG_DISPACALL KEYBOARDCJNE A,#07H,STOPJMP LOOP2LOOP2:ACALL KEYBOARDCJNE A,#07H,LOOP3JMP PAUSE1LOOP3: ACALL STOP_CONVACALL SEG_DISPLCALL DLY10MSINC STOP_MSMOV A,STOP_MSCJNE A,#100,LOOP2 ;是否1s到了MOV STOP_MS,#0 ;里秒数清零INC STOP_S ;秒计数加1MOV A,STOP_SCJNE A,#60,LOOP2 ;是不是1min到了INC STOP_M ;分计数加1MOV STOP_S,#0MOV A,STOP_MCJNE A,#60,LOOP2 ;是不是1h到了MOV STOP_M,#0PAUSE1:ACALL STOP_CONVACALL SEG_DISPACALL KEYBOARDCJNE A,#03H,PP1JMP DEADPP1: CJNE A,#07H,PP2JMP LOOP2PP2: CJNE A,#0FH,PAUSE1JMP STOPDEAD:ACALL CONVACALL SEG_DISPRETMUSIC:JMP STARTORG 001BHJMP EXT0START:MOV TMOD,#00010000BMOV IE,#8AHMOV R4,#0MOV DPTR,#9FFFHMOVX @DPTR,AMOV DPTR,#MUSICTABLOOOP:MOV A,R4MOVC A,@A+DPTRMOV R1,AINC R4ACALL WATERMOV A,R4MOVC A,@A+DPTRMOV R0,AORL A,R1JZ NEXT0 ;全0为休止符MOV A,R0ANL A,R1CJNE A,#0FFH,NNEXT ;全1表示乐曲结束JMP LO1 ;循环演奏NNEXT:MOV TH1,R1MOV TL1,R0SETB TR1JMP NEXT1NEXT0: ;关闭定时器,停止发音CLR TR1SETB FMQNEXT1:INC R4MOV A,R4MOVC A,@A+DPTRMOV R2,ALOOP1:ACALL DELAY_1DJNZ R2,LOOP1INC R4JMP LOOOPEXT0:MOV TH1,R1MOV TL1,R0RETIDELAY_1:MOV R7,#02DD3:MOV R5,#248DJNZ R5,$DJNZ R6,DD3DJNZ R7,DD2RETMUSICTAB: ;DB 0FDH,0C6H,02H,0FEH,02H,02HDB 0FEH,2AH,04H,0FEH,02H,02HDB 0FEH,2AH,04H,0FEH,84H,04HDB 0FEH,02H,02HDB 00H,00H,04HDB 0FDH,08H,02H,0FDH,08H,02HDB 0FDH,0C6H,03H,0FDH,80H,02HDB 0FDH,0C6H,04H,0FEH,2AH,04HDB 0FDH,80H,04DB 00H,00H,04HDB 0FDH,08H,02H,0FDH,08H,02HDB 0FDH,30H,03H,0FDH,08H,02HDB 0FDH,30H,02H,0FEH,2AH,03HDB 0FDH,08H,04HDB 00H,00H,04HDB 0FEH,2AH,02H,0FEH,2AH,02HDB 0FEH,2AH,03H,0FEH,02H,03HDB 0FDH,30H,02H,0FDH,30H,04HDB 0FEH,02H,04H,0FEH,02H,04HDB 0FFH,0FFHLO1:CLR TR1SETB FMQ ;停止闹铃RETWATER:MOV A,TEMPMOV DPTR,#8FFFHMOVX @DPTR,ARL AMOV TEMP,AMOV DPTR,#MUSICTABRETDLY400US:MOV R5,#2D100:DJNZ R4,$DJNZ R5,D100RETDLY10MS:MOV R5,#30DD100: MOV R4,#150DJNZ R4,$DJNZ R5,DD100RETBZ:MOV R6,#250B1:ACALL DEXCPL FMQDJNZ R6,B1MOV R5,#30ACALL DELAYRETDELAY:MOV R4,#04HDL0: MOV R5,#0E9HDL1: NOPDJNZ R5,DL1DJNZ R4,DL0RETDEX:MOV R4,#200DJNZ R4,$RETSEGTAB: DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FH MONTHTAB:DB 0,32,29,32,31,32,31DB 32,32,31,32,31,32 RUNTAB:DB 0,32,30,32,31,32,31DB 32,32,31,32,31,32END。
单片机实时时钟实训报告
一、引言随着单片机技术的不断发展,其在各个领域的应用越来越广泛。
实时时钟(Real-Time Clock,RTC)作为一种重要的功能模块,被广泛应用于嵌入式系统中,用于实现时间的记录、显示和控制等功能。
本实训报告以单片机为平台,设计并实现了一个实时时钟系统,旨在巩固和深化单片机相关知识,提高动手实践能力。
二、实训目的1. 理解实时时钟的工作原理和基本概念;2. 掌握单片机与实时时钟芯片的接口连接方法;3. 学会使用实时时钟芯片实现时间记录、显示和控制功能;4. 提高单片机编程能力和嵌入式系统设计能力。
三、实训内容1. 实时时钟芯片介绍本实训采用DS1302实时时钟芯片,该芯片具有以下特点:(1)低功耗设计,适用于电池供电的应用场景;(2)支持闰年、星期和夏令时等功能;(3)具有32.768kHz晶振振荡器,提供精确的时间基准;(4)具有64字节RAM,可用于存储数据。
2. 单片机与DS1302的接口连接本实训选用AT89C51单片机作为控制核心,与DS1302的接口连接如下:(1)VCC:连接单片机的5V电源;(2)GND:连接单片机的地;(3)RST:DS1302复位引脚,连接单片机的P1.0引脚;(4)CE:DS1302片选引脚,连接单片机的P1.1引脚;(5)IO:DS1302数据引脚,连接单片机的P1.2引脚;(6)SQW/OUT:DS1302闹钟输出引脚,连接单片机的P1.3引脚。
3. 实时时钟系统设计(1)时间记录通过DS1302芯片的RAM存储功能,实现时间的记录。
具体操作如下:① 初始化DS1302芯片,设置时间基准;② 设置闰年、星期和夏令时等信息;③ 读取当前时间,并存入单片机的内部RAM。
(2)时间显示使用单片机的并行I/O口,将时间数据输出到LED数码管或LCD液晶显示屏,实现时间显示。
具体操作如下:① 设计显示模块的硬件电路;② 编写显示模块的驱动程序,实现时间数据的读取和显示;③ 通过按键操作,实现时间的切换和调整。
单片机制作时钟实训报告
随着科技的不断发展,单片机作为一种集计算机技术、微电子技术和自动控制技术于一体的综合性技术,已经在各个领域得到了广泛的应用。
为了提高我们的实践能力和创新意识,我们选择了单片机制作时钟这一实训项目,通过实际操作来深入了解单片机的应用和编程技巧。
二、实训目的1. 熟悉单片机的基本原理和结构。
2. 掌握单片机的编程方法和技巧。
3. 学会使用常用电子元器件,如数码管、按键等。
4. 培养团队合作精神和动手能力。
三、实训内容1. 硬件设计(1)选用MCS-51单片机作为核心控制器;(2)使用8位LED数码管显示时间,包括时、分、秒;(3)设计按键模块,实现时间设置、闹钟设定等功能;(4)设计电源模块,保证系统稳定运行。
2. 软件设计(1)编写时钟计数程序,实现时间的精确计数;(2)编写按键扫描程序,实现时间设置、闹钟设定等功能;(3)编写显示控制程序,实现时间信息的实时显示。
3. 系统调试(1)对硬件电路进行连接和调试,确保电路正常运行;(2)对软件程序进行调试,修正错误,优化性能;(3)进行功能测试,验证系统功能的正确性和稳定性。
1. 需求分析根据实训要求,分析时钟功能,确定硬件和软件设计方案。
2. 硬件选型与电路设计根据需求分析,选择合适的单片机、数码管、按键等元器件,并设计电路图。
3. 软件编程使用C语言编写时钟计数、按键扫描、显示控制等程序。
4. 实物制作与调试按照电路图焊接电路板,组装元器件,进行实物制作。
然后对硬件电路和软件程序进行调试,确保系统正常运行。
5. 功能测试与优化对系统进行功能测试,验证时钟的准确性、按键功能的可靠性、显示的清晰度等。
根据测试结果对系统进行优化,提高性能。
五、实训成果1. 成功制作了一款基于单片机的电子时钟,具有实时显示、时间设置、闹钟设定等功能;2. 掌握了单片机的基本原理和编程方法,提高了实践能力;3. 学会了使用常用电子元器件,为以后的学习和工作打下了基础。
六、实训总结通过本次单片机制作时钟实训,我们深入了解了单片机的应用和编程技巧,提高了实践能力和创新意识。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验报告
实验名称:时钟综合实验
姓名:
学号:
班级:通信
时间:2013.12
南京理工大学紫金学院电光系
一、实验目的
1、学习Proteus软件基本使用方法;
2、掌握定时/计数器与外部中断工作原理;
3、学习设计单片机控制的多位数码管扫描显示电路;
4、理解数码管动态显示的原理。
二、实验原理
AT89C51单片机为控制器,八位7段数码管分别显示小时的十位、小时的个位、连接符、分的十位、分的个位、连接符、秒的十位和秒的个位,其中数码管的位选口为P2口,段选口为P0口,小时、分和秒的能动态显示。
定时器实现1秒准确定时,外部中断0引脚外接键盘BUTTON1,实现手动校分功能;外部中断1外接键盘BUTTON2,实现清零功能。
三、实验内容
根据实验任务设计要求,在Keil软件中实现程序编辑、编译与执行等操作。
对编译通过的过程可选择单步调试的方式来观察运行的结果,以及各个寄存器的值如何变化。
参考程序流程:主程序流程:开始→变量赋初值→定时器T1赋计数初值→设置外部中断控制字→开中断→开计数器→送位选字→送段选码→延时→送位选字,定时器T1中断流程:定时器T1赋计数初值→到1秒了吗?→Y秒加1 or N结束→到1分钟了吗?→Y秒清零 or N结束→分钟加1→到60分钟了吗?→Y分钟清零 or N结束→结束,外部中断0流程:分钟加1→到60分钟了吗?→Y分钟清零 or N结束→结束,外部中断1:分钟清零→秒清零→结束。
1、程序代码:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
//共阳 0-9
uchar dis_dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar k,second,minute,secondl,secondh,minutel,minuteh;
void init()
{
k=20;
second=0;
minute=0;
secondl=0;
minutel=0;
secondh=0;
minuteh=0;
}
void Timeinit()
{
TMOD=0x10;
TH1=(65536-46082)/256;
TL1=(65536-46082)%256;
TR1=1;
EA=1;
ET1=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
}
void delay()
{
uchar i,j;
for(i=0;i<50;i++)
for(j=0;j<100;j++);
}
void display(uchar a,b,c,d)
{
P2=0x1f;
P0=dis_dat[a];
delay();
P2=0x2f;
P0=dis_dat[b];
delay();
P2=0x4f;
P0=dis_dat[c];
delay();
P2=0x8f;
P0=dis_dat[d];
delay();
}
void main()
{
Timeinit();
init();
while(1)
{
minuteh=minute/10;
minutel=minute%10;
secondh=second/10;
secondl=second%10;
display(minuteh,minutel,secondh,secondl); }
}
void Time1()interrupt 3
{
TH1=(65536-46082)/256;
TL1=(65536-46082)%256; k--;
if(k==0)
{
k=20;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
second=0;
}
}
}
}
void int_0()interrupt 0 {
minute++;
if(minute==60)
{
minute=0;
}
}
void int_1()interrupt 2 {
minute=0;
second=0;
}
2.实验原理图
四、小结与体会
通过此次实验我学会了利用定时/计数器与外部中断的工作原理,设计了一个简单的时
钟,具备小时,分,秒计时与显示功能。