指针式模拟时钟

指针式模拟时钟
指针式模拟时钟

毕业设计

题目用PG12864LCD设计的指针式电子钟学生姓名王康康学号1110064047

所在院(系) 物理与电信工程学院

专业班级电子信息科学与技术1102

指导教师杨创华

完成地点实验楼1104教室

2015年5月

目录

引言 (1)

1 设计任务及方案论证 (1)

1.1设计任务与要求 (1)

1.2 总体方案论证与设计 (1)

2系统硬件设置 (1)

2.1 STC89C51单片机简介 (1)

2.2显示模块设计 (4)

2.2.1 PG12864LCD的特性介绍 (4)

2.2.2 LCD12864引脚介绍 (4)

2.2.3 12864内部功能器件及相关功能 (5)

2.2.4 12864液晶与单片机接口电路 (7)

2.3设置模块 (8)

2.4 振荡电路 (9)

2.5 复位电路 (9)

3系统软件设计 (9)

3.1总体软件设计 (9)

3.2 时钟函数模块 (10)

3.3 指针时钟设计 (11)

3.3.1 实现功能 (11)

3.3.2实现算法 (11)

3.3.3 函数设计 (13)

3.4 显示函数模块 (15)

3.4.1实现功能 (17)

3.4.2 函数设计 (17)

3.5.1 功能 (18)

3.5.2 函数 (18)

3.6主函数模块 (19)

4.设计结果 (19)

5.使用方法 (20)

6.设计进度 (20)

7.教学单位可以提供的条件 (20)

致谢 (21)

参考文献 (21)

用PG12864LCD设计的指针式电子钟

王康康

(陕西理工学院物理与电信工程学院电子信息科学与技术专业电信1102班,陕西汉中

723000)

指导教师:杨创华

[摘要]本设计采用的是STC89C51单片机,通过单片机内部定时器定时实现时钟定时计数功能,并以模拟时钟的形式显示在LCD_12864上。同时可通过三个按键可实现时间的调节。

[关键词]时钟AT89C51单片机LCD12864液晶

By using the analog electronic clock design

PG12864LCD

Wang kangkang

(Grade11,Class2,Major Electronic Information Science and Technology,Physics Dept.,Shaanxi

University of Technology,Hanzhong 723000,Shaanxi)

Tutor:Yang chuanghua

Abstract :This design uses STC89C51 microcontroller, through the MCU internal timer from time to time to achieve the clock timing and counting function and in the form of analog clock display on the LCD 12864. At the same time can be adjusted by the three keys to realize the time.

Keywords:A T89C51microcontroller LCD12864 LCD clock

引言

如今二十一电子钟、机械式手表等钟表已经普遍存在于市场,并且钟表已经成为人们生活中不可缺少的一部分。在生活中到处都能看到其身影。当穿行于马路上时总会看到几乎每个人手腕上戴着一块手表。当大人家里做客时总能看到大厅里面挂着个钟表。当打开手机时屏幕上依旧是钟表的画面。时间伴随着我们钟表也成为我们生活中必不可少的一大部分。当今市场有好多电子钟,但大多数是纯数字式的,指针式的电子钟比较新颖,而且具有真实表盘式时钟的效果。

用PG12864LCD设计的模拟电子钟采用PG12864LCD液晶屏,用来模拟表盘与时分秒指针指示当前时钟,此模拟指针式电子钟实现的功能为:在PG12864显示屏上显示圆形表盘与时分秒三个指针表示当前时刻;三个按键,K1键用来选择工作模式;K2键用来选择调整时分秒;K3键用来调节大小。

1 设计任务及方案论证

1.1设计任务与要求

利用单片机等器件做一个简易的模拟指针式时钟,硬件设计以单片机为主,主要包括显示模块、复位模块、时钟模块。采用PG12864液晶屏作为显示单元,液晶屏上显示圆形表盘、时、分、秒指针,并且设置按钮可以调节时间,软件设计主要是通过单片机编程软件Keil C51设计,模拟仿真是利用仿真软件Proteus对所设计的硬件电路和程序进行调试。

1.2 总体方案论证与设计

在设计中要包含显示模块,控制器,设置模块;

方案一:利用基于MFC的Windows应用程序在屏幕上显示一个指针式时钟,并可通过菜单选项对时间调节,设计的时钟画面清晰,显示准确,但缺点是时间必须与系统机器时间一样,不可以随意设置时间,另外此方案涉及微软基础类库,对于不熟悉的我们难度较大。

方案二:因此我们采用另一套方案,显示模块用LCD12864模块,可以显示系统时间;整个代码实现主要由51单片机来实现;设置模块为按键处理可自行调节时间,整体流程以AT89C51单片机为控制核心,将得到的数据通过LCD12864模块显示出来,同时通过相应的按键调整相应的值,此方案具有设计简单,成本低廉,可执行度高等优点,因此采用本方案。

2系统硬件设置

2.1 STC89C51单片机简介

在设计中可用STC89C5代替AT89C51,此芯片具有速度

更高,功能更全,寿命更长,价格更低等优点;我们采用双

列直插40引脚的 STC89C51,它可以实现ISP在线编程功能,

然而AT89C51则不可以,将AT89C51的程序通过软件直接下载

到STC89C51中后,就可以代替AT单片机直接工作,基本上

都不需要做修改就可以正常工作了,STC公司推出的51系列

单片机芯片是兼容其它51单片机的,而51单片机作为单片机

界的应用最广泛芯片,几乎每一个高等院校、普通学校、网

站、业余单片机培训都是用51单片机作为基础而学习的,正

是因为如此可以利用的参考资料和例子也是最多的,而且由

于STC89C51自带有EEPROM,其在程序中更是可以直接修改,

断电之后也不会丢失数据。

STC89C51单片机管脚图如图2.1所示:

STC89C51单片机的引脚介绍:

-VCC:供电电压

-GND:接地

-P0口:P0口是一个8位双向I/O口,当每个引脚第一次被写1时,定义其为高阻态输入,此外P0能够用来作为外部程序数据存储器,为此它可以被定义为数据/地址的第八位,在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此外P0作为数据口时,需外接上拉电阻。

-P1口:P1口缓冲器能接收输出4TTL门电流,当P1口管脚写入1后,由于P1口是一个内部提供上拉电阻的8位双向I/O口,所以被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,正是由于内部上拉的缘故,在FLASH编程和校验时,P1口可以作为第八位地址接收;

-P2口:P2口也是一个内部具有上拉电阻的8位双向I/O口,P2口缓冲器同样可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入,并因此在作为输入时,P2口的管脚被外部拉低,将输出电流,正是由于内部上拉的缘故,P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位,在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容,P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

-P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流,当P3口写入“1”后,它们被内部上拉为高电平,并用作输入,作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

此外P3口除了作为一般的I/O口外,更重要的用途是它还有复用功能,如下所示:

?P3.0 RXD第二功能可作为串行输入口;

?P3.1 TXD第二功能可作为串行输出口;

?P3.2 /INT0(外部中断0);

?P3.3 /INT1(外部中断1);

?P3.6/WR第二功能可作为外部数据寄存器写选通;

?P3.7/RD第二功能可作为外部数据寄存器读选通;

?P3口同时为闪烁编程和编程校验接受一些控制信号;

?RST:复位输入,当振荡器复位时,要保持RST脚两个机器周期的高电平,当STC89C51通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位;初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,指针堆栈写入07H,其它专用的寄存器被写“0”,RESET由高转低时,单片机内部即从0000H地址开始执行,但是,初始复位不改变RAM(包括工作寄存器R0-R7)的状态。

表2.1 8051的初始态表

特殊功能寄存器初始态特殊功能寄存器初始态

ACC 00H B 00H

PSW 00H SP 07H

DPH 00H TH0 00H

DPL 00H TL0 00H

IP xxx00000B TH1 00H

IE 0xx00000B TL1 00H

TMOD 00H TCON 00H

SCON xxxxxxxxB SBUF 00H

P0-P3 1111111B PCON 0xxxxxxxB

AALE/PROG:地址锁存允许的输出电平用于锁存地址的地位字节,当访问外部存储器时,在FLASH编程期间,此引脚用于输入编程脉冲;而在平常,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6,因此它可用作对外部输出的脉冲或用于定时目的,然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲,如想禁止ALE的输出可在SFR8EH地址上置0,此时ALE只有在执行MOVX,MOVC指令时ALE才起作用;另外,该引脚被略微拉高,如果微处理器在外部执行状态ALE禁止,置位无效[1];

