单片机数字时钟实验报告

合集下载

单片机电子时钟实验报告

单片机电子时钟实验报告

单片机电子时钟实验报告一、实验任务及要求在焊接的电路板中,4个LED数码管,设计带有闹铃功能的数字时钟,要求:1、在4位数码管上显示当前时间。

显示格式“时时分分”;2、由LED闪动做秒显示;3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。

当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。

二、方案论证与比较2.1数字时钟方案数字时钟是本设计的最主要的部分。

根据需要,可利用两种方案实现。

方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。

该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。

为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。

当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。

而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

方案二:本方案完全用软件实现数字时钟。

原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。

利用定时器与软件结合实现5毫秒定时中断,每产生一次中断,存储器内相应的计数值加1;若计数值达到200,则将其清零,并将方案一:静态显示。

所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。

该方式每一位都需要一个8 位输出口控制。

静态显示时较小的电流能获得较高的亮度,且字符不闪烁。

但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。

方案二:动态显示。

所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。

利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度合适,字符才不闪烁。

显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。

调整参数可以实现较高稳定度的显示。

动态显示节省了I/O 口,降低了能耗。

数字时钟实验报告

数字时钟实验报告

单片机数字时钟设计实训报告系别专业姓名学号摘要单片机是把中央处理器CPU,随即存取存储器RAM,只读存储器ROM,定时器/计数器以及输入/输出即I/O接口电路等主要计算机部件,集成在一块集成电路上的微机。

虽然只是一个芯片,但从组成和功能上来看,已具备微型系统的属性。

单片机的发展经历了4个阶段,其向着低功耗CMOS化,微型单片化,主流与多品种共存的方向发展。

单片机在工业自动化,仪器仪表,家用电器,信息和通讯产品及军事方面得到了广泛应用。

另外,其发展前景不错。

本次实训以设计制作数字时钟为例,来加深我们对单片机特性和功能的了解,加强我们的编程思想。

为今后从事单片机程序产品的开发,打下了良好的理论与实践基础。

理论服务于实践,将知识转化为能力,也是本次试训的另一个重要目的。

目录一、整体设计方案 (3)1. 方案设计要求 (3)2. 方案设计与论证 (3)3. 整体设计框图 (4)二、数字时钟的硬件设计 (4)1. 最小系统设计 (4)2. LED显示电路 (8)3. 键盘控制电路 (9)4. 数字时钟的原理图 (10)三、数字时钟的软件设计 (11)1. 系统软件设计流程图 (11)2. 数字时钟主程序 (14)四、调试与仿真 (18)1. 数字时钟系统PROTUES仿真 (18)2. 软件与硬件调试 (19)3. 系统性能测试与功能说明 (19)4. 出现问题及解决 (19)五、实验结论 (20)六、心得体会 (21)附录:1.原器件清单 (22)2.参考文献 (22)一、整体方案设计1. 方案设计要求设计制作一个数字时钟,要求能实现基本走时,并以数字形式显示时、分、秒;采用24小时制;能校时、校分、校秒;也可以添加其他功能.2. 方案设计与论证方案一:采用各种纯数字芯片实现数字时钟的设计。

优点:各个模块功能清晰,电路易于理解实现。

缺点:各个模块功能已定不能进行智能化调整,整体电路太庞大。

方案二:采用 FPGA模块用硬件语言实现功能。

单片机设计数字钟实验报告

单片机设计数字钟实验报告

单片机实验报告——数字钟设计班级:学号:姓名:时间:一.实验目的1、进一步熟悉C的语法知识和keil环境;2、熟练掌握一些常用算法;3、熟悉keil的编写、下载、调试过程;4、了解单片机的工作原理和电路图;5、熟悉单片机的外围电路功能模块、LED灯、数码管模块以及键盘;6、熟练焊接技术。

二.实验器件三.数字钟设计原理数字钟实际是对标准频率计数的电路,由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的时间信号必须做到准确稳定。

通常使用石英晶体振荡电路构成数字钟。

数字钟电子钟由以下几部分组成:按键开关部分,振荡电路部分,89c51单片机控制器,4位数码管显示部分,7407数码管驱动部分。

按键开关振荡电路89C51单片机控制器4位数码管显示7407列驱动四.流程图主程序流程图如图2.3所示,定时器T0中断服务程序流程图如2.4所示。

