不使用任何单片机复位电路原理,而用纯硬件电路和集成芯片实现AD采样电压并4位数码管显示。

录 点阵电子显示屏制作......................................陈超,林武1 数字温度计设计...............................................陈丰29 公共场所人流量统计系统.................................李平,黄琴50 数字定时控制器.....................................廖星星,聂蒙蒙81 基于AT89S52的简易计算器..................................卢高辉104 数字定时控制器....................................汤冬秀,徐艳娇128 电子提醒器设计报告..........................................陶冶149 波形发生器................................................王跃平166 自动定时水加热控制装置....................................韦东彤189 密码电源开关..............................................熊祖湘217 基于单片机的高度定位系统设计..............................杨锦锋267 点阵电子显示屏制作 点阵电子显示屏制作 陈超,林武摘要:LED点阵显示屏作为一种新兴的显示器件,是由多个独立的LED发光二极管封装而成. LED点阵显示屏可以显示数字或符号, 通常用来显示时间、速度、系统状态等。文章给出了一种基于MCS-51单片机的16×32 点阵LED显示屏的设计方案。包括系统具体的硬件设计方案,软件流程图和部分汇编语言程序等方面。在负载范围内, 只需通过简单的级联就可以对显示屏进行扩展,是一种成本低廉的图文显示方案。关键词:MCS-51;LED;单片机 红外遥控 编码 解码AbstractAs a popular display device component, LED dot-matrix display board consists of several independent LED (Light Emitting Diode). The LED dot-matrix display board can display the number or sign, and it is usually used to show time, speed, the state of system etc. This paper introduces a kind of simple 16x32 LED display screen design process based on MCS-51 single chip minicomputer . The detail hardware scheme, software flow and assemble languageprogrammer design and so on is followed. The display part can be cascaded to meet the need. The practice proves the design is low-cost and effective.Key words: MCS-51;LED;MCU1 引言LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。在实际应用中的显示屏由于成本和可靠性的因素常采用一种称为动态扫描的显示方法。本文设计的是一个室内用16x32的点阵LED图文显示屏,图形或文字显示有静止、移入移出等显示方式。红外线遥控是目前使用广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,广泛应用于各种家用电器产品。市场上的各种家电红外遥控系统技术成熟、成本低廉,但都是针对各自的遥控对象(彩电、冰箱、空调等) ,为了能将性能稳定、价格低廉、功能较多的电视机遥控器应用于其它控制场合,本文以MCS - 51 单片机为核心,设计了一套红外遥控信号解码的软件系统,通过驱动电路的扩展,能使智能仪器实现功能较复杂的遥控1 点阵电子显示屏制作控制。1.1 LED显示屏背景介绍LED 就是Light Emitting Diode(发光二极管)的缩写。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。发光二极管是由p 型和n 型半导体组成的二极管。在LED 的p - n 结附近,n 型材料中多数载流子是电子,p 型材料中多数载流子是空穴。p -n 结上未加电压时构成一定的势垒,当加正向偏压时,在外电场作用下,p 区的空穴和n 区的电子就向对方扩散运动,构成少数载流子的注入,从而在p - n结附近产生导带电子和价带空穴的复合,同时释放出相对应的能量hν(h 为普朗克常数,ν为光子频率)而发光。该能量相当于半导体材料的带隙能量Eg(Ev) ,其与发光波长λ(nm) 的关系为λ= 1239. 6PEg。LED显示屏是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。LED显示屏分为图文显示屏和视频显示屏,均由LED矩阵块组成。图文显示屏可与计算机同步显示汉字、英文文本和图形;视频显示屏采用微型计算机进行控制,图文、图像并茂,以实时、同步、清晰的信息传播方式播放各种信息,还可显示二维、三维动画、录像、电视、VCD节目以及现场实况。LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。它的优点:亮度高、工作电压低、功耗小、微型化、易与集成电路匹配、驱动简单、寿命长、耐冲击、性能稳定。1.2
MCS-51系列单片机简介1.2.1 MCS-51系列单片机及其特点①可靠性高:因为芯片是按工业测控环境要求设计的,故抗干扰的能力优于PC机。系统2 点阵电子显示屏制作软件(如:程序指令,常数,表格)固化在ROM中,不易受病毒破坏。许多信号的通道均在一个芯片内,故运作时系统稳定可靠。②便于扩展:片内具有计算机正常运行所必需的部件,片外有很多供扩展用的(总线,并行和串行的输入/输出)管脚,很容易组成一定规模的计算机应用系统。 ③控制功能强:具有丰富的控制指令:如:条件分支转移指令,I/O口的逻辑操作指令,位处理指令。④实用性好:体积小,功耗低,价格便宜,易于产品化。1.2.2
单片机的发展历史简介①第1阶段(1971年—1978年),以MCS-48系列为代表,称4位单片机。在片内:CPU有4位或8位;ROM有1KB或2KB;RAM有64B或128B;只有并行接口,无串行接口;只有1个8位的定时/计时器;中断源只有2个。在片外:寻址范围只有4KB;芯片引脚有40个。②第2阶段(1978年—1983年),以MCS-51系列为代表,称8位单片机。在片内:CPU有8位;ROM有4KB或8KB;RAM有128B或256B;有串/并行接口;有2个或3个16位的定时/计时器;中断源有5至7个。在片外:寻址范围有64KB;芯片引脚有40个。③第3阶段(1983年以后),以MCS-96系列为代表,称16位单片机。在片内:CPU有16位;ROM有8KB;RAM有232B;有串/并行接口;有4个16位的定时/计时器;中断源有8个;增加了D/A和A/D转换电路。在片外:寻址范围有64KB;芯片引脚有48个或68个。以上MCS-51系列以其优良的性价比,在我国得到了广泛的应用。1.3 功能要求设计一个室内用16x32的点阵LED图文显示屏,要求在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形和文字应稳定、清晰无串扰。图形或文字显示有静止、移入移出等显示方式。并设计一个红外遥控电路,通过遥控可以控制选定文字,比如按数字键“1”可触发第一句文字,按“3”可3 点阵电子显示屏制作以选定第三条等同时设定复位键。2 方案实现从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在的位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。16x32的点阵共有512个发光二极管,显然单片机没有这么多的端口,如果我采用锁存器来扩展端口,按8位的锁存器来计算,16x32的点阵需要512/8=64个锁存器。这个数字很庞大,因为我们仅仅是16x32的点阵,在实际应用中的显示屏往往要大得多,这样在锁存器上花的成本将是一个很庞大的数字。因此在实际应用中的显示屏几乎都不采用这种设计,而采用另外一种称为动态扫描的显示方法。动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套驱动器。具体就16x32的点阵来说,把所有同1行的发光管的阳极连在一起,把所有同1列的发光管的阴极连在一起(共阳极的接法),先送出对应第一行发光管亮灭的数据并锁存,然后选通第1行使其燃亮一定时间,然后熄灭;再送出第二行的数据并锁存,然后选通第2行使其燃亮相同的时间,然后熄灭;以此类推,第32行之后,又重新燃亮第1行,反复轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能够看到显示屏上稳定的图形了。采用扫描方式进行显示时,每一行有一个行驱动器,各行的同名列共用一个驱动器。显示数据通常存储在单片机的存储器中,按8位一个字节的形式顺序排放。显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输的问题。从控制电路到列驱动器的数据传输可以采用并列方式或串行方式。显然,采用并行方式时,从控制电路到列驱动器的线路数量大,相应的硬件数目多。当列数很多时,并列传输的方案是不可取的。采用串行传输的方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有当一行的各列数据都以传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两部分。对于串行传输方式来说,列数据准备时间4 点阵电子显示屏制作可能相当长,在行扫描周期确定的情况下留给行显示的时间就太少了,以致影响到LED的亮度。解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。即在显示本行各列数据的同时,传送下一列数据。为了达到重叠处理的目的,列数据的显示就需要具有所存功能。经过上述分析,就可以归纳出列驱动器电路应具有的功能。对于列数据准备来说,它应能实现串入并处的移位功能;对于列数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据打入并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。图1为显示屏电路实现的结构框图。 图1
显示屏电路框图红外遥控部分通过对遥控器的解码,设置函数,当遥控器按键触发,红外接收头接收到一个脉冲信号时,触发相对应的数码显示从而达到控制点阵显示屏显示内容的目的。2.1 系统硬件电路的设计硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路三部分。2.1.1单片机系统及外围电路单片机采用MSC-51或其兼容系列芯片,采用24MHZ或更高频率晶振,以获得较高的刷新频率,时期显示更稳定。单片机的串口与列驱动器相连,用来显示5 点阵电子显示屏制作数据。P1口低4位与行驱动器相连,送出行选信号;P1.5~P1.7口则用来发送控制信号。P0口和P2口空着,在有必要的时候可以扩展系统的ROM和RAM。16x32的点阵显示屏的硬件原理图如图2所示(在附录A)。2.1.2列驱动电路列驱动电路有集成电路74HC595构成。它具有一个8位串入并出的移位寄存器和一个8位输出锁存器的结构,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行列数据的同时,传送下一行的列数据,既达到重叠处理的目的。74HC595的外形及内部结构如图3所示。它的输入侧有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SI是串行数据的输入端。引脚SCK是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SI的下一个数据打入最低位。移位后的各位信号出现在各移位寄存器的输出端,也就是输出锁存器的输入端。RCK是输出锁存器的打入信号,其上升沿将移位寄存器的输出打入输出锁存器。引脚G是输出三态门的开放信号,只有当其为低时锁存器的输出才开放,否则为高组态。SCLR信号是移位寄存器清零输入端,当其为低时移位寄存器的输出全部为零。由于SCK和RCK两个信号是互相独立的,所以能够做到输入串行移位与输出锁存互不干扰。芯片的输出端为QA~QH,最高位QH可作为多片74HC595级联应用时,向上一级的级联输出。但因为QH受输出锁存器的打入控制,所以还从输出锁存器前引出QH,作为与移位寄存器完全同步的级联输出。 图3.
74HC595外形及引脚2.1.3 行驱动器6 点阵电子显示屏制作单片机P1口低4位输出的行号经4/16线译码器74LS154译码后生成16条行选通信号线,再经过驱动器驱动对应的行线。一条行线上要带动16列的LED进行显示,按每一LED器件20MA电流计算,16个LED同时发光时,需要320MA电流,选通三极管8550作为驱动管可满足要求。2.1.3 红外遥控的基本组成和接收解码电路红外遥控系统一般由红外遥控信号发射器、红外遥控信号接收器和微控制器及其外围电路3 部分组成,如图1 所示: 当遥控信号发射器的某个按键被按下,其内部的信号发射器就产生遥控编码脉冲,经载波调制后由红外发射管串行输出;遥控接收头完成对遥控信号的接收放大、检波、整形、再送给微控制器,由微控制器解调出编码脉冲并执行相应的遥控功能。遥控器接收部分非常简单,红外接收头与单片机共用电源和地,接收头的信号线与单片机的外部中断源INT0 相连,当有信号输出时,就可以使单片机进入中断。在电源和信号线之间接上一个电阻和发光二极管,这样,当接收头接收到信号并输出时,发光二极管会随着信号线上电平的高低而闪烁,这样,我们就可以很清楚地看到接收头正在接收信号。2.1.4红外数据传送的调制格式遥控器的红外数据传送编码格式基本上有脉冲宽度调制(PWM) 和脉冲位置调制(PPM) 两种。对于脉宽调制格式,接收头信号的逻辑0 和1 是根据信号电平的宽度来区分的。每个逻辑1 的高电平宽度比逻辑0 的高电平宽度宽,而低电平7 点阵电子显示屏制作宽度都是一致的,脉宽调制方式最常使用的芯片有M50462 ,TC9012 ,LC7461 等,使用这些芯片的遥控器有康佳KK - Y01、T920 ,三洋 等。脉冲相位调制方式的逻辑0 和逻辑1 的脉冲宽度都是一致的,而电平正好相反。相位调制方式最常用的芯片SAA3010 ,使用这个芯片的遥控器有乐华542A - 2PD ,索尼G21、S29、K29 等。2.1.6 红外遥控编码方式发射系统由专用芯片产生指令代码,驱动红外发射器件,发射红外控制信号,红外信号的指令代码为一组串行二进制码,编码的方法有多种,不同芯片的编码方法和代码长度有所不同。目前流行的红外遥控器编码芯片主要有M50462、PT6221、TC9148 等,其工作原理基本相同,都是通过编码后的串行数据对38~40kHz 的方波进行脉冲宽度调制。编码主要是由用户码和数据码构成,通常还包括引导脉冲,引导脉冲总是出现在编码脉冲的前头,作为遥控接收的启动信号;CPU 只有在接收到引导脉 冲之后,才可以对接收到的数据进行解码,以防止接收到不完整的发射信号。用户码和数据码统称为传送码,通常为8 位或16 位的“0”“1”码,为了避免出现差错,每次发射的传送码中一般都包含两次编码:一次为原码一次为反码;或相同的码连续发两次。采用PWM方式调制的编码,按照脉冲的时间关系来区分“1”和“0”,通常以0. 5~1ms 的低电平开始,区别是高电平的宽度不同“, 0”一般为0. 5~0. 8ms“, 1”则为1. 2~2ms。由于各种遥控器发码的时序不尽相同,在这里,我们以普通的红外遥控器康佳KK- Y01 为例,其红外编码芯片为M50462。图4 所示的是M50462 的PWM 脉冲的周期,它的“1”是“0”的两倍。其指令编码既没有引导脉冲,也没有反转码或重复码,只是将用户码和数据码各发送一次,码的形式如图5 所示,每一条传送指令有16 个“0”或“1”代码组成,指令的末尾再附加一个尾码,因此总共包括17 个宽度为0. 25ms 的负脉冲。CPU 在收到传送码后,通过对脉冲的个数的检查来排除错误的编码,具体地说,就是在第17 个脉冲之后在4ms 的时间之内不应再出现第18 个脉冲,否则视为误码。本系统采用的遥控发射器康佳KK- Y01 每个按键的编码包含16位,其中前8 位为用户码(识别码) ,后8位数据码。用户码不随按键的不同而变化,其主要作用是防止不同机种的遥控器之间的相互干扰产生误操作,数据码随按键的不同而不同。发射器使用了25种键操作,其功能操作码(传送8 点阵电子显示屏制作码) 见表1。 2.2.系统程序的设计数码显示采用动态显示串行传输的方式重叠处理的方法实现,遥控部分采用红外接收方式控制。2.2.1红外遥控代码单片机译码程序的设计方法经红外遥控接收器还原的PWM码要被CPU 解码并执行相应的指令,必须对每个脉宽进行测量。脉宽测量通过对脉宽的时间计数来实现,解码通过解码程序来实现。单片机红外遥控译码采用中断方式。红外接收头输出信号(图1 中的OUT 线) 直接连接W78E58 的外部中断INT0 ,INT0 设置为下降沿边缘触发方式,用内部定时器T0 测量正脉冲宽度,设置内部定时器T0 工作于方式1 ,T0 的初值置为0 且不允许T0 产生中断,并将寄存器TOMD 中的选通门GATE 置为1 ,当中断0 为低电平时,表示传码到来,由硬件置位IE0 ,请求中断,在INT0 引脚引起单片机中断后,进入中断服务程序。禁止中断响应,关中断,当中断0 变为高电平时,启动定时器T0 ,开始计数,当中断0 口重新变化为低电平时,关闭T0 ,读取T0 计数值,并重置9 点阵电子显示屏制作T0 的初值为0 ,循环读出编码的16 个脉宽,根据读得的计数值判断出相应的“0”或“1”,从而识别按下的键并执行相应的功能操作。编码的识别技术关键是0、1 代码的识别。根据上面的遥控编码方法和波形图可知,在INT0 中断服务程序中,只要能测出加到单片机INT0 引脚的遥控接收信号的高电平宽度即可得到其代码。表示“0”的高电平宽度为0. 75ms ,表示“1”的高电平宽度为1. 75ms ,这样就可以读取代码。在本系统中,单片机使用12M 晶振,所以每经过1μs 定时器加1 ,若分别用T0 、T1 表示代码“0”和“1”脉冲的高电平宽度计数值,则:T0 = 0. 75 ×103/ 1 = 2EEH
T1 = 1. 75 ×103/ 1 = 6D6H因此,当T0 计数值为2EEH 时,其对应的代码为“0”,T0 的计数值为6D6H 时,其对应的代码为“1”显示屏软件的主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。根据软件分层次设计的原理,可以把显示屏的软件系统分为两层;第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向屏体送显示数据,并负责产生行扫描信号和其他控制信号,配合完成LED显示屏的扫描显示工作。显示驱动器程序由定时器T0中断程序实现。系统应用程序完成系统环境设置初始化、显示效果处理等工作,由主程序来实现。从有利于实现较复杂的算法(显示效果处理)和有利于程序结构化考虑,显示屏程序适宜采用C语言编写。2.2.2显示驱动程序显示驱动程序在进入中断后首先要对定时器T0重新赋初值,以保证显示屏刷新率的稳定,1/16扫描显示屏的刷新率(帧频)计算公式如下:刷频率(帧频)=1/16×T0溢出率=1/16×f/12(65536-t)其中f位晶振频率,t为定时器T0初值(工作在16位定时器模式)。然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等显示数据打入输出锁存器并锁存,然后再输出新的行号,重新打开显示。图4为显示驱动程序(显示屏扫描函数)流程图。 10 点阵电子显示屏制作 图 4 显示驱动程序流程图 2.2.3系统主程序本文设计的系统软件能使系统在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形和文字应稳定、清晰无串扰。图形或文字显示有静止、移入移出等显示方式。系统主程序开始以后,首先是对系统环境初始化,包括设置串口、定时器、中断和端口;然后以“卷帘出”效果显示图形,停留约3s;接着向上滚动显示“老师我焊的好辛苦!高抬贵手放我过吧!”这19个汉字及一个图形,然后以“卷帘入”效果隐去图形。由于单片机没有停机指令,所以可以设置系统程序不断的循环执行上述显示效果。单元显示屏可以接收来自控制器(主控制电路板)或上一级显示单元模块传输下来的数据信息和命令信息,并可将这些数据信息和命令信息不经任何变化地再传送到下一级显示模块单元中,因此显示板可扩展至更多的显示单元,用于显示更多的显示内容。图5是系统主程序流程图。11 点阵电子显示屏制作 图 5 系统主程序流程图3性能分析与总结3.1性能分析LED显示屏硬件电路只要硬件质量可靠,引脚焊接正确,一般无需调试即可正常工作。软件部分需要调试的主要有显示屏刷新频率及显示效果两部分。显示屏刷新率由定时器T0的溢出率和单片机的晶振频率决定,表2给出了实验调试时采用的频率及其对应的定时器T0初值。表2 显示平刷新率与T0初值关系表(24MHz晶振) 刷新率T0初值从理论上来说,24Hz以上的刷新频率就能看到稳定的连续的显示,刷新率越高,显示越稳定,同时刷新频率越高,显示驱动程序占用的CPU时间越多。试验证明,在目测条件下刷新频率40Hz一下的画面看起来闪烁较严重,刷新频率50Hz以上的已基本察觉不出画面的闪烁,刷新频率达到85Hz以上时再增加画面闪烁没有明显的改善。显示效果处理程序的内容及方法非常广泛,其调试过程在此不作具体讨论,12 点阵电子显示屏制作读者可以照源程序自行分析。这个方案设计的16x32的点阵LED图文显示屏,电路简单,成本较低,且较容易扩展成更大的显示屏;显示屏各点亮度均匀、充足;显示图形或文字稳定、清晰无串扰;可用静止、移入移出等多种显示方式显示图形或文字。3.2
总结本文设计的一个室内用16x32的点阵LED图文显示屏,能够在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形和文字应稳定、清晰无串扰。图形或文字显示有静止、移入移出等显示方式。本系统具有硬件少,结构简单,容易实现,性能稳定可靠,成本低等特点。总结本文的研究工作,主要做了下面几点较突出的工作:一、通过查阅大量的相关资料,详细了解了LED的发光原理和LED显示屏的原理,了解了LED的现状,清楚地了解了LED显示屏与其它显示屏相比较有那些 优点,明确了研究目标。二,本文设计的LED显示屏能够实现在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形和文字应稳定、清晰无串扰。图形或文字显示有静止、移入移出等显示方式。三,文章给出了系统具体的硬件设计方案,硬件结构电路图,软件流程图和具体汇编语言程序设计与调试等方面。四,在这次综合实践的过程中学会了 Protel 99se 的基本使用,感到Protel 99se 对电气信息专业的同学来说是一门很有用的课程。五,通过这次综合实践,重新复习并进一步学习了MCS-51;熟练掌握了WORD软件的使用。六,存在缺陷:没有考虑抗干扰的问题。致
谢 本文是在黄剑华老师的悉心指导下完成的。从课题的立项、选题到课题的开发与研究,再到本论文的撰写到定稿的每一步工作都倾注着黄老师的心血和汗水,同时得到同学们相助,并提供了大量的资料. 在此,对于老师和同学们的帮助表示忠心的感谢。13 点阵电子显示屏制作 参考文献 [1] 何立民.MCS-51系列单片机应用系统设计与接口技术 .北京航空航天大学出版社,1990[2] 任涛等.闪速存储器数据及应用简明速查手册.电子工业出版社,1997[3] 何立民.单片机应用技术选编.北京航空航天大学出版社,2000[4] 张毅刚等.MCS-51单片机应用设计.哈尔滨工业电子出版社,1996[5] 邬宽明.单片机外围器件实用手册.北京航空航天大学出版社,1998[6] 张凯.LED介绍完全手册.北京航空航天大学出版社,2000[7] 张友德等.单片微型机原理应用与实验,复旦大学出版社,1996[8] 黄正谨等编《电子设计竞赛赛题解析》,东南大学出版社 2000附录A
16x32的点阵LED图文显示屏的硬件原理图 14 点阵电子显示屏制作 附录 B
主要汇编程序清单 15 点阵电子显示屏制作#include&reg52.h&#include&stdio.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int
高字节:百位(高字节高半部分),十位(高字节低半部分)/***********************结束**************************/sbit IR=P3^2;//红外接口标志char
flag=0;char code Tab[16]="ABCDEF";char data TimeNum[]=" ";//////////////////////////////////////////// //红外用全局变量bit irpro_ok,irok,startflag=0;
//定义两个位标志uchar IRcord[2];
//红外码值uchar
irdata[18];
//接收到的红外脉冲时间 ////////////////////////////////////////////// void Ir_work(void);void Ircordpro(void);void ShowString (char *ptr); //************************************************************* //
//////////////////////////////////////////////////////////////////void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数 {irtime++;} /****************************************************************/ void ex0_isr (void) interrupt 0 using 1//外部中断0服务函数 这两个中断函数功能一样{sta//
TR0=0; if(startflag){irdata[i]=16 点阵电子显示屏制作i++;if(i==18){if(irdata[8]&15&&irdata[8]&20&&irdata[17]&90&&irdata[17]&116) {irok=1;}//解码完成标志startflag=0;i=0;}}if(irtime&47&&irtime&52)
{startflag=1;i=0;}//引导码 遥控器的头码,开始检测红外信号irtime=0;TR0=1;}/*****************************************************************/ void Ircordpro(void)//红外码值处理函数{unsigned char i, j,unsigned char cord, //
k=1;for(i=0;i&2;i++)
//处理2个字节{for(j=1;j&=8;j++) //处理1个字节8位{cord=irdata[k];if(cord&6)
//大于某值为1{value=value|0x80;}else{value=}if(j&8){value=value&&1;}k++;}k++;IRcord[i]=value=0;17 点阵电子显示屏制作}irpro_ok=1;//处理完毕标志位置1}/******************************************************************/
void Ir_work(void)//红外键值散转程序{ TimeNum[0] = Tab[IRcord[0]/16]; //右移4位,取高四位TimeNum[1] = Tab[IRcord[0]%16]; //取低四位TimeNum[2] = Tab[IRcord[1]/16];TimeNum[3] = Tab[IRcord[1]%16]; if(IRcord[0]==2){if(IRcord[1]==0x10){flag=0;}if(IRcord[1]==0x11){flag=1;}if(IRcord[1]==0x12){flag=2;}if(IRcord[1]==0x13){flag=3;}}ShowString(TimeNum);
//送1602显示}/*******************************************************************/ void ShowChar(unsigned char c){m=c;}/************************************************************************/void ShowString (char *ptr){for (i=0;i&4;i++)ShowChar (*(ptr+i));//循环显示4个字符} ///////////////////////////////////// uchar code table0[]={ 0xFF,0xFB,0xFF,0xF7,0xC0,0x37,0xFD,0xFF,0xFD,0xEE,0xFD,0xED,0xFD,0xF5,0xFD,0xF7,//0xFD,0xF7,0xFD,0xFB,0xFD,0xF8,0xFD,0xFB,0xFD,0xFB,0x80,0x0B,0xFF,0xFB18 点阵电子显示屏制作,0xFF,0xFF,//"江",0, 0xFF,0xFF,0x80,0x00,0xFD,0xDF,0xFD,0xDF,0xC0,0x01,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,//0xDD,0xDD,0xC3,0xED,0xDF,0xF5,0xDF,0xF9,0xDF,0xFD,0xC0,0x01,0xDF,0xFD,0xFF,0xFF,//"西",1, 0xFF,0xEF,0x80,0x2F,0xFB,0xED,0xFB,0xED,0x80,0x2D,0xBB,0xAD,0xBB,0xAD,0xBB,0xAD,//0xBB,0xAD,0xBB,0xB5,0xAB,0xB5,0xDB,0xB7,0xFB,0xFB,0xFB,0xFD,0xFB,0xFE,0xFB,0xFF,//"师",2, 0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFE,0xBF,//0xFE,0xBF,0xFD,0xBF,0xFD,0xDF,0xFB,0xDF,0xF7,0xEF,0xE7,0xF7,0x8F,0xFB,0xDF,0xFD,//"大",3,}; uchar code table1[]={ 0xFD,0xFF,0xFD,0xE1,0x80,0x2D,0xFE,0xED,0xFF,0x75,0xFD,0x79,0xFD,0xB5,0xC0,0x2D,//0xFD,0xED,0xF5,0xE9,0xED,0xB5,0xDD,0xBD,0x9D,0xDD,0xBD,0xED,0xFD,0x7D,0xFE,0xFD,//"陈",4, 0xFF,0xEF,0xC0,0x6F,0xDD,0xEF,0xDD,0x81,0xDD,0xEF,0xD5,0xEF,0xEE,0x80,0xC0,0x6F,//0xDE,0xED,0xDE,0x8D,0xDE,0xED,0xC0,0xED,0xDE,0xED,0xFF,0xEA,0x80,0x06,0xFF,0xFF,//"超",5, 0xFB,0xF7,0xFB,0xF7,0xFB,0xF7,0xFB,0xF7,0x80,0x40,0xFB,0xF7,0xF9,0xF7,0xF1,0xE3,//0xF2,0xD3,0xEA,0xD5,0xEB,0x75,0x9B,0xB6,0xDB,0xD7,0xFB,0xF7,0xFB,0xF7,0xFB,0xF7,//"林",6, 0xFD,0xFF,0xF5,0xFF,0xED,0x03,0xFD,0xFF,0x80,0x00,0xFD,0xFF,0xFD,0xDF,0xFB,0xDF,//0xFA,0x1B,0xFB,0xDB,0xFB,0xDB,0xF7,0xDB,0xB7,0x1B,0xAF,0xE3,0x9F,0xF8,0xBF,0xFF,//"武",7,}; uchar code table2[]={ 19 点阵电子显示屏制作0xFE,0xF7,0xFE,0xF7,0xE0,0x00,0xF6,0xF7,0xF6,0xB7,0xF6,0x67,0xF4,0xF0,0xE9,0x75,//0xAB,0xB7,0xAF,0xD5,0x9F,0xEB,0xF7,0x7F,0xEE,0xEB,0xCC,0xD9,0xDD,0xDC,0xFF,0xFE,//"热",8, 0xE0,0xFF,0xF6,0x03,0xF7,0xB7,0xFB,0x6F,0x80,0x03,0xBF,0xBB,0xFF,0xBD,0xC0,0x03,//0xFF,0xDF,0xF0,0x1F,0xFB,0xCF,0xFD,0x2F,0xFC,0xF7,0xF3,0x39,0x8F,0xCE,0xDF,0xF3,//"爱",9, 0xFF,0x7F,0xFF,0x7F,0xEF,0x7B,0xC0,0x03,0xEF,0x7B,0xEF,0x7B,0xEF,0x7B,0xEF,0x7B,//0xEF,0x7B,0xE0,0x03,0xEF,0x7B,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,//"中",10, 0xFF,0xFF,0xC0,0x01,0xDF,0xFD,0xD0,0x05,0xDF,0x7D,0xDF,0x7D,0xDF,0x7D,0xD8,0x0D,//0xDD,0x7D,0xDB,0x7D,0xDB,0x7D,0xD0,0x05,0xDF,0xFD,0xDF,0xFD,0xC0,0x01,0xDF,0xFD,//"国",11, }; uchar code table3[]={ 0xFF,0xFF,0xC0,0x03,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x01,0xFF,0x7F,//0xFF,0x7F,0xFE,0xBF,0xFD,0xBF,0xFB,0xDF,0xE7,0xEF,0x8F,0xF7,0xDF,0xFB,0xFF,0xFD,//"天",12, 0xFF,0xFF,0xC0,0x03,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x01,0xFF,0x7F,//0xFF,0x7F,0xFE,0xBF,0xFD,0xBF,0xFB,0xDF,0xE7,0xEF,0x8F,0xF7,0xDF,0xFB,0xFF,0xFD,//"天",13, 0xFF,0xBF,0xFF,0xDF,0xC0,0x03,0xDF,0xFB,0xDF,0xFB,0xD8,0x1B,0xDB,0xDB,0xDB,0xDB,//0xDB,0xDB,0xDB,0xDB,0xD8,0x1B,0xDB,0xDB,0xDF,0xFB,0xD7,0xFB,0xEF,0xFB,0xFF,0xFF,//"向",14, 0xFF,0xFF,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xE0,0x7F,0xFF,0x7F,//0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xDF,0x7F,0x80,0x01,0xFF,0xFF,//"上",15,20 点阵电子显示屏制作};sbit Q=P0^0;sbit ST=P0^1;sbit SH=P0^2; void fun(uchar x){for(a=0;a&8;a++){x=x&&1;Q=CY;
//送数据SH=0;SH=1;//给一个脉冲}}//后台模拟串口一次发8个数据 chuli(uchar i,uchar j,uchar k)
//i,j两个数移k位{i=i&&k;j=j&&8-k;a=i|j;} void display0(){uchar i,j,m,n,k;for(k=0;k&2;k++)for(m=0;m&16;m++){for(j=10;j&0;j--){for(i=0;i&16;i++){if(m&8){fun(chuli(table0[2*i+32*k],table0[1+i*2+32*k],m));
//第一个八位和第二个八位移m位 21 点阵电子显示屏制作fun(chuli(table0[1+i*2+32*k],table0[32+i*2+32*k],m));//第二个八位和第三个八位移/// fun(chuli(table0[32+i*2+32*k],table0[32+i*2+1+32*k],m)); fun(chuli(table0[32+i*2+1+32*k],table0[64+2*i+32*k],m));ST=0;ST=1; //显出来P2=i;//亮0行}}else{n=m-8; fun(chuli(table0[1+i*2+32*k],table0[32+i*2+32*k],n));//第二个八位和第三个八位移/// fun(chuli(table0[32+i*2+32*k],table0[32+i*2+1+32*k],n)); fun(chuli(table0[32+i*2+1+32*k],table0[64+2*i+32*k],n)); fun(chuli(table0[64+2*i+32*k],table0[64+i*2+1+32*k],n));
//第一个八位和第二个八位移m位ST=0;ST=1; //显出来P2=i;//亮0行}}}}} void display1(){uchar i,j,m,n,k;for(k=0;k&2;k++)for(m=0;m&16;m++){for(j=10;j&0;j--){for(i=0;i&16;i++){22 点阵电子显示屏制作if(m&8){fun(chuli(table1[2*i+32*k],table1[1+i*2+32*k],m));//第一个八位和第二个八位移m位 fun(chuli(table1[1+i*2+32*k],table1[32+i*2+32*k],m));//第二个八位和第三个八位移/// fun(chuli(table1[32+i*2+32*k],table1[32+i*2+1+32*k],m)); fun(chuli(table1[32+i*2+1+32*k],table1[64+2*i+32*k],m));ST=0;ST=1; //显出来P2=i;//亮0行}}else{n=m-8; fun(chuli(table1[1+i*2+32*k],table1[32+i*2+32*k],n));//第二个八位和第三个八位移/// fun(chuli(table1[32+i*2+32*k],table1[32+i*2+1+32*k],n)); fun(chuli(table1[32+i*2+1+32*k],table1[64+2*i+32*k],n)); fun(chuli(table1[64+2*i+32*k],table1[64+i*2+1+32*k],n));
//第一个八位和第二个八位移m位ST=0;ST=1; //显出来P2=i;//亮0行}}}}} void display2(){uchar i,j,m,n,k;for(k=0;k&2;k++)for(m=0;m&16;m++)23 点阵电子显示屏制作{for(j=10;j&0;j--){for(i=0;i&16;i++){if(m&8){fun(chuli(table2[2*i+32*k],table2[1+i*2+32*k],m));//第一个八位和第二个八位移m位 fun(chuli(table2[1+i*2+32*k],table2[32+i*2+32*k],m));//第二个八位和第三个八位移/// fun(chuli(table2[32+i*2+32*k],table2[32+i*2+1+32*k],m)); fun(chuli(table2[32+i*2+1+32*k],table2[64+2*i+32*k],m));ST=0;ST=1; //显出来P2=i;//亮0行}}else{n=m-8; fun(chuli(table2[1+i*2+32*k],table2[32+i*2+32*k],n));//第二个八位和第三个八位移/// fun(chuli(table2[32+i*2+32*k],table2[32+i*2+1+32*k],n)); fun(chuli(table2[32+i*2+1+32*k],table2[64+2*i+32*k],n)); fun(chuli(table2[64+2*i+32*k],table2[64+i*2+1+32*k],n));
//第一个八位和第二个八位移m位ST=0;ST=1; //显出来P2=i;//亮0行}}}}} 24 点阵电子显示屏制作void display3(){uchar i,j,m,n,k;for(k=0;k&2;k++)for(m=0;m&16;m++){for(j=10;j&0;j--){for(i=0;i&16;i++){if(m&8){fun(chuli(table3[2*i+32*k],table3[1+i*2+32*k],m));//第一个八位和第二个八位移m位 fun(chuli(table3[1+i*2+32*k],table3[32+i*2+32*k],m));//第二个八位和第三个八位移/// fun(chuli(table3[32+i*2+32*k],table3[32+i*2+1+32*k],m)); fun(chuli(table3[32+i*2+1+32*k],table3[64+2*i+32*k],m));ST=0;ST=1; //显出来P2=i;//亮0行}}else{n=m-8; fun(chuli(table3[1+i*2+32*k],table3[32+i*2+32*k],n));//第二个八位和第三个八位移/// fun(chuli(table3[32+i*2+32*k],table3[32+i*2+1+32*k],n)); fun(chuli(table3[32+i*2+1+32*k],table3[64+2*i+32*k],n)); fun(chuli(table3[64+2*i+32*k],table3[64+i*2+1+32*k],n));
//第一个八位和第二个八位移m位ST=0;ST=1; //显出来P2=i;//亮0行}25 点阵电子显示屏制作}}}}void main(){/****************红外程序************************/// Enable Global Interrupt FlagIT0 = 1;
// Configure interrupt 0 for falling edge on /INT0 (P3.2)
// Enable EX0 InterruptEA = 1;//定时器0初始化TMOD=0x12;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00;//reload valueTL0=0x00;//initial valueET0=1;//开中断while(1)//主循环{/****************红外程序************************/if(irok){Ircordpro(); //红外码值处理函数irok=0;
//bit位定义} if(irpro_ok)//step press key
处理完毕标志位置1{Ir_work();
//红外键值散转程序irpro_ok=0;
//置标志位为0}if(flag==0) display0();if(flag==1) display1();if(flag==2) display2();if(flag==3) display3(); }} 附录C
元器件清单 89s52单片机, 40ic座, 74ls54译码器,16pic座,点阵8个,1K电阻,300欧电阻,8550芯片,排阻,1*2拨动开关,18*30万能版,24M晶振,导线若干 遥控 红外接收头26 点阵电子显示屏制作 附录D
实物图 27点阵电子显示屏制作 28 数字温度计设计数字温度计设计 陈
丰摘要:本设计采用AT89S52作为处理的核心部分;用DS18B20作为温度传感器,把采集到的温度送到AT89S52,经过AT89S52处理后送到显示器,显示器将显示采集的温度,这样就能够达到题目的要求,而且其准确性也较高,而且也可用键盘进行设置报警温度,当超过设置温度时就会报警。
关键词:单片机、DS18B20、软件系统、硬件系统1方案与论证根据数字温度计题目的要求,提出以下几种方案:1、方案一:采用了最简单的方式,就是将传感器输出的信号,经过A/D转换后直接显示。2采用MAXIM公司生产的DS18B20来采集温度,DS18B20是采用1—wire总接口的数字温度计,测量温度范围为-55℃—+125℃,精度可达到0。0675℃,最大转换时间为200ns。这器件可用一根引与处理器相连,以串行方式将数据送到处理器,经处理器处理后直接显示。 3采用AD590作为温度采集的传感器,经放大后,再由ADC0809送到单片机处理,最后在由显示器将温度显示出来。 29 数字温度计设计 4(1)控制部分
方案二、三都采用了单片机作为控制,作为一种新型的微处理器,可以通过智能编程的方式,可以进行扩展,而且能够具有超温报警和自动控制功能。而方案一没有采用控制,直接把温度显示出来就完了。这样就只能完成对温度的显示。(2)传感器部分方案一、三的传感器可以选一样,可以选热敏电阻和其它的传感器。方案二采用的传感器是DS18B20,这种传感器硬件简单。所以采用这种传感器。(3)显示部分方案一采用的是一种将十进制转换成七段码的ADC,可以采用ICL7106来将采集到的温度进行显示,这种方案很简单,但是它的可控性很差,只能进行显示。方案二、三都是采用了单片机在内部远算之后,才由显示部分显示出来。(4) 补充部分在上面几种方案中,虽然它们各自有自已的优点,特别是第二种方案,它的硬件很简单,只要把程序写好,就能够运行了。可是为了将学的知识系统的组合起来,我们选择第三种方案,此方案不仅用到了单片机,还用到了DS18B20。系统很容易进行扩展。 2系统原理框图系统原理图如下: 3主要电路设计与计算3.1核心部分30 数字温度计设计本设计采用的处理器单片机, 单片机是早期Single Chip Microcomputer的直译,它反映了早期单片机的形态和本质。然后,按照面向对象,突出控制功能,在片内集成了许多外围电路及外设接口,突破了传统意义上的计算机结构,发展成microcontroller的体系结构,目前国外已普遍称之为微控制器MCU(Microcontroller Unit)。鉴于它完全作嵌入应用,故又称为嵌入式微控制器(Embedded Microcontrolle)。大多数单片机采用哈佛(Harvard)结构体系,即数据存储空间与程序存储空间相互独立的结构体系。它不同于一般通用计算机系统结构,即程序和数据共用一个空间的冯诺伊曼(Von Neumann)结构。AT89S52单片机温度测控仪采用Atmel公司的AT89S52单片机,采用双列直插封装(DIP),有40个引脚。该单片机采用Atmel公司的高密度非易失性存储技术制造,与美国Intel公司生产的MCS—51系列单片机的指令和引脚设置兼容。其主要特征如下:1、8位CPU2、内置4K字节可重复编程Flash,可重复擦写1000次3、完全定态操作:0Hz~24Hz,可输出时钟信号4、256B的片内数据存储器5、32根可编程I/O线6、3个16位定时/计数器7、中断系统有7个中断源,可编为两个优先级8、一个全双工可编程串行通道 3.2管脚功能VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 31 数字温度计设计P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,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口也可作为AT89C51的一些特殊功能口,如下表所示:P3口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不32 数字温度计设计变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。4 集成温度传感器DS18B20的简单介绍DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。(2)在使用中不需要任何外围元件。(3)可用数据线供电,电压范围:+3.0~ +5.5 V。(4)测温范围:-55 ~+125 ℃。固有测温分辨率为0.5 ℃。33 数字温度计设计(5)通过编程可实现9~12位的数字读数方式。(6)用户可自设定非易失性的报警上下限值。(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作 34 数字温度计设计 (b)
(c)5显示和键盘在单片机系统中,常用的显示器有:发光二极管显示器,简称LED(LightEmittingDiode),液晶显示器,简称LCD(LiquidCrystalDisplay);荧光管显示器。近年来也开始使用简易的CRT接口,显示一些汉字及图形。前三种显示器都有两种显示结构;段显示(7段,“米”字型等)和点阵显示(5X?,5X8,8X8点阵等)。而发光二极管显示又分为固定段显示和可以拼装的大型字段显示,此外还有共阳极和共阴极之分等。三种显示器中,以荧光管显示器亮度最高,发光二极管次之,而液晶显示器最弱,为被动显示器,必须有外光源。液晶显示器以其微功耗、小体积、使用灵活等诸多优点在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。液晶显示器通常可分为两大类,一类是点阵型,另一类是字符型。点阵型液晶通常面积较大,可以显示图形;而一般的字符型液晶只有两行,面积小,只能显示字符和一些很简单的图形,简单易控制且成本低。目前市面上的字符型液晶绝大多数是基于HD44780液晶芯片的,所以控制原理是完全相同的,为HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型LCD通常有14条引脚线(市面上也有很多16条引脚线的LCD,多出来的2条线是电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样),定义如下所示:35 数字温度计设计字符型LCD的引脚定义┌────┬────┬────┬──────┬────────────┐ ㄧ 引脚号 ㄧ 引脚名 ㄧ
输入/输出 ㄧ
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
ㄧ 电源(+5V)
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
ㄧ 对比调整电压
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
ㄧ 0=输入指令
ㄧ 1=输入数据
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
ㄧ 0=向LCD写入指令或数据
ㄧ 1=从LCD读取信息
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
ㄧ 1,1→0 ㄧ
ㄧ 使能信号,1时读取信息, ㄧ ㄧ
ㄧ 1→0(下降沿)执行指令
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
输入/输出 ㄧ 数据总线line0(最低位)
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
输入/输出 ㄧ 数据总线line1
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
输入/输出 ㄧ 数据总线line2
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
输入/输出 ㄧ 数据总线line3
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
输入/输出 ㄧ 数据总线line4
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
输入/输出 ㄧ 数据总线line5
ㄧ├────┼────┼────┼──────┼────────────┤ ㄧ
输入/输出 ㄧ 数据总线line6
ㄧ├────┼────┼────┼──────┼────────────┤36 数字温度计设计ㄧ
输入/输出 ㄧ 数据总线line7(最高位)
ㄧ└────┴────┴────┴──────┴────────────┘
(f)6报警和控制电路本次使用发光二极管作为报警器件,报警温度由程序预设.7电源的设计(1)±15V电源(0.7V) ±15V电源电路图如图(l)。对于滤波电容的选择,要考虑:①整流管的压降;②最小允许压降Ud;③电网波动10%。 从而允许纹波的峰峰值?ιt=18V×2(1-10%)-0.7-Ud-15=4.9V按近似电流放电计算,并设θ=0O(通角),则C=Io?t0.7×1/100==1430uF
选取滤波电容C=2200uF/30V ?u4.9(2)+5V电源(1A) +5V电源电路如图(m)。 允许的最小纹波峰峰值?ιt(max)=9×2(1-10%)-1.4-2.3-5=2.76VC=Io?t1×1/100==3600uF选取滤波电容C=4700uF/16V
(m)37 数字温度计设计7.1原理图 图(2) 7.2系统软件工作流程图 38 数字温度计设计 主程序流程图(1) 中断处理子程序流程图(2))7.2.2 程序/************使用LCD1602、历**************/ #include&reg52.h&//以下的顺序不能任意放#define uint unsigned int //宏定义
#define uchar unsigned char#include"LM016L.h"39 数字温度计设计#include"DS18B20.h"#include"KeyScan.h"#include"MODE.h" void open();
//上电显示void KeyScan();
//键盘扫描
void SetTime_Mode();
//调时void SetRing_Mode();
//闹钟设置void SetTemp_Mode();
//温度上限设置模式/******************************************************************/ void main(){init()
//初始化LCDwrite_com(0x01);
//清屏while(1){KeyScan(); //键盘扫描if(flag==0 //正常显示模式下{tempchange(); //温度转换命令Temp_Display(); //显示温度deal();
//温度处理}if(flag==1)
//功能选择模式下{write_com(0x80+0x4);//选择菜单for(i=0;menu[select][i]!='\0';i++) {write_date(menu[select][i]);}if(select==0)
//调试模式{SetTime_Mode();}if(select==1)
//闹钟设置{SetRing_Mode();}if(select==2)
//设置温度上限{40主函
数数字温度计设计SetTemp_Mode();}}}}/***************END***********END******************************//********************LCD相关程序***************************/ sbit rs=P2^0;// LCD数据/命令选择端sbit rw=P2^1;//LCD读写选择端sbit e=P2^2;//LCD使能信号void
delay(uchar z); //延时函数void init();
//LCD初始化函数void write_com(uchar com);//LCD写命令void write_date(uchar date); //LCD写数据void init()//LCD初始化函数{e=0;write_com(0x38);//显示模式的设置delay(1);write_com(0x0c);//开显示,光标显示delay(1);write_com(0x06);//光标位置delay(1);write_com(0x01);
//清显示delay(1);}void write_com(uchar com)//LCD写命令{rs=0;rw=0;P0=delay(1);e=1;delay(1);e=0;
}void write_date(uchar date)//LCD写数据{rs=1;rw=0;P0=41 数字温度计设计delay(1);e=1;delay(1);e=0;
delay(uchar z)//延时函数{uchar x,y;for(x=0;x&z;x++)for(y=0;y&110;y++);}/***************END***********END******************************//***************温度传感器相关程序******************/ sbit ds=P2^3;
//温度传感器信号线sbit led=P2^4; //小灯位定义uint temp,limit=800; // 整型温度值float f_ //浮点型温度值uint get_temp(); //获得温度void tempchange(void);//转换温度void dsreset(void);//DS18B20复位bit tempreadbit(void); //读DS118B20一位uchar tempreadbyte(void); //读DS18B20一个字节void tempwritebyte(uchar dat);//写入DS18B20一个字节void deal(); //温度处理函数void Temp_Display();//温度显示uchar code table[]=".C "; void dsreset(void)//DS18B20复位,初始化函数{ds=0;i=103;while(i&0)i--;ds=1;i=4;while(i&0)i--;}bit tempreadbit(void) //读一位数据函数{42 数字温度计设计ds=0;i++; //i++起延时的作用ds=1;i++;i++;dat=i=8;while(i&0)i--;return(dat);}uchar tempreadbyte(void) //读一个字节数据函数{uchar i,j,dat=0;for(i=1;i&=8;i++){j=tempreadbit();dat=(j&&7)|(dat&&1);
//读出的数据最低位在最前面}return(dat);}void tempwritebyte(uchar dat){
//写一个字节数据函数for(j=1;j&=8;j++){testb=dat&0x01dat=dat&&1;if(testb)
//写1{ds=0;i++;i++;ds=1;i=8;while(i&0)i--;}Else
//写0{ds=0;i=8;while(i&0)i--;ds=1;i++;i++;}}
}43 数字温度计设计void tempchange(void)
//DS18B20开始获取温度并转换{dsreset();delay(1);tempwritebyte(0xcc);
//写跳过读ROM指令tempwritebyte(0x44);
//写温度转换指令}uint get_temp()
//读取寄存器中存储的温度数据{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);//跳过RAM,适用于一个从机工作tempwritebyte(0xbe);//读RAM内部9字节的温度数据a=tempreadbyte();
//读低8位b=tempreadbyte();//读高8位temp=b;temp&&=8;temp=temp|a;//两个字节组合为一个字if((b&0x80)!=0)
//判断温度是否为负{temperature=1;
//temperature为1表示温度为负temp=~temp+1;
//若温度为负,则取其补}else temperature=0;f_temp=temp*0.0625;// 温度在寄存器中为12位,分辨率为0.0625temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入}void Temp_Display()//温度显示函数{if(get_temp()/1000==1)//温度上百时{write_com(0x80+0x40+0x0a);//温度的百位write_date(table[get_temp()/1000]);write_com(0x80+0x40+0x0b);write_date(table[get_temp()%]); //十位}if(get_temp()/1000==0) //温度未上百{write_com(0x80+0x40+0x0a);if(temperature==1)44 数字温度计设计write_date('-');//若温度为负则前面显示“-”elsewrite_date(' ');//若温度的百位为0且正则不显示write_com(0x80+0x40+0x0b);write_date(table[get_temp()/100]); //十位}write_com(0x80+0x40+0x0c);write_date(table[get_temp()%100/10]);//个位write_com(0x80+0x40+0x0d);write_date(table[10]);write_com(0x80+0x40+0x0e);write_date(table[get_temp()%10]);//十分之一位write_com(0x80+0x40+0x0f);write_date(table[11]);}void deal()//温度处理函数{if(get_temp()&limit)
//当温度超过设定的上限值时{led=0;delay(100);led=1;}}/***************END***********END******************************//****************键盘扫描函数***********************/ sbit key1=P3^0;//键盘位定义sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;uchar flag,select,alarm=1;void KeyScan(){/////////进入/退出模式键被按下///////////if(key1==0){write_com(0x01); //清屏if(alarm==2){alarm=0;}45 数字温度计设计Else{
flag++;//模式间的转换if(flag&=2) { flag=0; select=0;}}while(!key1); //检测键盘是否释放,下同}/////////功能选择键被按下///////////if(key2==0&&flag==1){write_com(0x01);
//清屏select++;if(select&=3)
{ select=0; write_com(0x01); }while(!key2);}/////////温度加一键被按下///////////if(key3==0){if(select==2&&flag==1)//上限温度值加一{limit+=10;if(limit&1270)
limit=0;write_com(0x01);}while(!key3);}/////////温度减一键被按下///////////if(key4==0)//分加一键{
if(select==2&&flag==1)//温度上限值减一{limit-=10;if(limit&=0)
limit=1270;write_com(0x01);}while(!key4);}}/***************END***********END******************************//*********************功能模式函数*****************************/ uchar code menu[3][9]={"Temp Set"};46 数字温度计设计void SetTemp_Mode()//温度上限设置模式{if(limit/1000)//若温度百位为0则不显示{write_com(0xc0+5);write_date(table[limit/1000]);}write_com(0xc0+6);write_date(table[limit%]);write_com(0xc0+7);write_date(table[limit%100/10]);write_com(0xc0+8);write_date('.');write_com(0xc0+9);write_date('0');write_com(0xc0+0x0a);write_date('C');}/***************END***********END******************************/8 电路调试1)电源调试将+5V和±15V两个电源电路板安装后,通电测试其输出电压、负载能力和纹波大小。2)单片机最小系统通过调试,让其各个模块均能正常工作。3)键盘、显示模块编制测试程序对其进行键盘控制测试,并对键盘进行编码,对数据显示进行模拟调试,通过后将键盘输出直接控制数据显示。4)AD传感器部分用传感器测不同的温度,在读显示器上的值,进行调整,使最后输出的结果达到要求。5)报警与控制部分通过键盘设置一定的值,看当温度超过设定温度时是否会报警,以及发出相应的控制,直到能够满足题目的要求。47 数字温度计设计6)统调将独立调节好的系统各模块连接在一起,利计算机编制程序对系统进行统调。 9 总结终于完成了我的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是比较高兴的。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。参考书目:1.黄智伟等?全国大学生电子设计竞赛训练教程 电子工业出版社?北京20052.何立明?单片机应用系统设计系统配置与接口技术 北京航空航天大学出版社?北京20053.高吉祥等?电子技术基础实验与课程设计(第二版) 电子工业出版社 北京20054.南建辉等?MCS-51单片机原理及应用实例
清华大学出版社 北京20035.宋文绪等?自动检测技术(第二版) 高等教育出版社 北京 2004 实物图 48 数字温度计设计 49 较,选出最好的。在具体操作时,要做到细心,有耐心,不懂的地方要多与人交 流,查资料。 通过这次实践操作,让我对学过的知识有更深入的了解,还学到很多相关的 知识,同时也提高了自身解决问题的能力。7 参考文献【1】 版社 李广第 2007 . 朱月祁 编 《单片机基础》 (第三版). 北京航天航空大学出【2】 陈正振 编 《电子电路设计与制作》 . 广西交通职业技术学院信息工程 系 2007 . 2006 .【3】 杨子文 编 《单片机原理及应用》 . 西安电子科技大学出版社 【4】 王法能 编《单片机原理及应用》 . 科学出版社 2004 .【5】 《电子制作》 2004 年第七期 . 2004 . 【6】 王千.《实用电子电路大全》[M], 电子工业出版社,2001 【7】 何立民. 《单片机高级教程[M]》 .北京航空航天大学出版社, 2003 年.附录 1:程序代码//晶振 12M, 四组定时, 小数点亮代表闹铃开 #include&reg52.h& #define uchar unsigned char #define uint unsigned int #define weix P2 #define duanx P0 #define key P3 sbit beep=P1^1; uchar code distab[]={ 0xc0, 0xf9, 0xa4, 0xb0, //0,1,2,3 0x99, 0x92, 0x82, 0xf8, //4,5,6,7 0x80, 0x90, 0x88, 0x8c, //8,9,a,p 0xff //全灭 }; //uchar code distab[]={ };*/ uchar data dis[6]={1,2,3,4,5,6}; uchar d_shi[4]={0,0,0,0}; //四组定时的时 uchar d_fen[4]={0,0,0,0}; //四组定时的分141 数字定时控制器uchar count,shi=23,fen=59,miao=55;//定时器计数量 count,时钟时、分、秒 uchar d=0; //定时组别标志 bit f_time=1,f_naoling,ling=0;//时间显示标志位, void delay(uint z) {while(z--); } void display() { uchar i,we_ if(!f_time) {dis[0]=d+1; dis[1]=12; dis[2]=d_fen[d]%10; dis[3]=d_fen[d]/10; dis[4]=d_shi[d]%10; dis[5]=d_shi[d]/10; } else { dis[0]=miao%10; dis[1]=miao/10; dis[2]=fen%10; dis[3]=fen/10; dis[4]=shi%10; dis[5]=shi/10; } we_tmp=0x01; //B 采用移位方式产生位选 for(i=0;i&6;i++) { weix=~we_ if(f_naoling) duanx=distab[dis[i]]-0x80; //送段选 else duanx=distab[dis[i]]; we_tmp&&=1; delay(100); duanx=0 //关闭段选以免产生重影 } } void init() { key=0 TMOD=0x01; //方式 1 TH0=()/256; //送初值高位142 数字定时控制器TL0=()%256;//送初值低位 ----//每 EA=1; //开总中断 ET0=1; TR0=1; //开定时器 0 } void count_t() { if(count&=18) { count=0; miao++; } if(miao&=60) { miao=0; fen++; } if(fen&=60) { fen=0; shi++; } if(shi&=24) { shi=0; } } void keyscan() //按键扫描及按键功能设置程序 { uchar key_x,i; if(key!=0xff) { delay(1000); for(i=40;i&0;i--) display(); if(key!=0xff) key_x= } switch(key_x) { case 0xfe:key_x=0 if(!f_time) { if(d_fen[d]&59)143 数字定时控制器d_fen[d]++;} else { if(d_shi[d]&23) d_shi[d]++; else { d_shi[d]=0; } d_fen[d]=0; } else { fen++; miao=0; }break//fen++ case 0xfd: key_x=0 if(!f_time) { if(d_fen[d]&0) d_fen[d]--; else { d_fen[d]=59; if(d_shi[d]&0) d_shi[d]--; else d_shi[d]=23; } } else { if(fen&0) fen--; else { fen=0; if(shi&0) shi--; else shi=23; }144 数字定时控制器}//fen-case 0xfb:key_x=0 if(!f_time) { if(d_shi[d]&23) d_shi[d]++; else d_shi[d]=0; } else shi++;//fen++ case 0xf7:key_x=0 if(!f_time) { if(d_shi[d]&0) d_shi[d]--; else d_shi[d]=23; } else { if(shi&0) shi--; else shi=23; }//fen++ case 0xef:key_x=0f_time=1; case 0xdf:key_x=0f_time=0; if(d&=0&&d&=2) d++; else d=0; case 0xbf:key_x=0 if(f_naoling)//是否开启闹铃 f_naoling=0; else { f_naoling=1; } } } void naoling()//闹铃检测及闹铃程序 {145 数字定时控制器if(f_naoling) { if((d_shi[d]==shi)&&(d_fen[d]==fen)&&(!ling)) // 闹 铃 时 间 2min { beep=1; ling=1; //置闹铃响标志 } } else beep=0; if((d_shi[d]==shi)&&((d_fen[d]==fen-1)||(d_fen[d]-1==fen))) // 闹铃自解锁 { ling=0; beep=0; } } void main() { init(); while(1) { count_t(); display(); keyscan(); naoling(); } } void timer0() interrupt 1 { TH0=()/256; //送初值高位 TL0=()%256;//送初值低位 ----//每 count++; }146 数字定时控制器附录 2:定时时钟工作原理图附录 3:定时时钟实物图147 数字定时控制器 图 1—时钟显示图 2—定时显示148 电子提醒器设计报告电子提醒器设计报告陶冶1 概述1.1 电子提醒器简介随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电 子技术的发展,犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了。 近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控 制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。与此同时, 单片机应用系统的可靠性成为人们越来越关注的重要课题。 影响可靠性的因素是 多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合 因素等。其中系统的抗干扰性能是系统可靠性的重要指标 电子式定时/提醒器:广泛适用于如蒸煮、比赛、学习、美容、煲汤、晒版、 行车、运动、通话、实验、会议...等等需要限时服务以及学习、生活、娱乐中 设定时间。 在当今非常注重工作效率的社会环境中,定时器能给我们的工作、生活以及 娱乐带来很大的方便,充分利用定时器,能有效的加强我们的工作效率,还能有 效的舒缓神经,放松压力(如实验室做实验,用定时器设定好时间,时间到了就 会有声音提醒,不必担心时间掌握不好,在日常生活中,蒸煮食物时你是否经常 忘记时间的时候呢?) 。1.3 计算器基本实现功能1.可以显示主人待办的事情(目前支持英文显示) 。 2.可以支持多条信息提示,按键翻页。 3.小型时间提示, 可以在屏幕上显示当前时间, 让主人对时间的把握更精准。2 系统总体方案及硬件设计2.1 S52 单片机的管脚与特点在一块芯片上集成了 CPU,存储器 RAM,ROM 以及输入与输出接口电路,这 种芯片习惯上被称为单片微型计算机,简称单片机。MCS-52 单片机是 INTEL 公149 电子提醒器设计报告司在 1980 年推出的高档 8 位单片机。 它的典型产品有: 8051, 8031, 8751, 80C51, 80C31,87C51。U119 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 1718XTAL29RST29 30 31PSEN ALE EA1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51"图 1 AT89C51 管脚示意图AT89S5 单片机由 CPU,振荡器与时序电路, 4 个 8 位的 I/O 端口(P0,P1, P2,P3) ,串行口等组成。 P0 口有三个功能: 1、外部扩展存储器时,当做数据总线(如图中的 D0~D7 为数据总线接口) 2、外部扩展存储器时,当作地址总线(如图中的 A0~A7 为地址总线接口) 3、不扩展时,可做一般的 I/O 使用,但内部无上拉电阻,作为输入或输出时 应在外部接上拉电阻。 P1 口只做 I/O 口使用:其内部有上拉电阻。 P2 口有两个功能: 1、扩展外部存储器时,当作地址总线使用 2、做一般 I/O 口使用,其内部有上拉电阻; P3 口有两个功能: 除了作为 I/O 使用外(其内部有上拉电阻) ,还有一些特殊功能,由寄存器 来设置, ALE 地址锁存控制信号 PSEN 外部程序存储器读选通信号 EA/VPP 访问和序存储器控制信号150 电子提醒器设计报告RST 复位信号 XTAL1 和 XTAL2 外接晶振引脚 VCC:电源+5V 输入 VSS:GND 接2.2 LED 显示原理LED 点阵显示器亦称 LED 矩阵板,具有亮度高、发光均匀、可靠性好、接 线简单、拼装方便等优点,能构成各种尺寸的大屏幕显示器。因此,它被广泛应用 于大型 LED 智能显示屏、智能仪器仪表和机电一体化设备的显示单元中,取得了 较好的效果。由于它经济、小型的显示系统,同时要求使用方便灵活,方便地组 成了由多块大屏幕 LED 显示器构成的显示系统,该系统可广泛用于商场、车站、 码头及其它公共场合。 LED 显示屏由 ED 点阵显示器(常见型号为 P2158A) 构成。 它是以发光二极管为像素,按照行与列的顺序排列而成的显示器件,采用逐行(或 逐列) 扫描方式工作,由峰值较大的窄脉冲驱动,从上到下逐次不断地对显示屏 的各行进行选通,同时又向各列送出表示图形或文字信息的脉冲信号,反复循环 以上操作,就可显示各种图形或文字信息 此设计中 LED 数码管的显示为动态显示,采用四位一体共阴极数码管。a、 b、c、d、e、f、g、dP 为段引脚,1、2、3、4 分别表示四个数码管的位。排列 如下: 。。。。。。。。。。。。。。。。。。。。。 1 e a d f dp 2 c 3 g b 4。。。。。。。。。。。。。。。。。。。。。。2.3 晶体振荡电路MCS--52 单片机内部的振荡电路是一个高增益反相放大器, 引线 XTAL1 和 XTAL2 分别为 反向振荡放大器的输入及内部时钟工作电路的输入和来自反向振荡器的输出, 该反向放大器 可以配置为片内振荡器。 这里,我们选用 52 单片机 12MHZ 的内部振荡方式,电路如下:电容器 C1,C2 起稳定振 荡频率,快速起振的作用,C1 和 C2 可在 20-100PF 之间取,这里取 30P,接线时要使晶体振 荡器 X1 尽可能接近单片机。151 电子提醒器设计报告图 4. 晶体振荡电路3 软件设计3.1 ISIS 仿真电路图设计S52 18/19 管脚输入 12M 晶振信号, 脚 30uf 电容及开关接地也做复位信号。 9 2.0-2.7 输出至 LED。3.2 软件主要程序设计 3.2.1AT89S52 配置152 电子提醒器设计报告/*------------------------------------------------------------------------AT89X51.H Header file for the low voltage Flash Atmel AT89C51 and AT89LV51. Copyright (c)
Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. -------------------------------------------------------------------------*/ #ifndef __AT89X51_H__ #define __AT89X51_H__ /*-----------------------------------------------Byte Registers ------------------------------------------------*/ sfr P0 = 0x80; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr P1 = 0x90; sfr SCON = 0x98; sfr SBUF = 0x99; sfr P2 = 0xA0; sfr IE = 0xA8; sfr P3 = 0xB0; sfr IP = 0xB8; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; /*-----------------------------------------------P0 Bit Registers ------------------------------------------------*/ sbit P0_0 = 0x80; sbit P0_1 = 0x81; sbit P0_2 = 0x82; sbit P0_3 = 0x83; sbit P0_4 = 0x84; sbit P0_5 = 0x85; sbit P0_6 = 0x86;153 电子提醒器设计报告sbit P0_7 = 0x87; /*-----------------------------------------------PCON Bit Values ------------------------------------------------*/ #define IDL_ 0x01 #define #define #define #define #define STOP_ PD_ GF0_ GF1_ SMOD_ 0x02 0x02 0x04 0x08 0x80/* Alternate definition *//*-----------------------------------------------TCON Bit Registers ------------------------------------------------*/ sbit IT0 = 0x88; sbit IE0 = 0x89; sbit IT1 = 0x8A; sbit IE1 = 0x8B; sbit TR0 = 0x8C; sbit TF0 = 0x8D; sbit TR1 = 0x8E; sbit TF1 = 0x8F; /*-----------------------------------------------TMOD Bit Values ------------------------------------------------*/ #define T0_M0_ 0x01 #define T0_M1_ 0x02 #define T0_CT_ 0x04 #define T0_GATE_ 0x08 #define T1_M0_ 0x10 #define T1_M1_ 0x20 #define T1_CT_ 0x40 #define T1_GATE_ 0x80 #define T1_MASK_ 0xF0 #define T0_MASK_ 0x0F /*-----------------------------------------------P1 Bit Registers ------------------------------------------------*/ sbit P1_0 = 0x90; sbit P1_1 = 0x91; sbit P1_2 = 0x92; sbit P1_3 = 0x93;154 电子提醒器设计报告sbit P1_4 = 0x94; sbit P1_5 = 0x95; sbit P1_6 = 0x96; sbit P1_7 = 0x97; /*-----------------------------------------------SCON Bit Registers ------------------------------------------------*/ sbit RI = 0x98; sbit TI = 0x99; sbit RB8 = 0x9A; sbit TB8 = 0x9B; sbit REN = 0x9C; sbit SM2 = 0x9D; sbit SM1 = 0x9E; sbit SM0 = 0x9F; /*-----------------------------------------------P2 Bit Registers ------------------------------------------------*/ sbit P2_0 = 0xA0; sbit P2_1 = 0xA1; sbit P2_2 = 0xA2; sbit P2_3 = 0xA3; sbit P2_4 = 0xA4; sbit P2_5 = 0xA5; sbit P2_6 = 0xA6; sbit P2_7 = 0xA7; /*-----------------------------------------------IE Bit Registers ------------------------------------------------*/ sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */ sbit ET0 = 0xA9; /* 1=Enable Timer 0 interrupt */ sbit EX1 = 0xAA; /* 1=Enable External interrupt 1 */ sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */ sbit ES = 0xAC; /* 1=Enable Serial port interrupt */ sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */ sbit EA = 0xAF; /* 0=Disable all interrupts */ /*-----------------------------------------------P3 Bit Registers (Mnemonics & Ports) ------------------------------------------------*/ sbit P3_0 = 0xB0; sbit P3_1 = 0xB1; sbit P3_2 = 0xB2; sbit P3_3 = 0xB3; sbit P3_4 = 0xB4;155 电子提醒器设计报告sbit P3_5 = 0xB5; sbit P3_6 = 0xB6; sbit P3_7 = 0xB7; sbit RXD = 0xB0; /* Serial data input */ sbit TXD = 0xB1; /* Serial data output */ sbit INT0 = 0xB2; /* External interrupt 0 */ sbit INT1 = 0xB3; /* External interrupt 1 */ sbit T0 = 0xB4; /* Timer 0 external input */ sbit T1 = 0xB5; /* Timer 1 external input */ sbit WR = 0xB6; /* External data memory write strobe */ sbit RD = 0xB7; /* External data memory read strobe */ /*-----------------------------------------------IP Bit Registers ------------------------------------------------*/ sbit PX0 = 0xB8; sbit PT0 = 0xB9; sbit PX1 = 0xBA; sbit PT1 = 0xBB; sbit PS = 0xBC; sbit PT2 = 0xBD; /*-----------------------------------------------PSW Bit Registers ------------------------------------------------*/ sbit P = 0xD0; sbit FL = 0xD1; sbit OV = 0xD2; sbit RS0 = 0xD3; sbit RS1 = 0xD4; sbit F0 = 0xD5; sbit AC = 0xD6; sbit CY = 0xD7; /*-----------------------------------------------Interrupt Vectors: Interrupt Address = (Number * 8) + 3 ------------------------------------------------*/ #define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */ #define TF0_VECTOR 1 /* 0x0B Timer 0 */ #define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */ #define TF1_VECTOR 3 /* 0x1B Timer 1 */ #define SIO_VECTOR 4 /* 0x23 Serial port */ #endif3.2.3 单片机 52 基本功能扩展量定义156 电子提醒器设计报告/*------------------------------------------------------------------------INTRINS.H Intrinsic functions for C51. Copyright (c)
Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. -------------------------------------------------------------------------*/ #ifndef __INTRINS_H__ #define __INTRINS_H__ extern void _nop_ (void); extern bit _testbit_ (bit); extern unsigned char _cror_ (unsigned char, unsigned char); extern unsigned int _iror_ (unsigned int, unsigned char); extern unsigned long _lror_ (unsigned long, unsigned char); extern unsigned char _crol_ (unsigned char, unsigned char); extern unsigned int _irol_ (unsigned int, unsigned char); extern unsigned long _lrol_ (unsigned long, unsigned char); extern unsigned char _chkfloat_(float); extern void _push_ (unsigned char _sfr); extern void _pop_ (unsigned char _sfr); #endif3.2.5 显示#include&reg52.h& #define uchar unsigned char #define uint unsigned int sbit rs=P1^0; sbit lcden=P1^2; sbit rw=P3^0; sbit s1=P3^5; sbit s2=P3^1; sbit s3=P3^2; uchar code table[]="
"; uchar code table2[]=" Jianxi Normal "; uchar code table3[]=" University! "; uchar code table1[]=" 14:00:00 "; uchar num,tt,s1 char shi,fen, void delay(int z) { int x,y; for(x=z;x&0;x--) for(y=124;y&0;y--); }157 电子提醒器设计报告void write_cmd(uchar); //1602 写命令 void write_data(uchar); //1602 写数据 void write_sfm(uchar,uchar);//显示时间 void keyscan(); void init(); void main() { init(); while(1) { keyscan(); if(tt==20) //定时器是否到 1 秒 { tt=0; miao++; //秒加 1 if(miao==60) { miao=0; fen++; if(fen==60) //分加 1 { fen=0; shi++; if(shi==24) //时加 1 { shi=0; } write_sfm(4,shi); //显示时间 } write_sfm(7,fen); } write_sfm(10,miao); } // if(miao==0&&fen==0&&shi==0) // FM=1; } } void init() //1602 初始化 { write_cmd(0x38); write_cmd(0x0c); write_cmd(0x06); write_cmd(0x01);158 电子提醒器设计报告write_cmd(0x80); for(num=0;num&16;num++) { write_data(table[num]); delay(1); } write_cmd(0xc0); for(num=0;num&16;num++) { write_data(table1[num]); delay(1); } // FM=0; shi=23; fen=58; TMOD=1; TH0=()/256; TL0=()%256; EA=1; ET0=1; TR0=1;//写第一组数据//写数据//定时器初始化} void write_cmd(uchar cmd) { rs=0; lcden=1; delay(5); P0= lcden=0; delay(5); } void write_data(uchar date) //写数据 { rs=1; lcden=1; delay(5); P0= lcden=0; delay(5); } void write_sfm(uchar add,uchar date) //显示时间 {159 电子提醒器设计报告uchar shi, shi=date/10; ge=date%10; write_cmd(0xc0+add); write_data(0x30+shi); write_data(0x30+ge); } void keyscan() { // rw=0; P3=0 if(s1==0) { delay(5); if(s1==0) { TR0=0; s1num++; while(!s1); switch(s1num) { case 1: write_cmd(0x0d); write_cmd(0xc0+11); case 2: write_cmd(0xc0+8); case 3: write_cmd(0xc0+5); case 4: s1num=0; TR0=1; write_cmd(0x0c); } } } if(s1num!=0) { if(s2==0) {160 电子提醒器设计报告delay(5); if(s2==0) { while(!s2); switch(s1num) { case 1: miao++; if(miao==60) miao=0; write_sfm(10,miao); write_cmd(0xc0+11); case 2: fen++; if(fen==60) fen=0; write_sfm(7,fen); write_cmd(0xc0+8); case 3: shi++; if(shi==24) shi=0; write_sfm(4,shi); write_cmd(0xc0+5); } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); switch(s1num) { case 1: miao--; if(miao==-1) miao=59; write_sfm(10,miao); write_cmd(0xc0+11);161 电子提醒器设计报告 case 2: fen--; if(fen==-1) fen=59; write_sfm(7,fen); write_cmd(0xc0+8); case 3: shi--; if(shi==-1) shi=23; write_sfm(4,shi); write_cmd(0xc0+5); } } } } else { if(s2==0) { delay(5); if(s2==0) { select++; if(select&2) select=-1; switch(select) { case 0: write_cmd(0x80); for(i=0;i&16;i++) { write_data(table2[i]); delay(5); } case 1: // write_cmd(0x80); for(i=0;i&16;i++)162 电子提醒器设计报告{ write_data(table3[i]); delay(5); } case 2: write_cmd(0x80); for(i=0;i&16;i++) { write_data(table[i]); delay(5); } } while(!s2); } } } } void time() interrupt 1 { TH0=()/256; TL0=()%256; tt++; }//4 ISIS 软件仿真4.1.1 应用软件的编制、调试使用编译软件工具时,项目开发流程和其它软件开发项目的流程极其相似。 (1)创建一个项目,从器件库中选择目标器件,配置工具设置。 (2)用 C 语言创建源程序。 (3)修改源程序中的错误。 (4)实践测试4.1.2 总调总调,即应用软件的链接调试,程序固化,软、硬件结合的应用系统。软硬 件联合仿真系统由一个硬件执行环境和一个软件执行环境组成, 通常软件环境和 硬件环境都有自己的除错和控制界面,它们整合调试可以实现系统的总调。本系 统的软件系统较大,全部采用 C 语言编写,除语法与逻辑差错外,当确认程序163 电子提醒器设计报告没问题时,直接下载到单片机仿真调试。采取自下到上的方法,单独调好每一个 模块, 最后完成一个完整的系统调试, 使单片机能够正常的安装预定的程序运行。5 设计体会时间眨眼间溜走。转眼间已到了大三尾声。心情澎湃的回顾过去三年,胸中百感 交集,感慨万分。过去的岁月是以名对着单片机渴求的路途。是一个从入门学习 者到渐渐爱上它的旅程。 虽然说对于单片机技术方面的知识还有很多要学习和提 高,但是在这段时间的反复学习后我还是感受到这门课程的魅力所在。 经过一个学期的努力,顺利的完成了单片机课设。这是一个磨练意志的过程。 从课题的选择开始,计算器的设计、硬件和软件系统的设计、到最后的 isis&Proteus 软件仿真完成,这其中经历了很多困难,但是更重要的是在这个过 程中我得到了很大的锻炼。一方面通过 C51 单片机等一些器件的设计让我学习和 掌握了单片机技术的基础知识和技术要点,也使以前学的很多知识都得到了运用; 另一方面在用 Proteus 软件画电路图时,然后再转换成一维的 WORD 中进行编辑, 这个过程中让我掌握了计算机辅助的设计技术,让自己能够更加熟练的运用这些 重要的机械设计软件。当然,这是一个需要不断的尝试,不断的校核,不断的修 改,最后完成一个合理的设计的过程。需要的是细心和耐心。在很大程度上培养 了我拼搏的工作精神。使我受益匪浅,更加明确了自己专业的方向。 感谢在这次课程设计过程中给予我帮助和指导的各位老师,特别是黄建华老 师、刘祝化老师、刘刚老师,感谢师长们孜孜不倦的为我们授业解惑,帮助我们 解决一个又一个难题,无私的为我们提供一页又一页的资料; 通过本次课设,我们不仅学到了关于单片机技术方面的许多专业知识,同时 也让我感觉到团队合作的重要性。其实如何有效和快速的找到资料也是课设给我 的启发,利用好图书馆和网络,是资源的到最好的利用。与他人交流思想是取得 成功的关键,在交流中,不仅强化了自己原有的知识体系,也扩展了自己的思维。 课设是一个通过思考、发问、自己解惑并动手、提高的过程。我们会在以后的学 习中不断学习,积累经验,完善自己。 此次课程设计的结束,又是一个新开始,希望我们大家在以后的学习之中充 分展现自我,努力学习新的知识,当然最重要的还是牢固掌握本专业所学习的知164 电子提醒器设计报告识。让我们坚信自己的理想,人生的道路四通八达,但我们不渝的方向只有一个, 那就是前进,永不言弃,永不退缩! 我相信,用心一定能赢得精彩!参考文献[1] 何立民.MCS-51 系列单片机应用系统设计[M].北京:北京行天航空工业大学 出版社,.-160. [2] 李华.MCS-51 系列单片机实用接口计数[M].北京:北京行天航空工业大学出 版社,8. [3] 张毅刚、彭喜源、曲春波编著。MCS-51 单片机应用设计。哈尔滨工业大学 出版社, [4]李广弟等编著. 单片机基础.修订本. 北京: 北京航空航天大学出版社,
[5]张凯,马忠梅编著.MCS-51 单片机综合系统及设计开发. 北京:科学出版社, 实物图165 波形发生器波形发生器王跃平 摘要:随着电子技术的发展,波形发生器已经广泛的应用在通信、控制、测量等各个领域。产生任意波形通常可采用攻击与数字合成的方法,即先将所需 产生的信号波形的一个周期的若干个样点的幅值的二进制信息存储在波形存储 器中,在通过硬件电路一次从波形存储器中读取出来,经 D/A 转换后得到所需波 形的输出。 本文介绍一种应用 AT89S52 单片机设计的波形发生器。 该系统主要由单片机 系统 AT89S52、D/A 转换芯片 DAC0832 和液晶 1602 显示组成。系统可以实现三角 波、方波和正弦波等波形的输出,且各种波形的输出频率可调。理论上输出频率 范围为 5Hz~1000Hz。关键字:波形发生器;D/A 转换;频率;幅值;液晶显示;AT89S521.引言在电子工程、通信工程、自动控制、遥测控制、测量仪器、仪表和计算机等 技术领域, 经常需要用到各种各样的信号波形发生器。 随着集成电路的迅速发展, 用集成电路可很方便地构成各种信号波形发生器。 用集成电路实现的信号波形发 生器与其它信号波形发生器相比,其波形质量、幅度和频率稳定性等性能指标, 都有了很大的提高。 波形发生器亦称函数发生器,作为实验用信号源,是现今各种电子电路实验 设计应用中必不可少的仪器设备之一。目前,市场上常见的波形发生器多为纯硬 件的搭接而成,且波形种类有限,多为锯齿、正弦、方波、三角等波形。 当今是科学技术及仪器设备高度智能化飞速发展的信息社会, 电子技术的进 步,给人们带来了根本性的转变。现代电子领域中,单片机的应用正在不断的走 向深入,这必将导致传统控制与检测技术的日益革新。单片机构成的一起具有高 可靠性、高性能价格比,在智能仪表系统和办公自动化等诸多领域得以广泛的应 用

我要回帖

更多关于 纯硬件电路原理图 的文章

 

随机推荐