-PSEN:外部程序存储器的选通信号,在由外部程序存储器取指期间,每个机器周期两次/PSEN有效,但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现;

-EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器,注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器,在FLASH编程期间,此引脚也用于施加12V编程电源(VPP);

-XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入;

-XTAL2:来自反向振荡器的输出;

振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出,该反向放大器可以配置为片内振荡器,石晶振荡和陶瓷振荡均可采用,如采用外部时钟源驱动器件,XTAL2应不接,有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度[1]。

2.2显示模块设计

本设计显示模块采用不带字库PGLCD12864。

2.2.1 PG12864LCD的特性介绍

PG12864LCD是像素可寻址的图形液晶显示屏模块,PG12864LCD特性如下:

?工作电压为+5V,可自带驱动LCD所需的负电压;

?全屏幕点阵,点阵数为128列*64行,可显示8行*4行个(16*16点阵)汉字,也可完成图像,字符的显示[3];

?与CPU接口采用5条位控制总线和8位并行数据总线输入输出;

?内部有显示数据锁存器,自带EL驱动;

?简单的操作指令;

?数据口可以采用串行传输与并行传输

2.2.2 LCD12864引脚介绍

表2.2 LCD12864引脚

管脚号管脚名称管脚功能描述

1 VSS 接地

2 VDD 接电压

3 V0 液晶显示器驱动电压

4 RS RS=“H”表示DB7-DB0为显示数据;RS=“L”表示DB7-DB0为显示指令数据

5

R/W R/W=“H”,E=“H”数据被读到DB7-DB0R/W=“L”,E=“H→L”数据被写到IR或DR

6 E R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0

7 DB0 数据线

8 DB1 数据线

9 DB2 数据线

10 DB3 数据线

11 DB4 数据线

12 DB5 数据线

13 DB6 数据线

14 DB7 数据线

15 CS1 H:选择芯片(右半屏)信号

16 CS2 H:选择芯片(左半屏)信号

17 RET 复位低电平有效

18 VOUT 驱动负电压

19 LED+ 背光电源

20 LED- 背光接地

通过DB0- DB7数据线和AT89C51IO口连接,对应的管脚必须有效,在显示的时候,要

通过列驱动和行驱动来控制液晶屏显示,在驱动时,对应的都有相应的控制器来控制[3],由于其显示分为左半屏和右半屏,当CS0为1时,左半屏开显示;CS1为1时,右半屏开显示,12864管脚功能如表2-2所示。

2.2.3 12864内部功能器件及相关功能

?指令寄存器(IR)

指令寄存器是用于寄存指令码,与数据寄存器数据相对应;当D/I=0时,在E信号下降沿的作用下,指令码写入指令寄存器。

?数据寄存器(DR)

数据寄存器是用于寄存数据的,与指令寄存器寄存指令相对应,当D/I=1时,在下降沿作用下,图形显示数据写入数据寄存器,或在E信号高电平作用下由数据寄存器读到DB0-DB7数据总线,DR和DDRAM之间的数据传输是12864模块内部自动执行的[4]。

?忙标志(BF)

BF标志提供内部工作情况,BF=1表示模块内部操作在忙状态,此时模块不接受外部指令和数据;BF=0时,模块为准备状态,随时可接受外部指令和数据,利用STATUS READ指令,可以将BF读到DB7总线,从而检验模块工作状态。

?显示控制触发器DFF

此触发器是用于模块屏幕显示开和关状态的控制,DFF=1为开显示(DISPLAY OFF),DDRAM的内容就显示在屏幕上;DFF=0为关显示(DISPLAY OFF),关闭屏幕,DDF的状态是由指令DISPLAY ON/OFF和RST信号控制的。

?XY地址计数器

XY地址计数器是一个9位计数器,高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的列地址指针。

X地址计数器是没有记数功能的,只能用指令设置;

Y地址计数器具有循环记数功能,当数据写进去时,Y的地址数据就会自动加1,Y地址指针可以表示从0-63;

?显示数据RAM(DDRAM)

DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择,DDRAM 与地址和显示位置的关系见DDRAM地址表。

?Z地址计数器

Z地址计数器可以循环记数,共有六位,它是用于显示行扫描,当完成一行扫描,这个计数器的内容就会自动加1,并指向下一行数据扫描,当复位后Z地址计数器自动清0;Z地址计数器可以用DISPLAY START LINE指令预置,所以,就由这条指令控制屏幕显示的起始行,因为DDRAM共64行,因此可以循环滚动显示64行[5]。

各功能指令介绍如下

█显示开/关指令

R/WRS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

00 00111111/0

DB0为1时,LCD开显示;DB0为0,关闭显示。

█显示起始行(ROW)设置指令

R/WRS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

00 11显示起始行(0~63)

该指令设置了屏幕最上一行显示RAM的行号,要想实现滚屏显示的效果,可以改变显示起始行

█设置指令

R/WRS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

00 10111页号(0~7)

4、列地址(Y Address)设置指令

R/WRS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

00 01显示列地址(0~63)

显示RAM的64行可按8行为一页将其分为8页;设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样CPU就可以用读、写指令读出该单元中的内容或向该单元写进一个字节的数据。

█读状态指令

R/WRS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

10 BUSY0ON/OFFREST0000

该指令用来查询12864内部控制器的状态,各参量含义如下:

BUSY:1-内部在工作,也就是忙状态;0-正常状态

ON/OFF:1-显示关闭;0-显示打开

RESET:1-复位状态;0-正常状态

在BUSY和RESET状态时,除读状态指令外,其它指令均对12864模块内部无效[5],除此之外在操作之前要查询BUSY状态,以确定是否可以对12864模块进行操作。

█写数据指令

R/WRS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

01 写显示数据

█读数据指令

R/WRS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

11 读显示数据

要提醒的是,每次进行读数据之前,都要有一次空读操作,紧接着才会读出想要读的单元中的数据,而且每当完成一次读、写数据指令,内部的列地址就会自动加1,

2.2.4 12864液晶与单片机接口电路

在实际编程时,12864与单片机的连接有并行和串行两种方式可以选择,串行模式占用引脚较少(2个),速度较慢;并行模式占用引脚较多(11个),但传输速度较快,因为一次传8位,速度自然就快,因此我们采用并行传输。12864的数据口DB0-DB7分别接单片机的P1.0-P1.7用来传输数据;控制口RS、RW、EN分别接P3.2、P3.1、P3.0。

顺便在此和大家分享一下调试中遇到的各种问题及如何应对:

一:硬件问题

1:这种情况是新手最常碰到的问题,碰到这种情况首先要确定你的接线没有任何问题,如果是51单片机,用P0口一定要加10K的上拉电阻,不然程序正常了也显示不出来。

2:另外要注意第三脚VO的连接方式,这个是对比度电位引脚,实际中常采用10k的可变电阻滑动端连接VO脚,固定端的一段接VCC,另外一端应根据实际硬件连接。如果用的是1602,另一端直接接到GND就可以了,但是对于12864就应该看18脚的标记了,如果写的是NC ,那么另一端直接接地,如果是VEE,那么就应该接到18脚,因为这时的18脚是负压输出端。根据这点确定你的对比对调节电路接法正确无误。

3:关于串并行选择的问题。串并行选择对于有字库的12864适用(1602的四线驱动也可以叫做串行驱动),如果有PSB引脚,那么你的屏应该可以支持串并行了。串并行的选择决定于PSB引脚的电位,一般是低电平为串行模式,高电平为并行模式。有些同志在使用的时候对PSB进行了电位定义但是没有任何显示,这是你应该注意一下LCM板上焊点,尤其是和PSB 引脚相连的那些起跳线作用的焊点。因为大多厂家在出厂的时候就预先设置为并行模式,也就是接到高电位上(VCC)。碰到这种情况把焊点跳线重新焊接一下,接到低电位上就可以了。模式选择错误不显示是小问题,由于屏电路的不同,可能你在驱动的时候损坏屏或者单片机,因为选择不对,定义的电位相当于短路。

二:软件问题

软件问题一般也就是定义的引脚不对,这种情况出现于真正的初学者,在copy别人的程序或者屏本身的模板程序没有修改引脚的定义,这种情况比较简单,只需要把引脚对应的端口重新定义一下就可以了。

三:显示不清楚

A:屏上的VO引脚(3脚)电位不对如果你按照上面的说法接了对比度电路,这时你只需要调节电位器的旋钮就可以了,最终可以得到你满意的对比度,使显示最清晰。一般这个脚的电压是 - 6.2V左右,这个电压的显示效果是最好的。