返回五.51单片机系统的硬件连接1、STC单片机最小系统硬件电路图如下2、硬件电路的设计该电路采用AT89C51单片机最小化应用,采用共阴7段LED数码管显示器,P2.4~P2.7口作为列扫描输出,P0口输出段码数据,P1.2,P1.1口接2个按钮开关,用于调时及功能误差,采用12Mhz晶振,可提高秒计时的精确度。

六.程序设计HOUR EQU 3AH ;赋值伪指令MIN EQU 3BHSEC EQU 3CHBUFF EQU 3DHORG 0000HAJMP MAINORG 000BH ;主程序入口AJMP PTF0ORG 0033H ;跳转到标号PTF0执行;**************************************************************;主程序MAIN: MOV HOUR, #00H ;时,分,秒,标记清零MOV MIN, #00HMOV SEC, #00HMOV BUFF, #00HMOV SP, #0EFH ;设堆栈指针MOV TH0, #0ECH ;定时器赋初值MOV TL0, #78HMOV 40H, #100 ;设循环次数MOV 41H, #2MOV TMOD , #1 ;写TMODMOV IP, #2 ;写IPMOV IE, #82HMOV R5,#0;开中断SETB TR0 ;启动定时器PTF0: SETB P1.2MOV TH0, #0ECHMOV TL0, #78HINC R5MOV R6,BUFFCJNE R6,#00H,BBMOV DPTR,#TAB1LJMP LOOP0BB:MOV DPTR,#TABLOOP0: CJNE R5,#1,LOOP1ACALL LOP0AJMP JKLOOP1:CJNE R5,#2,LOOP2ACALL LOP1AJMP JKLOOP2:CJNE R5,#3,LOOP3ACALL LOP2AJMP JKLOOP3:ACALL LOP3MOV R5,#0JK: DJNZ 40H, PTFORXRL BUFF, #0FFHMOV 40H, #100JNB P1.1, JFJNB P1.2, JSMOV R7, 41HCJNE R7, #1, AAAA: DJNZ 41H, PTFORMOV 41H,#2MOV A, SEC ;秒加1ADD A, #1DA AMOV SEC, ACJNE A, #60H, PTFORMOV SEC, #0 ;秒清零JF: MOV A, MIN ;分加1ADD A, #1DA AMOV MIN, ACJNE A, #60H,PTFORMOV MIN, #0 ; 分清零ACALL LEDJS: MOV A,HOURADD A,#1DA AMOV HOUR,A ;时加1CJNE A, #24H,PTFOR ;时加到24时否?是,清零MOV HOUR, #0PTFOR:RETILOP0: MOV A, MIN ;显示分钟的个位ANL A, #0FHMOVC A, @A+DPTRMOV P0,AMOV P2,#0F0HCLR P2.4CLR P0.4RETLOP1:MOV A, MIN ;显示分钟的十位SWAP AANL A, #0FHMOVC A, @A+DPTRMOV P0, AMOV P2, #0F0HCLR P2.5CLR P0.4RETLOP2: MOV A, HOUR ;显示时钟的个位ANL A, #0FHMOVC A, @A+DPTRMOV P0, AMOV P2, #0F0HCLR P2.6RETLOP3:MOV A, HOUR ;显示时钟的十位SWAP AANL A, #0FHMOVC A, @A+DPTRMOV P0, AMOV P2, #0F0HCLR P2.7CLR P0.4RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;不带小数点的字型码TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH ;带小数点的字型码END七.系统调试及结果分析硬件调试硬件电路板中器件连接好后,先用万用表测试电路中有无虚焊短接之处,测试无误后,将板子通电,进行静态调试。

单片机数字时钟实验报告

单片机数字时钟实验报告

数字时钟实验报告一、实验目的:通过实验进一步深刻理解单片机最小系统的工作原理。

着重掌握中断和定时器的使用,以及读键盘和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) //如果有连续两次按键按下,认为有有效按键按下。

单片机实验报告-数字时钟设计报告

单片机实验报告-数字时钟设计报告

单片机实验报告-数字时钟设计报告一、实验目的1、掌握单片机的主要原理及相关的功能和特点。

2、熟悉单片机测试与调试的一般步骤与操作。

3、掌握定时/计数功能在单片机系统中的实现方法。

4、领会单片机实验模块设计思想。

二、实验内容本次实验主要是利用STC89C52单片机实现数字时钟设计,实验从硬件电路组成和单片机编程两个部分来实现数字时钟的设计。

(1)硬件电路设计该系统的硬件电路设计主要包括PCB板的设计、电源的设置、单片机与外设的连接以及时钟芯片的接入。