B:电源问题

很多同学在现成的实验板上做试验,电源取自电脑USB口,这种情况容易出现显示不清楚的情况,原因是供电电流不够,因为电脑的USB口为500mA供电。碰到此类情况,用外接电源,肯定可以解决。所谓的网上的那些个底层驱动程序,个人觉得没有必要,所谓知其然知其所以然,就是这个道理。

图2-3 12864接口电路

表2.3 12864引脚分配

2.3设置模块

设置模块采用三个按键与单片机与GND 连接 按键与单片机的接口电路如图2-4所示。

按键一端与GND 连接,另一端与单片机GPIO 口连接(相应的引脚接到P3.0, P3.1. P3.3上),当I/O 为低电平则按键按下;其中K1:模式选择键(正常计时与调节时间模式)K2:时分秒选择按键K3:调节时/分/秒大小。

引脚号 12864引脚 STC89C51引脚 7-14 DB0-DB7 P1.0-P1.7 5 WR P3.1 4 RS P3.2 6 CE P3.0 17

RST

图2-4 按键电路 K1K2

K3

按键选用触动开关。

2.4 振荡电路

振荡电路选为内部振荡方式。由于所要设计的时间由内部自带的定时器中断和软件计数相结合产生的,故从计算方便以及系统的效率角度出发,设计选用12兆频率的晶振,其电路如图2-5所示。

2.5 复位电路

单片机采用高电平(I/O口为1时)复位。单片机选用12兆频率晶振,起振为一毫秒,所以两个机器周期的用时为两微秒。

单片机单次上电复位所需的最短延时应该大于上电延时与单片机起振延时两者之和。延迟一个时间还太小,不能够促使单片机有一个较好的工作开始[7]。

复位电路使单片机保持在复位状态并且维持一个延时,这样可以给电源电压从上升到稳定的一个等待时间;在电压稳定,再进行一个延时状态,给时钟振荡器由起振到稳定的一个延时;在单片机开始进入运行状态之前,至少推迟2个机器周期的延时间。当单片机RET端

为高电平的时单片机复位,主要是复位电路由电阻、电容晶振组成;电容充电的时RST端为高电平,此时单片机开始复位;当该电容电充满,此时单片机完成复位。

3系统软件设计

3.1总体软件设计

软件设计是较难部分,利用keil软件编写程序,并生成Hex文件,下载到单片机。由于本程序涉及的模块较多,所以编写程序采用模块化设计,C语言具有编写灵活性好、移植方便、便于模块化设计的优点,所以采用

初始化

i<2

i=0

i=0

开中断

通过K2,K3

调节时分秒

图3-1系统图

图2-5 振荡电路

图2-6 复位电路RST

R1 100k

C 语言给单片机编写程序。框图如图3-1所示。

其中K1:模式选择键(正常计时与调节时间模式) K2:用于时/分/秒选择按键K3:用于调节时/分/ 秒大小按键i:用于统计K1键按下的次数 3.2 时钟函数模块

时钟定时由单片机内部定时器中 断来完成。中断50ms 来一次, 20次为一秒。因此20次中断 秒加一同时秒针转过一格。同 理秒满60分加一同时分针转 一格。当分满60时加一同时

时针走一下[6]。时钟部分如图3-2所示。

如果时为12令是

其为0 时加一

分==60?

分加一

秒==60?

继续执行

上面的步骤

20次中断到没 秒加一

开相关中断,装初值

开定时器,定时模式

开始

中断次数计数 图3-2 时钟框图

3.3 指针时钟设计

3.3.1 实现功能

实现指针时钟的动态显示,并且具有可以在LCD_12864显示器上画点以、画线以及画圆的功能。

3.3.2实现算法

LCD_12864模拟时钟画图主要采用Bresenham的算法。Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换方法。Bresenham算法,可以说是DDA算法的简化,两者大致的异同:DDA算法,是某一个长的方向,每一次变化一个单位或者一个单位像素,另外一个方向的变化量可以通过浮点运算和四舍五入计算得到。而Bresenham算法对于下一个点的坐标的取值,则是通过判断一个反复迭代的误差因数是否大于零,而在迭代的计算误差因数的时候,只用到了整型数的加法和移位操作,计算量非常小,是最高效的单步画线算法。由于Bresenham算法仅用到了整形数的加法和移位操作,大大减少了计算机运算量,便于在小型的计算机系统中(例如单片机系统等)实现其功能。也就是这个原因,Bresenham算法的运用更为广泛了。

其原理是:

通过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的

顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近

的像素。

该算法的优点在于可以采用增量计算,使得对于每一列,只要检查一个误差项

的符号,就可以确定该列所求的像素。

1)画直线

LCD画直线,也就是确定直线光栅化后的一系列坐标,在LCD点阵中显示出来,也有人叫直线光栅化。实现这种光栅直线的算法有中点画线法

Bresenham算法是DDA算法画线算法的一种改进算法。本质上它也是采取了步进的思想。不过它比DDA算法作了优化,避免了步进时浮点数运算,同时为选取符合直线方程的点提供了一个好思路。首先通过直线的斜率确定了在x方向进行单位步进还是y方向进行单位步进:当斜率k的绝对值|k|<1时,在x方向进行单位步进;当斜率k的绝对值|k|>1时,在y方向进行单位步进。

下面以|k|<1时推导Bresenham算法的数学依据:

已知有一直线y = kx+b,|k|<1。我们通过斜率确定了x方向为单位步进。当x = Xm时,y = Ym。那么当x 执行一个单位步进时(即x = Xm+1时),y等于Ym还是等于Ym+1更符合这个直线方程呢?单凭肉眼我们很难得出结论,最好的办法当然是比较Ym和Ym+1和真实的方程的y值的差是多少(即Yreal = k*(Xm+1)+b),看看哪一个更靠近真实的方程的y值。我们设

Dupper = Ym+1 - Yreal = Ym+1 - k*(Xm+1)+b); 表示Ym+1和方程真实值的差

Ddown = Yreal - Ym = k*(Xm+1)+b)- Ym; 表示Ym和方程真实值的差

那就是我们要比较Dupper和Ddown的大小。假设

Diff = Dupper - Ddown = (Ym+1 - k*(Xm+1)+b)) - (k*(Xm+1)+b)- Ym)

令△X 为线段x方向的间距,△Y 为线段y方向的间距。

Pm = △X* Diff = 2*△X* Ym-2*△Y* Xm-2*△Y-△X*(2b-1);

那么Pm+1 = Pm+2*△X*(Ym+1- Ym)-2*△Y;

其中Ym+1- Ym取0还是1,取决于Pm的符号。

根据等式Diff = Dupper - Ddown = (Ym+1 - k*(Xm+1)+b)) - (k*(Xm+1)+b)- Ym)以及k = △Y/△X,我们可以得出起始像素(x0,y0)的参数p0的值:

P0 =△X-2*△Y;

同理我们推出|k|>1的情况,Qm = 2*Xm*△Y-2*Ym*△X+(2b-2)*△X+△Y;

Qm+1 = Qm+2*(Xm+1-Xm)*△Y-2*△X;

其中Xm+1-Xm等于0还是1,取决于Qm的符号

其中第一个参数Q0 = △Y-2*△X;

明白了数学原理,我们很快能确定算法步骤:

1. 输入线段的起点和终点。

2. 判断线段的斜率是否存在(即起点和终点的x坐标是否相同),若相同,即斜率不存在,只需计算y方向的单位步进(△Y+1次),x方向的坐标保持不变即可绘制直线。

3. 计算线段的斜率k,分为下面几种情况处理

a. k等于0,即线段平行于x轴,即程序只需计算x方向的单位步进,y方向的值不变

b. |k|等于1,即线段的x方向的单位步进和y方向的单位步进一样,皆为1。直接循环

△X次计算x和y坐标。

4. 根据输入的起点和终点的x、y坐标值的大小决定x方向和y方向的单位步进是1还是-1

6. 画出第一个点。

7. 若|k| <1,设m =0,计算P0,如果Pm>0,下一个要绘制的点为(Xm+单位步进,Ym),Pm+1 = Pm -2*△Y;

否则要绘制的点为(Xm+单位步进,Ym+单位步进)

Pm+1 = Pm+2*△X-2*△Y;

8. 重复执行第七步△X-1次;

9. 若|k| <1,设m =0,计算Q0,如果Qm>0,下一个要绘制的点为(Xm,Ym+单位步进),Pm+1 = Pm -2*△X;

否则要绘制的点为(Xm+单位步进,Ym+单位步进)

Pm+1 = Pm+2*△Y-2*△X;

10. 重复执行第9步△Y-1次;

2)画圆

Bresenham画圆算法又称中点画圆算法,与Bresenham 直线算法一样,其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一些加、减和移位运算就可以计算出来。为了简便起见,考虑一个圆心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。只需要知道了圆上的一个点的坐标 (x, y) ,利用八对称性,我们马上就能得到另外七个对称点的坐标。将圆平均分为8个部分

1.只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这个圆

X变化从0->R那为什么不采用从-R->R呢,Y=+-sqrt(R^2-x^2);dy/dx=-x/(sqrt(R^2-x^2)) =-x/y

所以采用从-R到R,每次横坐标增1,计算量大,而且在(x=+-R,y=0)处,x的很小变化就引起了y的很大变化。

所以不是采用x从-R--->R变化。而是采用1/8画圆法。

2.在2这1/8圆周上,x 值单调增加,y 值单调递减,且fabs(dx/dy)=fabs(-x/y)<=1;所以圆周 上相应点的y 值变化小于1,假设当前点为(x1,y1)这下个点为(x1+1,y1)或(x1+1,y1-1) d1=(x1+1)^2+y1^2-R^2;d2=R^2-(x1+1)^2-(y1-1)^2;p=d1-d2 ,若p>0 选点(x1+1,y1-1)否则选点(x1+1,y1)接下来就是求p 了,p=2(x1+1)^2+2y1^2-2y1-2R^2+1。P1=3-2R(坐标为x=0,y=R)然后仿照线段算法得出p(i+1)=p(i)+4(Xi-Yi)+10(pi>0)否则P(i+1)=p(i)+4Xi+6 这样就可以成功画出1/8圆弧了

3.接下来的问题,是剩下的部分怎么处理 存储器将前1/8的坐标存储起来,然后通过镜像求出其他圆弧坐标,调整顺序输出,即可得到。

3.3.3 函数设计 1:实现功能

从指定坐标处绘制一个点或擦除一个点

2:实现依据

通过LCD_set_XY 确定坐标,然后根据擦除还是绘制再确定点在坐标的位置,再判断是擦除还是绘制,最后使用LCD_write_byte 函数写入数据。图3.3为流程图。

2: void Line(uchar x1,uchar y1,uchar x2,uchar y2,bit Mode) (1)实现功能

在LCD_12864上绘制一条线段 (2)实现依据

利用两点式(直线方程)在直线点的轨迹上绘制/擦除点以完成绘线。

(3)具体流程图如图3-4所示。 3:void Clock_Plate() (1)实现功能

绘制一个指针式模拟时钟的圆盘。 (2)实现依据

利用圆的轨迹方程找到点的坐标,再根据点的坐标绘制图形。

定位XY 坐标

向LCD 绘/擦出点

开始

结束 图3-3 擦/绘点

确定线段两端点的

坐标关系

沿两间的轨迹绘点或擦点

开始

结束

图3-4 绘直线框图

(3)流程图图3-5所示。

4:void Repaint_A_Hand(uchar i)

(1)实现功能 根据当前时间绘制对应的指针,并擦除上次显示的指针 (2)实现依据

利用圆的弧度与时间的对应关系,由于圆的弧度随时间

而变化,据此从圆心到圆弧对应时间的位置画出直线就是指针。

(3)绘制指针框图如图3-6所示。 5:void Display_HMS_Hand()

(1)实现功能

重新绘制模拟的秒针、分针、时针。

(2)实现依据

调用Repaint_A_Hand 函数设置当前参

数,据此绘制当前时间对应的指针。 (3)重新绘制指针如图3-7所示。

6:void Display_ClockZhizhen()

(1)实现功能

读取时间绘制指针时钟到LCD_12864上

(2)实现依据

读取时间,由于指针随时间而变化,绘制的模拟指针时钟,另外判断调节按键的键

确定圆心坐标及其半径长度

沿圆的轨迹进行绘点

开始

结束

图3-5 绘制指针圆盘

框图

判断重新绘哪一条指针

擦除指针上一秒状态

开始 结束

图3-6 绘制指针框图

重绘秒针

重绘分

开始

结束

重绘时

图3-7 重新绘制指针

图3-8 随时间绘制指针 绘制时针表盘

开始

读取时间 根据时间绘制时分秒针 结束

值是否为退出键的键值,若是则返回菜单界面。

(3)流程图如图3-8所示。

3.4 显示函数模块

通过LCD_Check_Busy()检测LCD是否忙碌,通过LCD_Write_Command向LCD发送写命令,通过void LCD_Write_Data向lcd发送写数据命令,通过LCD_Initialize初始化12864显示屏。

由于用的LCD_12864是自带字库的,故可以直接显示字符和汉字,同时根据液晶显示屏的要求对应圆盘的大小都是可以规定的。

1)lcd_12864写命令函数

void writecmd(uchar cmd)// LCD_12864液晶写命令

{

while((readstatus() & 0x80)!= 0x00); //LCD_12864液晶显示读状态

LCDDATA=0x00;

RW=0;

RS=0;

EN=0;

LCDDATA=cmd;

delay(2);

EN=1;

delay(3);

EN=0;

}

2)lcd_12864写数据函数

void writedate(uchar date) //LCD_12864液晶写数据

{

while((readstatus() &0x80 )!=0x00);

LCDDATA=0x00;

RW=0;

RS=1;

EN=0;

LCDDATA=date;

delay(2);

EN=1;

delay(3);

EN=0;

}

3)LCD_12864液晶显示读状态函数

uchar readstatus()//LCD_12864液晶显示读状态

{ uchar i;

LCDDATA=0xff;

RW=1;

RS=0;

EN=0;

delay(2);

EN=1;

delay(3);

i=LCDDATA;

delay(3);

EN=0;

return(i);

}

4)LCD_12864液晶读数据函数

uchar readdate()//LCD_12864液晶读数据

{

uchar i;

while((readstatus() &0x80 )!=0x00);

RW=1;

RS=1;

EN=0;

delay(2);

EN=1;

delay(3);

i=LCDDATA;

delay(3);

EN=0;

return i;

}

5)LCD_12864液晶初始化函数

void LCD_init()// LCD_12864液晶初始化

{

writecmd(0x30);

delayms(1);

writecmd(0x30);

delayms(1);

writecmd(0x0c);

delayms(1);

writecmd(0x01);

delayms(1);

writecmd(0x06);

delayms(1);

}

用C++编写模拟时钟程序

模拟时钟程序 1 基本功能描述 本次课程设计是基于面向对象的应用程序设计,主要运用C++语言在VC++开发环境下的MFC中编程实现。模拟时钟的基本功能是程序初始在屏幕上有一指针式时钟表盘,表盘为椭圆形,内部分布有12个刻度,表盘上有三个长度和颜色不同的时针分针和秒针,相互之间容易辨认,指针的运动通过数学推导之后以代码实现。表盘的下方是一个数字形式显示的数字钟,其显示时间的格式是时:分:秒,指针式时钟和数字式时钟显示的时间同步,且两个时钟所显示的时间与系统时间相致,页面的菜单项设有时间设置项,可以对所显示的时间进行调整,能进行调整的具体内容是年、月、日、时、分、秒。设计成功之后,此应用程序便可以起到时钟显示的作用。 2 设计思路 2.1 程序流程图

图1 模拟时钟程序流程图 2.2 程序流程分析 (1) 绘制指针式的时钟和数字式的时钟图形时,要在CView类下进行。其中OnDraw()函数在绘制视图窗口时被调用,在定义了画刷CBrush和画笔CPen之后,调用GetClientRect()定义屏幕大小并确定椭圆中心的坐标,然后调用Ellipse绘制椭圆,即指针式的时钟表盘,SetTextColor绘制文本颜色,调用MoveTo和LineTo绘制表盘指针,同时调用CreateFont()创建数字钟字体,TextOut则是用以数字钟的文本输出。 (2) 模拟时钟处理消息的过程:首先调用SetTimer函数定义时钟消息,包括参数指定计时器的ID,消息产生的时间间隔,回调函数为NULL;调用消息处理函数OnTimer()刷新窗口显示。在相应的WM_TIMER消息处理里添加时钟消息响应代码;最后调用KillTimer 释放该时钟。 (3) 要实现时钟的动态效果,即时间窗显示的时间每隔一秒钟更新一次,需要在时间窗格的正文调用CStatusBar::SetPaneText()函数。要定时更新,则应利用WM_TIMER消息,计时器每隔一定的时间间隔就会发出一个WM_TIMER消息,而这个时间间隔可由用户指定。MFC的Windows类提供了WM_TIMER消息处理函数OnTimer(),应在该函数内进行更新时间窗格的工作。先利用ClassWazard给CMainFrame类加入WM_TIMER消息处理函数OnTimer(),CMainFrame:: OnTimer()函数是在系统发给框架窗口消息WM_TIMER时调用