利用Altium Designer软件来进行电路板设计,将STC89C52芯片与时钟模块(DS1302)以及屏幕连接,整个电路如图1所示。

图1 数字时钟使用STC89C52的电路图(2)单片机程序设计本实验使用keil软件对单片机程序进行编程,主要的部分如下:(2.1)定义单片机IO口首先定义单片机IO口,其定义方式如下:#include<reg52.h>sbit Row0=P1^0; //定义P1.0作为数码管的Row0控制端sbit Row1=P1^7; //定义P1.7作为数码管的Row1控制端sbit Row2=P1^1; //定义P1.1作为数码管的Row2控制端sbit Row3=P2^0; //定义P2.0作为数码管的Row3控制端sbit Col0=P1^2; //定义P1.2作为数字管的Col0控制端sbit Col1=P1^3; //定义P1.3作为数字管的Col1控制端sbit Col2=P1^4; //定义P1.4作为数字管的Col2控制端sbit Col3=P1^5; //定义P1.5作为数字管的Col3控制端sbit Col4=P1^6; //定义P1.6作为数字管的Col4控制端(2.2)定义LED数码管数据和定义变量//定义LED数码管数据unsigned char codetable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsigned char i,j,k,m,n,s;(2.3)调用初始化函数再调用初始化函数,用于完成I/O口、定时器0/1及外部中断的初始化,代码如下:void init (void){TMOD=0x01; //定时器0的模式1TH0=0x3c; //定时器0赋初值TL0=0xb0;EA=1; //外部总中断开启ET0=1; //允许定时器0中断ET1=0; //不允许定时器1中断TR0=1; //开启定时器0TR1=1; //关闭定时器1}(2.4)主函数最后我们考虑到,应该实现的LED点阵的显示函数和定时更新时钟的函数,本实验的核心代码如下:void main(){init(); //调用初始化函数while(1){display(); //调用LED点阵显示函数number_refresh(); //调用定时更新时钟函数}}(2.5)LED点阵显示函数为保证LED点阵的正常工作,可利用多次延时函数,定义LED点阵显示函数,每次显示一位数字,实现数字从左往右以及从右往左的滚动移动显示,具体实现如下:void display (int ){P2=0xfe; //定义P2这一行位先低电平,控制第一位显示P0=table[m]; //将得到的数字m 显示在第一位数码管Delay_1ms(2); //延时1msP2=0xfd; //定义P2这一行位先低电平,控制第二位显示P0=table[n]; //将得到的数字n 显示在第二位数码管Delay_1ms(2); //延时1msP2=0xfb; //定义P2这一行位先低电平,控制第三位显示P0=table[s]; //将得到的数字s 显示在第三位数码管Delay_1ms(2); //延时1msP2=0xf7; //定义P2这一行位先低电平,控制第四位显示P0=table[i]; //将得到的数字i 显示在第四位数码管Delay_1ms(2); //延时1msP2=0xef; //定义P2这一行位先低电平,控制第五位显示P0=table[j]; //将得到的数字j 显示在第五位数码管Delay_1ms(2); //延时1msP2=0xdf; //定义P2这一行位先低电平,控制第六位显示P0=table[k]; //将得到的数字k 显示在第六位数码管Delay_1ms(2); //延时1ms}(2.6)定时更新时钟函数本部分,利用定时器0的中断功能实现定时更新LED点阵时间,定义定时器0中断函数,实现每隔一秒更新一次,更新变量m、n、s、i、j、k,代码如下:ㄖ/Timer 0中断函数void Timer0() interrupt 1{TH0=0x3c; //定时器0赋初值TL0=0xb0;m++; //每秒,m值加1if(m>9) //当m的值大于9时,n值加1{n++;m=0;}if(n>9) //当n的值大于9时,s值加1{s++;n=0;}if(s>5) //当s的值大于5时,i值加1{i++;s=0;}if(i>9) //当i的值大于9时,j值加1{j++;i=0;}if(j>5) //当j的值大于5时,k值加1{k++;j=0;}if(k>9) //当k的值大于9时,m值加1{k=0;m=0;}}三、实验结果本次实验让我深入理解单片机及一些外设的工作原理,掌握定时/计数机制,以及实现数字时钟设计的思维过程。

单片机数字钟实习报告

单片机数字钟实习报告

一、实习目的随着电子技术的飞速发展,单片机作为一种重要的电子元件,在工业、医疗、通讯等领域得到了广泛的应用。