时钟计时器课程设计

单片机原理及应用课程设计报告书 题目:时钟计时器的设计 姓名: 学号: 专业:电气工程及其自动化 指导老师:周令 设计时间:2011年4月 电子与信息工程学院

目录 1. 引言 (1) 1.1. 设计意义 (1) 1.2. 系统功能要求 (1) 2. 方案设计 (1) 2.1. 数字时钟计时器设计方案论证 (1) 2.2. 硬件系统的总体设计框图 (2) 3. 硬件设计 (2) 4. 软件设计 (3) 4.1. 主程序 (3) 4.2. 显示子程序 (4) 4.3. 定时器T0中断服务程序 (4) 4.4. 定时器T1中断服务程序 (5) 4.5. 调时功能程序 (6) 4.6. 秒表功能程序 (6) 4.7. 闹钟时间设定功能程序 (6) 5. 调试及性能分析 (7) 5.1. 硬件调试 (7) 5.2. 软件调试 (7) 5.3. 性能分析 (8) 6. 设计总结 (8) 7. 附录A:汇编源程序 (9) 8. 附录B:作品实物图片 (26) 9. 参考文献 (27)

时钟计时器的设计 1.引言 1.1.设计意义 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字时钟计时器,本数字时钟计时器,可以显示时、分、秒,以24小时计时方式运行,能整点提醒(短蜂鸣,次数代表整点时间),使用按键开关可实现时、分调整,秒表/时钟功能转换,省电(关闭显示)及定时设定提醒(蜂鸣器)等功能。 人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字时钟计时器就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。 本设计所介绍的数字时钟计时器与传统的计时器相比,具有读数方便,操作简单,计时精准,还能实现整点提醒,定时提醒等功能。其输出时间采用数字显示,主要用于对时间要求精度高的场所,或科研实验室使用,该设计控制器使用单片机AT89C52,用6位共阳极LED数码管以串口传送数据,实现数字显示功能,能准确达到以上要求。 1.2. 系统功能要求 用单片机及6位LED数码管显示时、分、秒,以24小时计时方式运行,能整点提醒(短蜂鸣,次数代表整点时间),使用按键开关可实现时、分调整,秒表/时钟功能转换,省电(关闭显示)及定时设定提醒(蜂鸣器)等功能。 2.方案设计 2.1. 数字时钟计时器设计方案论证 为了实现LED显示器的数字显示,可以采用静态显示法和动态显示法。由于静态显示法需要数据锁存器等硬件,接口复杂一些,又考虑到时钟显示只有6位,且系统没有其他复杂的处理任务,所以决定采用动态扫描法实现LED的

模拟时钟转动程序

模拟时钟转动程序 一、课程设计的内容 能模拟机械钟表行走,还要准确利用数字显示日期和时间,在屏幕上显示一个活动时钟,按任意键时程序退出。 二、课程设计的要求与数据 1.进一步掌握和利用C语言进行课程设计的能力 2.进一步理解和运用结构化程序设计的思想和方法 3.初步掌握开发一个小型实用系统的基本方法 4.学会调试一个较长程序的基本方法 5.学会利用流程图和N-S图表示算法 6.掌握书写程序设计开发文当的能力 三、课程设计应完成的工作 1、编写完成相应题目的程序 2、编写课程设计报告,课程设计报告应该包含以下6部分 1)需求分析:包括设计题目、设计要求以及系统功能需求分析 2)总体设计:包括系统总体设计框架和系统功能模块图 3)详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图 4)调试分析过程描述:包括测试数据、测试输出结果以及对程序测试过程中存在问题进行思考(主要问题的出错现象、出错原因、 解决方法及其效果等,相应效果截图) 5)总结:课程设计完成了哪些主要功能,是否有扩展功能?还有哪些地方需要改进?课程设计的学习与体会?有哪些合理化建 议? 6)附录:主要原程序代码含必要的注释 3、答辩:在实验室建立程序运行环境,并在指导教师的监督下,独立解决问题,运行程序和回答教师的提问。 四、课程设计进程安排

五、应收集的资料及其主要参考文献 [1]谭浩强.C程序设计(第三版)[M]北京:清华大学出版社,2005年9月 [2]谭浩强.C程序设计题解与上机指导(第三版)[M]北京:清华大学出版社,2005年7月 [3]夏宝岚张慕蓉夏耘.程序设计教程(第二版)[M],上海:华东理工出版社,2003.1 [4]陈锦昌赵明秀.C语言计算机绘图教程(第一版)[M],广州:华南理工大 学出版社,1998.9 发出任务日期:2010年12月15日指导教师签名: 计划完成日期:2010年12月30日基层教学单位责任人签名: 主管院长签章: 目录 1.设计目的与要求 (5)

模拟电子时钟c语言程序

算法:将当前时间显示到屏幕,当时间发生变化时,清屏,显示新的时间(当有键盘操作时退出程序)。 显示时间格式:小时:分钟:秒 /* DEV C++ Win XP*/ #include #include #include #include typedef struct { int x; int y; }Point; time_t now; struct tm *pt,t1,t2; int printpoint(Point p) { Point p1; p1.x=p.x+2; p1.y=p.y+4; gotoxy(p1.x,p1.y); printf("%c%c",2,2); gotoxy(p1.x, p1.y+1); printf("%c%c",2,2); p1.y+=4; gotoxy(p1.x,p1.y); printf("%c%c",2,2); gotoxy(p1.x,p1.y+1); printf("%c%c",2,2); return 0; } int print0(Point p) { int i=0; for(;i<13;i++) { gotoxy(p.x+1, p.y+i); if(i==0||i==12) printf("%c%c%c%c%c%c",2,2,2,2,2,2); else printf("%c%4s%c",2," ",2); } return 0; }