为了更好地掌握单片机的原理和应用,提高动手能力,我们选择了单片机数字钟作为实习项目。

通过本次实习,我们旨在掌握单片机的编程、调试、硬件连接等方面的知识,实现数字时钟的显示与控制。

二、实习内容1. 单片机数字钟硬件设计(1)选用AT89C51单片机作为核心控制单元,具有丰富的片上资源,方便编程和调试。

(2)采用LCD1602液晶显示屏,显示时间、日期等信息。

(3)使用DS1302实时时钟芯片,实现时间的存储和更新。

(4)选用按键作为输入设备,实现时间的调整和设置。

(5)选用蜂鸣器作为报警设备,实现定时报警功能。

2. 单片机数字钟软件设计(1)编写主程序,实现系统初始化、时间显示、按键扫描、时间调整等功能。

(2)编写中断服务程序,实现DS1302时钟芯片的读写、按键消抖等功能。

(3)编写子程序,实现时间的计算、格式化、显示等功能。

3. 单片机数字钟调试与测试(1)连接电路,检查各个模块的连接是否正确。

(2)编写程序,将程序烧录到单片机中。

(3)调试程序,确保程序运行正常。

(4)测试各个功能模块,如时间显示、按键调整、定时报警等。

三、实习过程1. 硬件设计(1)根据设计要求,绘制电路原理图。

(2)购买所需元器件,进行焊接。

(3)组装电路板,连接各个模块。

2. 软件设计(1)编写程序,采用C语言进行编程。

(2)使用Keil软件进行编译、烧录。

(3)在仿真软件Proteus中进行仿真,验证程序的正确性。

3. 调试与测试(1)连接电路,检查各个模块的连接是否正确。

(2)编写程序,将程序烧录到单片机中。

(3)调试程序,确保程序运行正常。

(4)测试各个功能模块,如时间显示、按键调整、定时报警等。

四、实习总结1. 通过本次实习,我们掌握了单片机的编程、调试、硬件连接等方面的知识。

2. 学会了使用LCD1602液晶显示屏、DS1302实时时钟芯片、按键等元器件。

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告一、实验目的本次单片机实验的目的是设计并实现一个基于单片机的数字时钟。

通过该实验,深入了解单片机的工作原理和编程方法,掌握定时器、中断、数码管显示等功能的应用,提高综合运用知识解决实际问题的能力。

二、实验原理1、单片机选择本次实验选用了常见的 51 系列单片机,如 STC89C52。

它具有丰富的资源和易于编程的特点,能够满足数字时钟的设计需求。

2、时钟计时原理数字时钟的核心是准确的计时功能。

通过单片机内部的定时器,设定合适的定时时间间隔,不断累加计时变量,实现秒、分、时的计时。

3、数码管显示原理采用共阳或共阴数码管来显示时间数字。

通过单片机的 I/O 口控制数码管的段选和位选信号,使数码管显示相应的数字。

4、按键控制原理设置按键用于调整时间。

通过检测按键的按下状态,进入相应的时间调整模式。

三、实验设备与材料1、单片机开发板2、数码管3、按键4、杜邦线若干5、电脑及编程软件(如 Keil)四、实验步骤1、硬件连接将数码管、按键与单片机开发板的相应引脚通过杜邦线连接起来。

确保连接正确可靠,避免短路或断路。

2、软件编程(1)初始化单片机的定时器、中断、I/O 口等。

(2)编写定时器中断服务程序,实现秒的计时。

(3)设计计时算法,将秒转换为分、时,并进行进位处理。

(4)编写数码管显示程序,将时间数据转换为数码管的段选和位选信号进行显示。

(5)添加按键检测程序,实现时间的调整功能。

3、编译与下载使用编程软件将编写好的程序编译生成可执行文件,并下载到单片机中进行运行测试。

五、程序设计以下是本次数字时钟设计的主要程序代码片段:```cinclude <reg52h>//定义数码管段选码unsigned char code SEG_CODE ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//定义数码管位选码unsigned char code BIT_CODE ={0x01, 0x02, 0x04, 0x08, 0x10,0x20, 0x40, 0x80};//定义时间变量unsigned int second = 0, minute = 0, hour = 0;//定时器初始化函数void Timer_Init(){TMOD = 0x01; //定时器 0 工作在方式 1 TH0 =(65536 50000) / 256; //定时 50ms TL0 =(65536 50000) % 256;EA = 1; //开总中断ET0 = 1; //开定时器 0 中断TR0 = 1; //启动定时器 0}//定时器 0 中断服务函数void Timer0_ISR() interrupt 1{TH0 =(65536 50000) / 256;TL0 =(65536 50000) % 256;second++;if (second == 60){second = 0;minute++;if (minute == 60){minute = 0;hour++;if (hour == 24){hour = 0;}}}}//数码管显示函数void Display(){unsigned char i;for (i = 0; i < 8; i++)P2 = BIT_CODEi;if (i == 0){P0 = SEG_CODEhour / 10;}else if (i == 1){P0 = SEG_CODEhour % 10;}else if (i == 2){P0 = 0xBF; //显示“”}else if (i == 3){P0 = SEG_CODEminute / 10;else if (i == 4){P0 = SEG_CODEminute % 10;}else if (i == 5){P0 = 0xBF; //显示“”}else if (i == 6){P0 = SEG_CODEsecond / 10;}else if (i == 7){P0 = SEG_CODEsecond % 10;}delay_ms(1);//适当延时,防止闪烁}}//主函数void main(){Timer_Init();while (1){Display();}}```六、实验结果与分析1、实验结果将程序下载到单片机后,数字时钟能够正常运行,准确显示时、分、秒,并且通过按键可以进行时间的调整。

单片机数字钟实习报告

单片机数字钟实习报告

单片机数字钟实习报告一、实习目的和意义随着计算机科学与技术的飞速发展,计算机的应用已经渗透到国民经济与人们生活的各个角落,而单片机技术作为计算机技术中的一个独立分支,具有性价比高、集成度高、体积小、可靠性高、控制功能强大、低功耗、低电压等特点,因此在各个领域得到了广泛的应用。

本次实习旨在通过设计一款数字钟,使学生掌握单片机的原理及其应用,提高实际动手能力和创新能力。

数字钟作为一种典型的数字电路,包括组合逻辑电路和时序电路。

通过设计制作数字钟,可以让学生了解数字钟的原理,学会制作数字钟,并进一步了解各种中小规模集成电路的作用及实用方法。

同时,通过数字钟的制作,可以让学生进一步学习与掌握各种组合逻辑电路与时序电路的原理与使用方法。

二、实习内容和要求1. 设计一款基于单片机的数字钟,能显示时、分、秒。

2. 数字钟具有校时功能,能以24小时为一个周期循环显示时间。

3. 掌握单片机的原理及其编程方法,熟悉LCD1602液晶显示屏的使用。

4. 了解数字钟的原理,学会制作数字钟,并掌握各种组合逻辑电路与时序电路的原理与使用方法。

三、实习过程1. 首先,我们对单片机的原理进行了学习,了解了单片机的内部结构、工作原理及其编程方法。

同时,我们还学习了LCD1602液晶显示屏的使用,掌握了如何将单片机与LCD1602液晶显示屏进行连接。

2. 接下来,我们开始了数字钟的设计。

首先,我们设计了数字钟的电路原理图,包括了单片机、LCD1602液晶显示屏、按键、时钟芯片等元件。

然后,我们进行了电路板的焊接,焊接过程中,我们严格遵循电路焊接规范,确保了电路板的质量和稳定性。

3. 焊接完成后,我们开始了数字钟的程序编写。

我们编写了相应的程序,实现了数字钟的时、分、秒显示功能以及校时功能。

在编程过程中,我们深入理解了单片机的编程原理,掌握了Keil编程软件的使用。

4. 最后,我们对数字钟进行了调试和测试。

我们通过观察数字钟的显示效果,分析了可能存在的问题,并针对问题进行了改进。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字时钟实验报告一、实验目的1、熟悉单片机的结构和各引脚的的功能以及如何用程序控制。

2、学习用单片机对数字时钟控制、按键扫描及LED数码管显示的设计方法。

3、了解键盘的结构以及工作原理,通过单片机的定义实现对数码管时钟的调整。

二、实验要求1、可以正常准确的显示时间.2、可以通过键盘输入来对时间进行调整.3、能够以两种时钟表示方式显示时间.4、自由发挥其他功能.三、实验基本原理利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.05s中断一次并当作一个计数,设定定时1秒的中断计数初值为0,每中断一次中断计数初值加1,当加到20时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。

采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。

由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。

利用键盘实现对时钟的调整,定义四个按键,按下第一个按键位置跳变到“分”,在按定义的第二个键每按一次数字加一,当数字到59时再按一次,直接跳变到00;用第三个键控制“时”的12小时制还是24小时制,对键盘扫描,如果发现该键被按下,则表示为12进制,每按一次第四个按键数字加一,当到达12时,再按一次直接跳到1,如果没有发现该按键,则默认为24小时制,当数字是23时,再按一次跳变到00,再按一下第一个键退出对事件的调整。