int print1(Point p) { int i=0; for(;i<13;i++) { gotoxy(p.x+1, p.y+i); printf("%5s%c"," ",2); } return 0; } int print2(Point p) { int i=0; for(;i<13;i++) { gotoxy(p.x+1, p.y+i); if(i==0||i==6||i==12) printf("%c%c%c%c%c%c",2,2,2,2,2,2); else if(i>0&&i<6) printf("%5s%c"," ",2); else printf("%c",2); } return 0; } int print3(Point p) { int i=0; for(;i<13;i++) { gotoxy(p.x+1, p.y+i); if(i==0||i==6||i==12) printf("%c%c%c%c%c%c",2,2,2,2,2,2); else printf("%5s%c"," ",2); } return 0; } int print4(Point p) {

单片机课程设计 秒表计时器(DOC)

课程设计名称:单片机原理及接口技术 题目:基于单片机的秒表计时器设计 学期:2014-2015学年第一学期 专业:电气技术 班级: 姓名: 学号: 指导教师:

辽宁工程技术大学 课程设计成绩评定表

课程设计任务书 一、设计题目 秒表计时器 二、设计任务 本课题以单片机为核心,设计和制作一个秒表计时器。 三、设计计划 课程设计一周 第1天:查找资料,方案论证。 第2天:各部分方案设计。 第3天:各部分方案设计。 第4天:撰写设计说明书。 第5天:校订修改,上交说明书。 四、设计要求 1、绘制软件流程图并利用汇编语言编写软件程序; 2、绘制系统硬件原理图; 3、形成设计报告。 指导教师: 教研室主任: 2014年5月26 日

本设计利用89C51单片机设计秒表计时器,通过LED显示秒十位和个位,在设计过程中用一个存储单元作为秒计数单元,当一秒到来时,就让秒计数单元加一,通过控制使单片机秒表计时,暂停,归零。设计任务包括控制系统硬件设计和应用程序设计。 关键词:51单片机;74HC573;LED数码管

综述 (1) 1 程序方案 (2) 1.1方案论证 (2) 1.2总体方案 (2) 2部分设计 (3) 2.1 89C51单片机 (3) 2.2晶体振荡电路 (4) 2.3硬件复位电路 (5) 2.4显示电路 (6) 2.5整体电路图 (7) 3程序设计 (8) 3.1程序流程框图 (8) 3.2显示程序流程图 (9) 3.3汇编源程序 (10) 4调试说明 (13) 4.1概述 (13) 4.2电路原理图 (13) 心得体会 (15) 参考文献 (16)

用C#编的模拟时钟(附源代码)

使用C#模拟时钟表的一种简单制作方法 1.GDI+图形库简介 1.1概述 GDI+是Microsoft的新.NET Framework类库用于图形编程,因为它是.NET Framework的一部分,所以也是面对对象的。 1.2设备环境和对象 在GDI+中识别输出设备的方式是使用设备环境DC对象,该对象存储特定设备的信息并能把GDI+API函数调用转换为要发送给该设备的指令,还可以查询设备环境对象,确定对应的设 备有什么功能,这样才能据此调整输出结果。 在GDI+中设备环境包装在.NET基类System.Drawing.Graphics中,大多数绘图工作都是调用Graphics的对象完成的。 2.如何利用GDI+绘制时钟表 2.1时钟表的各控件属性的设置 用C#中各控件制作一个指针式的时钟放在桌面上显示的界面。包括1个PictureBox控件、1个Timer控件、1个NotifyIcon控件及StatusStrip控件。 2.2各控件的属性设置 Timer控件的Interval属性值设置为1000,Enable属性值设置为True;窗体的StartPosi tion属性设置为CenterScreen,这个属性使得钟表在屏幕上中中央显示。 2.3功能实现代码 为实现该时钟表功能,需要设计并输入相应对象相应事件或过程的程序代码。方法是:在设计状态,双击相应控件,或双击控件的某一事件,并输入相应的C#程序代码。 2.4通用声明及时钟表设计方法 在程序中需要有一批变量或常量的定义,可事先在通用声明中完成,代码如下: const int s_pinlen = 100;//秒针长度 const int m_pinlen = 75; //分针长度 const int h_pinlen = 75; //时针长度 PointF center = new PointF(s_pinlen +3, s_pinlen +3);//中心点位置 SolidBrush sb = new SolidBrush(Color.Black);//时钟圆心的刷子 除上述变量声明外,时钟表功能编写子方法,方法名为:AngleToPos和myClock,

模拟时钟电路的程序

//单片机实验模板文件。具有三个基本功能: // 1、数码管、发光二极管扫描显示 // 2、键盘扫描,返回0---15 // 3、T0中断,产生基本延时2.5ms,并且调用显示函数 // 根据以上功能,该文件为进一步编写实验程序、实际应用程序,提供了基础 #include #define delay5ms(x) {delay_xms=x*2; while(delay_xms<255);} //用于延时的宏,x的1个数值对应延时5ms。 x<=127。 void display(void); unsigned char code ledcode[]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0}; //共阴极7段数码管显示段码 //unsigned char xdata dis_seg _at_ 0xfeff; //输出数码管段显示码地址 //unsigned char xdata dis_bit _at_ 0xfdff; //输出数码管位控制码地址unsigned char min,sec,hour; unsigned char bdata dis_buf[7]; //dis_buf[0]为最高位数据(显示在左边),dis_buf[5]为最低位数据;dis_buf[6]为8个发光二极管的数据。 unsigned char data delay_xms; //用于延时 sfr IPH = 0xb7; //定义中断优先级(高2级)寄存器 //****************************************************************** void int_t0(void) interrupt 1 //T0中断函数,fosc按11.0592M计算,定时时间为2.5ms { TH0=0xf7; delay_xms--; display(); //调用显示函数 } //****************************************************************** void display(void) //数码管显示函数。左边是最高位,从左边开始扫描,函数每执行1次仅扫描1位,每2.5ms扫描一位 { static unsigned char data i=0, scan=0xfe; P0=0; if(i<6) P0=ledcode[dis_buf[i]]; else

模拟时钟的VB程序

沈阳航空航天大学课程设计 学号2009040301055 班级94030102 姓名李超 指导教师刘学平 2010 年3 月15 日

沈阳航空航天大学 课程设计任务书 学院:航空宇航工程学院专业:飞行器制造班级:94030102 学号:2009040301055 题目:模拟时钟 一、课程设计时间 2011年3月7日~11日(第1周),共计1周。 二、课程设计内容 在窗体上演示一个正在工作的有时、分、秒指针的时钟,要求:可以对时钟的时间进行手工修正。 用户界面中的菜单(或命令按钮)至少应包括“运行时钟”、“修改时间”、“退出”3项。 三、课程设计要求 程序质量: ?贯彻事件驱动的程序设计思想。 ?用户界面友好,功能明确,操作方便;可以增加其它功能或修饰。 ?代码应适当缩进,并给出必要的注释,以增强程序的可读性。 课程设计说明书: ?课设结束后,上交课程设计说明书和源程序。课程设计说明书的内容参见提 供的模板。 四、指导教师和学生签字 指导教师:________ 学生签名:________ 五、成绩 六、教师评语

目录 一、需求分析 (4) 二、设计分析 (5) 三、关键技术 (7) 四、总结 (12) 五、完整的源程序 (14) 六、参考文献 (16)

一、需求分析 “模拟时钟”软件。在窗体上演示一个正在工作的有时、分、秒指针的时钟,要求:可以对时钟的时间进行手工修正。用户界面中的菜单(或命令按钮)至少应包括“运行时钟”、“修改时间”、“退出”3项。 ①在VB窗体Form1中设计模拟时钟表盘,设计四个按钮:运行时钟、修改时间、应用、退出。在窗体Form2中设计填输入时间的位置和两个按钮:重新输入、确定。 ②用运行时钟按钮使时钟从零点开始运行。 ③利用修改时间按钮在Form2中输入合理时间,单击确定后单击应用使模拟时钟按所需时间开始运行。 ④Form2中重新输入按钮可以使所有Text控件清空,可以进行时间的重新输入。 ⑤程序可以实现时钟指针的转动。

多功能计时器-课程设计

信息工程学院课程设计报告书题目: 多功能计时器 专业:电子信息科学学技术 班级: 学号: 学生姓名: 指导教师: 2012 年 12 月 24 日

信息工程学院课程设计任务书 年月日

信息工程学院课程设计成绩评定表

摘要 此多功能计时器是基于741s48、74ls192、555定时器、CD40161设计的,由六个主要部分组成,即控制电路、秒脉冲发生器、计数器、译码显示器、置数电路以及声光报警电路,包含置数(00至99)、1s倒计时、开启、暂停、连续、清零以及到点声光报警等主要功能,也能完成一个完整的系统过程,可用于各种竞赛计时,交通灯系统,及报警装置。计时范围为00至99,可智能控制。 关键词:多功能计时器、1s倒计时、连续、声光报警

目录 目录 (4) 1 任务提出与方案论证 (5) 1.1 任务提出 (5) 1.2 方案论证 (5) 2 总体设计 (6) 2.1 总体框图 (6) 2.2 总体电路 (7) 3 详细设计 (8) 3.1秒脉冲发生器 (8) 3.2译码计时电路 (10) 3.3控制电路 (13) 3.3.1总开关 (13) 3.3.2单刀双掷开关 (13) 3.4反馈电路 (14) 3.5报警电路 (14) 3.6置数电路: (15) 4 总结 (17) 5 参考文献 (18)

1 任务提出与方案论证 1.1 任务提出 设计一种多功能计时器,要求实现以下功能: 置数、1s倒计时、开启、暂停、连续、清零以及到点声光报警,计时范围为00至99,可智能控制。能任意定时,开启和暂停及清零,1秒的准确延时,及到点声光报警。 1.2 方案论证 秒脉冲发生器:可以选用晶振产生,或者用555定时器或者555与CD40161同时产生,为了实现反馈,让计时器计数到零时停止,我选用CD40161 ,即实现了1s计数有可以形成反馈。译码电路:我选用4线-七段译码器/驱动器74LS48来实现。 计时电路:我选用十进制可逆计数器74LS48 ,可以用来置数,同时也可以来产生减计数。控制电路:用按键和反馈来实现。 报警电路:用speaker和led来实现。 置数电路:用单刀双掷开关选通74ls48的置数端,通过置0或置1来控制。

模拟电梯问题实验报告

电梯模拟问题 一、目的与要求 1. 掌握线性结构的逻辑特点及存储实现; 2. 根据选题,按规范化流程完成课程设计报告: ⑴.提供需求分析。(15分) ⑵.列出概要设计。(包括:抽象数据类型的描述;程序结构图或功能模块图)(20分) ⑶.给出详细设计。(包括:①存储结构的描述;②算法的详细设计,对复杂算法,最好画出其N-S流程图;③函数的调用关系图)(30分) ⑷.进行调试分析(注:调试时遇到的问题及解决方法,程序的输出结果及对结果的分析)。(15分) ⑸. 整理设计总结。(设计心得体会,以及其他总结信息等)(10分) ⑹.附有程序清单(注:代码可具有适当注释,用来说明程序的功能、结构)。(10分) 二、设计步骤 1、线性结构是有序数据元素的集合,存在着“一对一”的线性关系且只有一 个首结点,一个尾结点,首结点只有后继没有前趋,尾结点只有前趋没有后继。顺序表的存储结构包括顺序表和链表,顺序存储是指将线性表元素按照逻辑顺序依次存储在一组连续的地址单元中。链式存储是通过结点中的链域将线性表中n个结点按其逻辑顺序链接在一起。分为:单向链表,双向链表,循环链表。 2、(1)设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是 乘客和电梯等“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本独立的。在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。可模拟某校五层教学楼的电梯系统,或者九层教学楼的电梯系统。 此程序的关键是模拟好电梯运行状态的转换与乘客进出的同步进行,需要一个函数判断电梯的运行状态,决定电梯的下一个运行状态如电梯的开门,关门,上升,下降,减速,加速等,也需要模拟时钟的函数来判断该运行哪个函数,也需要定义几个结构体存放结点信息。 (2)时钟函数: void DoTime() { //此函数用于模拟时钟 while(1) { if(Time>MaxTime)

模拟时钟转动程序课程设计报告

《高级语言》课程设计 课题名称模拟时钟转动程序 学院信息工程专业网络工程地点 D507 学生姓名钟都华学号 13046130 开课时间 2013 至 2014 学年第 2 学期 同组人李卓 成绩

一、课程设计的目的和要求 1.课程设计的目的 本程序旨在训练读者的基本编程能力,使读者熟悉C语言图形模式下的编程。本程序中涉及时间结构体、数组、绘图等方面的知识。通过本程序的训练,使读者能对C 语言有一个更深刻的了解,掌握利用C语言相关函数开发电子时钟的基本原理,为进一步开发出高质量的程序打下坚实的基础。 2.课程设计的要求 能模拟机械钟表行走;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;要准确的利用数字显示日期和时间并且可以根据用户的需求更改当前时间(指针式时钟与数字式时钟实现同步更改);数字式时钟的时间显示与指针式时钟显示一致;可以通过上下键改变当前的时、分、秒;改的时间是小时、分钟、还是秒数;通过Tab键切换按Esc时程序退出。 二、设计 如下图,此电子时钟主要由以下4个功能模块组成。 1.界面显示模块 电子时钟界面显示在调用时钟运行处理之前完成,在这里主要调用了C语言图形系统函数和自负屏幕处理函数画出时钟程序的主界面。主界面包括类似Windows自带的电子时钟的界面和帮助界面两部冯。电子时钟界面包括一个模拟时钟运转的钟表和一个显示时间的数字钟表。在帮助界面中,主要包括一些按键的操作说明。 2.按键控制模块 按键控制模块主要完成两大部分功能。第一,读取用户按键的键值。第二,通过对键盘按键值得判断,执行相应的操作,如光标移动、修改时间。 3.时钟动画处理模块 在时钟动画处理模块中,它通过对相关条件的判断和时钟坐标值的计算,完成时、分、秒指针的擦除和重绘,以达到模拟时钟运转的功能。

24秒计时器课程设计

电子课程设计篮球24秒计时器 班级:自动化092201H班 姓名:陈鹏飞 学号:200922060101

目录 序言 (3) 一、设计任务及要求 (3) 二、总体框图 (3) .......................................................................................................... .......................................................................................................... .......................................................................................................... 三、选择器件 (4) ........................................................................................................... .......................................................................................................... 四、功能模块 (8) 五、总体电路设计 (12) 六、参考文献 (14) 七、心得体会 (14)

序言 篮球比赛中除了有总时间倒计时外,为了加快比赛的节奏,新的规则还要 求进攻方在24秒内有一次投篮动作,否则视为违例。本人设计了一个篮球比赛计时器,可对比赛总时间和各方每次控球时间既是。该计时器采用按键操作,LED 显示,非常实用,此计时器也可作为其他球类比赛的计时器。 篮球24秒计时器 一、设计任务与要求 1. 有显示24秒的计时功能 2. 置外部操作开关,控制计时器的直接清零,起碇和暂停连续功能 3. 计时器喂24秒递减计时器,其间隔为1秒 4. 计时器递减计时到0时,数码显示器不能灭灯 应发出光电报警信 号 二、总体框图 二. 1秒脉冲发生器: 秒脉冲信号发生器需要产生一定精度和幅度的矩形波信号。实现这样矩形波的方法很多,可以由非门和石英振荡器构成,可由单稳态电路构成,可以由施密特触发器构成,也可以由555点哭构成等。 不同的电路队矩形波频率的精度要求不同,由此可以选用不同电路结构的脉冲信号发生器。本实验中由于脉冲信号作为计数器的计时脉冲,其精度直接影响计数器的精度,因此要求脉冲信号有比较高的精度。一般情况下,要做出一个精度比较高的 频率很低的振荡器有一定的难度 工程上解决这一问题的办法就是先做一个频率比较高的矩形波震荡器,然后将其输出信号通过计数器进行多级分项,就可以得到频率比较低 精度比较高的脉冲信号发生器,其精度取决于振荡 秒脉冲发生器 外部操作信号 译码/显示电路 24t 计数器 控制电路 报警电路

C语言模拟时钟转动程序

#include"graphics.h" #include"math.h" #include"dos.h" #define pi 3.1415926 #define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300 #define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240 #define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y) void init() /*划时钟边框函数*/ { int i,l,x1,x2,y1,y2; setbkcolor(1); circle(300,240,200); circle(300,240,205); circle(300,240,5); for(i=0;i<60;i++) /*划钟点上的短线*/ { if(i%5==0) l=15; else l=5; x1=200*sin(i*6*pi/180)+300; y1=200*cos(i*6*pi/180)+240; x2=(200-l)*sin(i*6*pi/180)+300; y2=(200-l)*cos(i*6*pi/180)+240; line(x1,y1,x2,y2); } } #include"graphics.h" #include"math.h" #include"dos.h" #define pi 3.1415926 #define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300 #define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240 #define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y) void init() /*划时钟边框函数*/ { int i,l,x1,x2,y1,y2; setbkcolor(1); circle(300,240,200); circle(300,240,205); circle(300,240,5); for(i=0;i<60;i++) /*划钟点上的短线*/ { if(i%5==0)

模拟时钟应用程序

案例五模拟时钟应用程序 以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。用菜单选项或按钮设置时间和秒表。时间不必与机器系统时间相同,可任意设置。 模拟时钟示意图 1 编程要求 (1)为该程序设计一个美观大方的图标。 (2)程序界面设计合理,色彩得体大方,显示正确。 (3)时针、分针和秒针形象美观,即使各指针重合也可辨认。 (4)各指针运动规律正确。为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。 (5)数字式时钟的时间显示与指针式时钟显示一致。

(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。 (7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。再次按下秒表控制按钮后计时停止,该窗口显示累计时间。 2 问题分析 本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。指针运动算法和屏幕重绘方法是本程序主要难点所在。 不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角) y =圆心y坐标+ 指针长度* sin (指针方向角) 注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。 三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。采用一个定时器消息可以很容易实现指针联动算法。 由于屏幕的重绘速度很快(50 ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假定指

60秒计时器课程设计 周海祥

目录 摘要 (2) 引言 (2) 一.设计目的 (2) 二.设计任务 (2) 三.电路原理设计 (2) 3-1计时器的设计原理 (2) 3-2计时器的基本逻辑功能 (3) 3-3主干电路设计 (3) 3-3-1震荡电路设计 (3) 3-3-2计数器的设计 (3) 3-3-3译码器的设计 (3) 四.电路仿真 (4) 五.系统分析 (5) 5-1基础元件介绍 (5) 5-1-1计数器 (5) 5-1-2译码器与显示管 (6) 5-1-3振荡器 (8) 5-1-4与非门 (8) 六.电路的焊接 (9) 七.调试 (9) 八.总结 (10) 参考文献 (10) 致谢 (10) 附录 (11)

74LS160构成的60秒计时器 摘要 60秒计时器是采用数字电路实现的数字显示计时装置。本系统由振荡器,计数器,译码器,LED显示器组成。采用74LS系列中小规模集成芯片。 引言 计时器是用数字集成电路做成的现代计时器,与传统的机械钟相比,它具有走时准确、显示直观(有荧光七段数码显示器)、无机械传动装置等优点。而且钟表的数字化给人们生产生活带来了极大的方便。 一.设计目的 在学完了《数字电子技术》课程的基本理论后,能够综合运用所学知识设计和制作实际需要的简单电子电路,系统地进行电子电路的工程实践训练,锻炼动手能力,培养工程师的基本技能,提高分析问题解决问题的能力。 二.设计任务 完成由74LS160构成的60秒计时器 计时器的组成:60秒计时器一般由振荡器,计时器,译码器,LED显示器组成,这些都是数字电路中应用最广泛的基本电路。 三.电路原理设计 3-1 计时器的设计原理: 先构成一个555定时器和分频器产生震荡周期为一秒的标准“秒”脉冲信号,由74LS160采用清零法分别组成六十进制的“秒”计数器。清零法适用于有异步置零输入端的集成计数器。原理是不管输出处于哪种状态,只要在清零输入端加一个有效电平电压,输出会立即从那个状态回到“0000”状态。。使用74LS48为驱动器,共阴极七段数码管作为显示器。设计图见附录一

单片机模拟电子时钟设计

单片机课程设计 课题:单片机模拟电子时钟设计 学院:自动化学院 专业: 07电气工程及其自动化 (低压电力智能控制方向) 姓名:谭善文 学号:2007104743002 指导老师:张华

目录 一、前言 (3) 二、设计目的 (3) 三、设计任务与要求 (3) 四、设计原理 (3) 五、总体设计方案 (4) 六、小结与展望 (21) 七、致谢 (22) 八、主要参考文献 (22) (3)、晶振 (5) (4)、LED (5) (5)、复位 (6) (6)、蜂鸣器 (6) (7)、按键 (6) (8)、串行口 (7) (9)、单片机 (7) (10)、数码管 (8) 2、程序编写 (10) 六、小结与展望 (21) 七、致谢 (22) 八、主要参考文献 (22)

一、前言 在当今的工作和生活环境中,有越来越多的单片机在为人们服务,例如电视遥控、手机、洗衣机、空调等,单片机几乎无所不在,学习单片微型计算机这门课程,就是为了对单片微型计算机有进一步感性的认识,了解、掌握、应用,甚至设计开发它。让我们能综合运用单片机的软、硬件技术分析实际问题,为工业生产、科学研究和实验设备等领域的单片机应用和开发打下良好的基础。 二、设计目的 a)通过《单片微型计算机原理与接口技术教程》了解单片微型计算机的发 展; b)根据课程设计的要求,学会用汇编语言设计程序,学会应用程序设计调 试软件; c)通过调试程序设计模块,掌握单片微型计算机的结构原理,了解程序设 计的编程思想; d)通过软件调试熟悉使用单片机指令系统,掌握汇编语言程序设计方法及 编程技巧,掌握子程序的设计与使用,熟悉中断服务程序的设计及调用 过程。 三、设计任务与要求 任务:利用单片机定时功能实现电子时钟的计时 要求:1.设计单片机电子时钟设计控制方案,功能设计; 2.详细描述实现需要的硬件,效果等; 3.编写汇编语言程序设计,在KEIL仿真实现调试程序; 四、设计原理 单片机可以利用定时功能实现电子时钟的计时。设计时利用单片机的定时器