四、实验设计分析针对要实现的功能,采用AT89S51单片机进行设计,AT89S51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。

这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。

程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。

运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。

首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。

这是前期准备工作。

第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。

第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。

第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。

第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。

第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。

最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!以下为具体的数字时钟实现程序段:#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar sec,sec1,min,min1,hou,hou1,t,num,temp;uint num1,num2,num3,n,k=0;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void init();uchar keyscan();void control();void display(uchar ,uchar ,uchar ,uchar ,uchar ,uchar ,uchar ,uchar ); void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){init();while(1){TR0=0;keyscan();control();TR0=1;if(t==20){t=0;num1++;if(num1==60){num1=0;num2++;if(num2==60){num2=0;num3++;if(num3>23)num3=0;}}}sec1=num1/10;sec=num1%10;min1=num2/10;min=num2%10;hou1=num3/10;hou=num3%10;display(hou1,hou,10,min1,min,10,sec1,sec);}}void init(){t=0; num1=0,num2=0,num3=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t++;}void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar k,uchar h) {P0=table[a];P2=0xfe;delay(1);P0=table[b];P2=0xfd;delay(1);P0=table[c];P2=0xfb;delay(1);P0=table[d];P2=0xf7;delay(1);P1=table[e];P2=0xef;delay(1);P0=table[f];P2=0xdf;delay(1);P0=table[k];P2=0xbf;delay(1);P0=table[h];P2=0x7f;delay(1);}uchar keyscan(){P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee: num=1;break;case 0xde: num=2;break;case 0xbe: num=3;break;case 0x7e: num=4;k++;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return num;}void control(){if(num==1){num1++;P2=0xfe;n=num1%10;if(num1>59)num1=0;P0=table[n];//调整秒num=0;}if(num==2){num2++;P2=0xf7;n=num2%10;if(num2>59)num2=0;P0=table[n];//调整分num=0;}if(num==3){num3++;P2=0xbf;n=num3%10;if(num3>23)num3=0;P0=table[n];//调整时num=0;}if(num==4){if(k%2==0){if(num3>12)num3=num3-12;}else {if(num3<12){num3=num3+12;}}num=0;}}五、实验总结及感想刚接触单片机这个词语,感觉是那么的深奥,它的功能是那么的强大,能让看上去似乎毫不相关的东西联系起来,能让静止的事物“活动起来”。

刚开始和想象中的一样难,不知如何下手,前面几个课时都是一直在看视频,但是感觉光看不练,有些东西总是记不住,关掉写好的代码连最关键的语句都写不出来。

当时看到大家学得是那么的得心应手,我的确很着急。

但是单片机用途很多,在以后会变得很重要,虽然难,但是还得硬着头皮一点一点的摸下去。

刚开始几个课时的确没什么收获,之后我想了一下,决定还是重头开始,边看边写,虽然进度比较慢,但是那些该记的的东西还是记住了,这样那些要记的源程序关键字也不那么陌生了,慢慢的能写一句,慢慢的开始能编好一个小程序了,我开始有点成就感,开始有点喜欢上这程序。

后来我写数字时钟,虽然看似那么平常的东西,但是具体把程序完整的写出来还是得花些时间,编程要注意的细节很多,一个很小的标点符号都可能导致致命的错误,有的一个很小的错误,也需要你找上几个小时,很浪费时间。

在编写过程中也遇到了不少问题。

1、P0口开关问题。

P0口比较特殊,它存在高阻态,要使其输入不是高电平就是低电平,就要接上拉电阻,给其高电平输入。

2、按键编译检测比较繁琐,在编程中,我按下键一次数码管上的数字会跳动好多下,和预期的有很大差别,使后面调时间带来了极大的问题,但是后面经过小组讨论查找,最终还是把这个问题解决了,这让我深刻的意识到,一个团队是多么的重要,一个人几天都无法完成的任务,一个团队或许只需要几分钟。

我感觉最高兴的时候,不是出现最终的结果那一刻,而是在调试出错误后,大家找各自错误,相互讨教,寻找结果的过程,因为结果是早就预知的,不过迟早而已。

我一直相信只要付出努力,就一定会有收获。

坚持不懈才是成功的秘诀。

相关文档
最新文档