模拟时钟转动程序

东南大学 C语言课程设计报告 课程名称:计算机综合课程设计 学院:土木工程学院 设计题目:模拟时钟转动程序 级别:B级 学生姓名:韦信丞 学号:05114419 同组学生: 学号: 指导教师:郭恒宁 2015年9月 1 日 C语言课程设计任务书

模拟时钟转动程序 一、课程设计的内容 1、能模拟机械钟表行走 2、还要准确利用数字显示日期和时间 3、在屏幕上显示一个活动时钟 4、按任意键时程序退出。 二、课程设计应完成的工作 1、编写完成相应题目的程序 2、编写课程设计报告,课程设计报告应该包含以下6部分 1)需求分析:包括设计题目、设计要求以及系统功能需求分析 2)总体设计:包括系统总体设计框架和系统功能模块图 3)详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图 4)调试分析过程描述:包括测试数据、测试输出结果以及对程序测试过程中存在问题进行思考(主要问题的出错现象、出错原因、 解决方法及其效果等,相应效果截图) 5)总结:课程设计完成了哪些主要功能,是否有扩展功能?还有哪些地方需要改进?课程设计的学习与体会?有哪些合理化建 议? 6)附录:主要原程序代码含必要的注释 3、答辩:在实验室建立程序运行环境,并在指导教师的监督下,独立解决问题,运行程序和回答教师的提问。 四、应收集的资料及其主要参考文献 [1]谭浩强.C程序设计(第四版),北京:清华大学出版社,2010年6月[2]陈清华朱红 . C语言课程设计案例精选与编程指导(第一版),南京:东南大学出版社,2003年6月 [3]顾小晶 . 实用C语言简明教程(第一版),北京:中国电力出版社,2003年9月

课程设计——秒表计时器

天津机电职业技术学院 《电子技术》课程设计论文 电子秒表 .完成时间:2009.12.30—2010.1.6 班级:08电气自动化三班 姓名:马赛男李丽美 学号:200812065 200812060

前言 21世纪是一个电子技术和电子元件有更大发展的世纪。回顾百年来电子技术和电子工业发展的成就,举世瞩目。可以看到,从国民经济到日常生活的各个方面,电子产品无所不在,体事例无庸枚举,其发展前景未可限量。作为一个学习电子专业的大学生,我们不但要有扎实的基础知识、课本知识,还应该有较强的动手能力。现实也要求我们既精通电子技术理论,更要掌握电子电路设计、实验研究和调试技术。课程设计就是一个理论联系实际的机会。 本次设计主要完成具备基本功能的电子秒表的理论设计,电子秒表是重要的记时工具,广泛运用于各行各业中。作为一种测量工具,电子秒表相对其它一般的记时工具具有便捷、准确、可比性高等优点,不仅可以提高精确度,而且可以大大减轻操作人员的负担,降低错误率。在写本报告的过程中,摘编了生产厂家和各种电子类报刊、参考书的资料,特向提供资料的同学及作者表示感谢。由于水平有限,报告中定有不妥之处,请提出宝贵意见。

目录 一、题目-------------------------------------------------------1 二、题目说明-------------------------------------------------1 三、原理介绍-------------------------------------------------1 四、单元电路设计-------------------------------------------2 1、时基信号发生器-------------------------------------2 2、计数器-------------------------------------------------7 3、译码器-------------------------------------------------11 4、显示器-------------------------------------------------13 5、防抖开关----------------------------------------------15 五、总装图----------------------------------------------------17 六、名细表----------------------------------------------------18 七、分工情况-------------------------------------------------19 八、后记-------------------------------------------------------20 九、参考资料-------------------------------------------------21

模拟时钟转动程序

课程设计 课程名称高级语言程序课程设计题目名称模拟时钟转动程序 学生学院自动化学院 专业班级自动化06级(2 )班 学号 3106000858 学生姓名霍杰英 指导教师杨其宇 2007年6月18日

广东工业大学课程设计任务书 题目名称模拟时钟转动程序 学生学院自动化学院 专业班级自动化06级(2 )班 姓名霍杰英 学号3106000858 一、课程设计的内容要求:能模拟机械钟表行走,还要准确地利用数字显示日期和 时间,在屏幕上显示一个活动时钟,按任意键时程序退出。 二、课程设计的要求与数据 1、进一步掌握和利用C语言进行程设计的能力; 2、进一步理解和运用结构化程序设计的思想和方法; 3、初步掌握开发一个小型实用系统的基本方法; 4、学会调试一个较长程序的基本方法; 5、学会利用流程图或N-S图表示算法; 6、掌握书写程序设计开发文档的能力。 三、课程设计应完成的工作 1、编写完成相应题目的程序; 2、编写课程设计报告,课程设计报告的内容应包括以下6个部分: 1) 需求分析:包括设计题目、设计要求以及系统功能需求分析; 2) 总体设计:包括系统总体设计框架和系统功能模块图; 3) 详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图; 4) 调试分析过程描述:包括测试数据、测试输出结果,以及对程序调试过程中存 在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等,适当 的包含结果截图); 5) 总结:课程设计完成了哪些功能,有没有什么扩展功能?还有哪些地方需要改 进?课程设计过程中的学习体会与收获、对本次课程设计的认识以及自己的建议 等内容; 6) 附录:主要源程序代码,含必要的注释。

相关文档
最新文档