单片机实训报告书.docx_第1页
单片机实训报告书.docx_第2页
单片机实训报告书.docx_第3页
单片机实训报告书.docx_第4页
单片机实训报告书.docx_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉理工大学单片机实训报告书目录一、绪论1 1.相关背景.1 2.课程设计的目的和意义2二、硬件电路原理分析.3 1.AT89C51引脚图.3 2.ADC0832引脚图.5 3.数码管计数原理.6 3.1.数码管显示原理.6 3.2.定时/计数原理.8 4.LCD滚动显示.10 5.矩阵键盘下的电子时钟.15 6.串口通信.16 7.AD模数转换.19三、软件编程设计21 1.数码管循环计数21 2.LCD滚动显示.23 3.矩阵键盘下的电子时钟.25 4.串口通信程序设计.28 5.模数转换程序设计.30四、总结.31参考文献.33 附录.34 1.电路图342.程序清单.34 2.1.六十秒循环计数.34 2.2.LCD滚动显示.36 2.3.矩阵键盘下的电子时钟.39 2.4.串口通信48 2.5模数转换60一、绪论1.相关背景单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。本次课程设计我们所用的是51单片机。51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。单片机的硬件特性:1、主流单片机包括CPU、4KB容量的RAM、128 KB容量的ROM、 2个16位定时/计数器、4个8位并行口、全双工串口行口、ADC/DAC、SPI、I2C、ISP、IAP;2、系统结构简单,使用方便,实现模块化;3、单片机可靠性高,可工作到106 107小时无故障;4、处理功能强,速度快;5、低电压,低功耗,便于生产便携式产品;6、控制功能强;7、环境适应能力强。单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域2.课程设计的目的和意义本次课程设计是运用所学书本测控系统微处理器原理及应用中的C51知识来进行电路的焊接、调试以及相关基本功能的实现。做课程设计之前,首先要对书本中C51的知识要烂熟于心,只有掌握了相关部分的相关功能,我们才能写出有用的程序来。此次课程设计要实现数码管显示、矩阵键盘扫描、中断程序、定时器程序、串口通讯等基本功能以及LCD液晶屏的显示和AD的数据采集功能。在书本中,我们可能已经理解记住了相关的程序,但毕竟没有经过实践的操练,因此一直处于一种并不能完全掌握知识的状态。而课程设计则是很好的一个动手锻炼的机会。在焊接电路板的时候,我们是根据原理图有条理的进行焊接,这样,对整个单片机各部分的功能也有了更深的印象。这也是我们编程实现功能的基础。焊接好电路板之后就是进行调试,直到各部分的功能都能实现,即电路板就焊接好了。接下来就是编写程序来实现功能了。正是通过编写程序,我对所学知识的理解更加清晰,也体会到了单片机的强大功能以及在生活中的普遍应用。大学并不像我们之前所学一样,仅仅学习课本上的知识来应对考试,大学更注重的是自学和动手实践能力。而课程设计就是一个很好的体现,也是帮助我们从学习效仿转变为动手创新的必经阶段。因此,课程设计的目的就在于把我们所学的知识要一步步真正应用于实际生活中,也正是通过课程设计,我们自学了许多软件,这对塑造我们成为多方面人才有必要的作用。由此看来,课程设计的意义是十分重大的。希望我们自己能通过本次课程设计,能将更多的知识应用于生活中,为人类的生活创造便利和快捷。二、硬件电路原理分析1.AT89C52引脚图单片机一共有40个引脚,按功能可以将它们分成三类:电源和时钟引脚:Vcc(40脚)、GND(20脚)单片机的电源引脚。XTAL1(19脚)、XTAL2(18脚)外接时钟引脚。XTAL1为片内振荡电路的输入端,XTAL2为片内振荡电路的输出端。在进行片内时钟振荡方式时,需在这两个脚 石英晶体和振荡电容,振荡电容的值一般取10-30pF;另一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。这里我们用的是片内时钟振荡方式,振荡电容为33pF。编程控制引脚:RST(9脚)单片机的复位引脚。当输入连续两个机器周期以上高电平时为有效,用来完成单片机的复位初始化操作,复位后程序计数器PC=0000H。PSEN/(29脚)程序存储器允许输出控制端。在读外部程序存储器是该引脚低电平有效。ALE/PROG/(30脚)当ALE是高电平时,允许地址锁存信号,当访问外部存储器时,ALE信号负跳变将P0口上低八位地址信号送入锁存器;当ALE是低电平时,P0口上的内容和锁存器输出一致。PROG/为编程脉冲的输入端。该引脚的用处已经不太大了。EA/Vpp(31脚)EA/接高电平时,单片机直接读取内部程序存储器,当拓展有外部ROM时,当读取完内部ROM后自动读取外部ROM。EA/接低电平时,单片机直接读取外部ROM。I/O引脚:P0口(39脚-32脚)双向8位三态I/O口,每个口可独立控制。P0口内部没有上拉电阻,为高阻态,不能正常输出高低电平,因此该组I/O口在使用时要外接上拉电阻。P1口(1脚-8脚)准双向8位I/O口,每个口可独立控制,内带上拉电阻。P2口(21脚-28脚)准双向8位I/O口,每个口可以独立控制,内带上拉电阻,与P1口相似。P3口(10脚-17脚)准双向8位I/O口,每个口可以独立控制,内带上拉电阻。P3口还有第二功能,P3.0是串行输入口,P3.1是串行输出口,P3.2是外部中断0,P3.3是外部中断1,P3.4是定时计数器0外部输入端,P3.5是定时计数1外部输入端,P3.6是外部数据存储器写脉冲,P3.7是外部数据存储器读脉冲。2.ADC0832引脚图输入输出电平与TTL/CMOS相兼容;5V电源供电时输入电压在05V之间;工作频率为250KHZ,转换时间为32S;一般功耗仅为15mW。CS_(1脚)片选使能,低电平芯片使能。CH0(2脚)模拟输入通道0,或作为IN+/-使用。CH1(3脚)模拟输入通道1,或作为IN+/-使用。GND(4脚)芯片参考0 电位(地)。DI(5脚)数据信号输入,选择通道控制。DO(6脚)数据信号输出,转换数据输出。CLK(7脚)芯片时钟输入。Vcc/REF(8脚)电源输入及参考电压输入(复用)。 3.数码管计数原理3.1.数码管显示原理:数码管是靠点亮内部的发光二极管来是发光的,一个数码管的引脚是10个,显示一个8字需要7个小段,另外还有一个小数点。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。共阳极的数码管0f的段编码是这样的: unsigned char code table= /共阳极0f数码管编码 0xc0,0xf9,0xa4,0xb0,/03 0x99,0x92,0x82,0xf8,/47 0x80,0x90,0x88,0x83,/8b 0xc6,0xa1,0x86,0x8e /cf 共阴极的数码管0f的段编码是这样的: unsigned char code table=/共阴极0f数码管编码 0x3f,0x06,0x5b,0x4f, /03 0x66,0x6d,0x7d,0x07, /47 0x7f,0x6f,0x77,0x7c, /8b0x39,0x5e,0x79,0x71 /cf 3.2.定时/计数原理:定时/计数就会用到中断。中断是为了使单片机具有对外部或内部随机发生的事件实时处理而设置的,在CPU处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回)。单片机的定时中断就是这样的:CPU开启计时功能后,定时器便在晶振的作用下自动开始计数,当定时器的计数器计满后,要归零,这就是一个中断的过程。这里用到的寄存器有中断允许寄存器IE、定时/计数工作方式寄存器TMOD、定时/计数控制寄存器TCON。中断允许寄存器IE字节地址为A8H,可以位寻址。EA=1,打开全局中断控制,一旦EA为0,则全部中断无效。ET2=1,打开定时/计数器T2中断。ES=1,串行口中断。ET1=1,打开定时/计数器T1中断。EX1=1,打开外部中断1中断。ET0=1,打开定时/计数器中断。EXO=1,打开外部中断0中断。定时/计数器工作方式寄存器TMOD字节地址为89H,不能位寻址。GATE门控制位。GATE=0,定时/计数器启动和停止仅受TCON寄存器中TRX(X=0,1)来控制。GATE=1,定时/计数启动和停止由TCON寄存器中的TRX(X=0,1)和外部中断引脚上的电平状态来共同控制。C/T_定时模式和计数模式选择位。C/T_=1,为计数器模式。C/T_=0,为定时器模式。M1M0工作方式选择位。定时/计数器控制寄存器TCON字节地址为88H,可进行位地址。高四位用于定时计数,低四位用于外部中断。TF1定时器溢出标志位。当定时器1计满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。TR1定时器1运行控制位。由软件清0关闭定时器1。当GATE=0时,TR1置1启动定时器1.TF0定时器0溢出标志位。TR0定时器0运行控制位。因为本次课程设计并未用到外部中断,这里就不一一做介绍了。4.LCD滚动显示第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平(RS=1)时选择数据寄存器、低电平(RS=0)时选择指令寄存器。 第5脚:R/W为读写信号线,高电平(R/W=1)时进行读操作,低电平(R/W=0)时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第714脚:D0D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。1602液晶主要技术参数:显示容量为16*2个字符;芯片工作电压4.55.5V;工作电流2.0mA(5.0V);模块最佳工作电压5.0V;字符尺寸为2.95*4.35(W*H)mm。基本操作时序RAM地址映射图:控制器内部带有80B的RAM缓冲区,对应关系如下图:当我们向图中的000F、404F地址中的任一处写入显示数据时,液晶都可以立即显示出来,当写入到1027或5067地址时,必须通过移屏指令将它们移入可显示区域方可正常显示。数据指针设置:80H+地址码,可以访问内部的全部80B的RAM。11条控制指令:第1条: 清显示(0x01H) RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 1第2条: 光标复位(0x02H或0x03H)RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 1 *第3条:设置输入模式RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 1 I/D SI/D:光标移动方向,高电平右移,低电平左移。 S:屏幕上所有文字是左移或右移,高电平有效, 低电平则无效。第4条 显示开/关控制RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 1 D C BD:控制整体显示的开与关,高电平表示开显示,低电平表示关显示。 C:控制光标的开与关, 高电平表示有光标,低电平表示无光标。 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。第5条 光标或者字符移位RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 1 S/C R/L * *S/C:高电平时移动显示的文字,低电平时移动光标 R/.L:高电平表示右移,低电平表示左移。第6条 功能设置RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 1 DL N F * *D/L:高电平时为4位总线,低电平时为8位总线。 D:高电平时,双行显示,低电平时单行 显示。 F:高电平时显示510,低电平时显示57。(有些模块是DL:高电平时为8位总线,低电平时为4位总线)第7条 字符发生存储器地址RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 1 字符发生器地址(AGG)第8条 数据存储器地址RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 0 1 显示数据存储器地址(ADD)第9条 读取忙标志或者地址RS RW D7 D6 D5 D4 D3 D2 D1 D0 0 1 BF 计数器地址(AC)BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如何为低电平表示不忙。第10条 写数据到CGRAM或者DDRAMRS RW D7 D6 D5 D4 D3 D2 D1 D0 1 0 写入的数据第11条 CGRAM或者DDRAM读取数据RS RW D7 D6 D5 D4 D3 D2 D1 D0 1 1 读取的数据5.矩阵键盘下的电子时钟在计算机系统中,若需要多个按钮,通常将这些按钮组成阵列,如16个按钮,则排成44阵列,称之为键盘。键盘电路如图,进行键盘扫描时,将扫描信号送至X0-X3,再由Y0-Y3。读取键盘状态,判断哪个按键被按下。键盘扫描方式有两种,即低电平扫描与高电平扫描。a.低电平扫描它是将COM端连接VCC,在没有按键按下时,Y0-Y3保持为高电平(即1)。在x0-x3上送低电平,如果对应的行有按键按下,则读取Y0-Y3中会有低电平状态。整个扫描分为4个阶段:第一个阶段是判断第一列的按键,在X0送低电平,X1-X3送高电平,读取Y0-Y3的状态,若有低电平值,则第一列对应的按键按下。第二、三、四阶段分别依次判断第二、三、四列的按键,依次在X1、X2、X3上送低电平,分别读取Y0-Y3。b.高电平扫描它是将COM端连接GND,在没有按键按下时,Y0-Y3保持为低电平(即0)。在x0-x3上送高电平,如果对应的行有按键按下,则读取Y0-Y3中会有高电平状态。整个扫描分为和低电平扫描过程一样。两种扫描的速度很快,每个扫描周期只需要几个毫秒,通常以低电平扫描为主。电子时钟也就是运用到了前两个模块的定时器和LCD显示功能,在此基础上添加键盘扫描来控制时钟的启动、暂停和分时秒的加一减一。6.串口通信串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。52单片机的串行口是一个可编程双工的通信接口,具有通用异步收发器的全部功能,能同时进行数据的发送和接收,也可作为同步移位寄存器的使用。52单片机的串行口主要由两个独立的串行缓冲寄存器SBUF(一个发送缓冲寄存器,一个接收缓冲寄存器)和发送控制器、接收控制器、输入移位寄存器及若干控制门电路组成。与串行口紧密相关的一个特殊功能寄存器是串行口控制寄存器SCON,它用来设定串行口的工作方式、接收/发送控制以及设置状态标志位等。可位寻址。SCON寄存器SM0、SM1串行口工作方式控制位:SM2多机通信控制位:多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接收到的数据放弃。当SM2=0时,就不管第9位数据是0还是1,都会将数据送入SBUF,并发出中断申请。工作于方式0时,SM2必须为0。REN允许接收位:REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。TB8发送接收数据位8:在方式2和方式3中,TB8是要发送的即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。RB8接收数据位8:在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。TI发送中断标志位:可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。RI接收中断标志位:可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。在串口中断处理时,TI,RI都需要软件清0,硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。与串口通信相关的另一个问题就是波特率。单片机或计算机在串口通信时的速率用波特率表示,它定义为每秒传输二进制代码的位数,即1波特=1为/秒。如每秒钟传送240个字符,而每个字符格式包含10位(一个起始位、一个停止位。八个数据位),这时的波特率为2400波特。串行口的工作方式有四种,其中方式0和方式1的波特率是固定的,方式1和方式3的波特率是可变的。方式1和3:波特率= (2SMOD/ 32)(定时器T1的溢出率);T=(256-X)12/fosc.7.AD模数转换ADC0832的芯片引脚功能由前面已经介绍,这里就不重复说明了。一般的A/D转换过程是通过采样保持、量化和编码这三个步骤完成的,即首先对输入的模拟电压信号采样,采样结束后进入保持时间,在这段时间内将采样的电压量转化为数字量,并按一定的编码形式给出转换结果,然后开始下一次采样。一般情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。当要进行A/D转换时,须先将CS端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK提供时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲到来之前DI端必须是高电平,表示启动位。在第2、3个时钟脉冲到来之前DI端应输入2位数据用于选择通道功能。如下表:当配置位2位数据为1、0时,只对CH0进行单通道转换。当配置2位数据为1、1时,只对CH1进行单通道转换。当配置2位数据为0、0时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当配置2位数据为0、1时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。到第3个时钟脉冲到来之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个时钟脉冲开始由DO端输出转换数据最高位D7,随后每一个脉冲DO端输出下一位数据。直到第11个脉冲时发出最低位数据D0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个时钟脉冲输出D0。随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。三、软件编程设计1.数码管循环计数第二部分对数码管及其计数原理都解释过了,这里就对一些重要的程序做详细的说明。TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1;EA=1;定时初始化,TMOD=0x01表示选择定时器0的工作方式1,THO和TL0装初值,N=5000为50ms中断一次。TR0=1启动定时器0,EA=1打开总中断,ETO=1打开定时/计数中断0。void time() interrupt 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; num+; if(num=20) num=0; sec+; if(sec=60) sec=0; 中断函数,num每加一判断一次是否到达20次,如果到达20次则说明一秒时间到,如果sec计到60,则产生中断,清零。这就是60秒计数的原理和相关程序。2.LCD滚动显示根据第二部分的相关知识,我写出了液晶滚动显示的程序。因为单片机处理数据的速度是很快的,为了使液晶运行稳定,在程序中会加入延时函数,做剪短延时。通过测试和调试来选择最佳的延时,一般是延时5ms。第一步首先要根据RS来确定是写数据还是写命令。写命令包括液晶的显示与否,光标的闪烁与否,需不需要移屏,在液晶的什么位置显示等。写数据则是指要显示什么内容。RS=0为选择写命令模式,RS=1为选择写数据模式。第二步确定读/写选择端RW=0,因为我们不从液晶中读取任何数据,只向液晶中写入命令和显示数据,所以此端时钟选择位写状态,即低电平接地。第三步将数据和命令通过P口送达到数据线上。第四步是使能信号E操作。因为初始化时使能端为低电平,所以写命令和写数据时要给使能端一个高脉冲,根据1602的时序图可以看出使能端在高电平时数据有效。稍作延时之后,将使能端置0以完成高脉冲。第五步是LCD显示初始化,也就是命令初始化。lcd_wcom(0x38);(00111000)设置16*2的显示,5*7的点阵和八位数据接口。lcd_wcom(0x0c);(00001100)打开显示,不开光标。lcd_wcom(0x06);(00000110)写一个字符后地址自动加一,也就是可以写一串字符。lcd_wcom(0x01);(00000001)显示清屏数据指针清零。第五步就是将数据都写入LCD液晶显示屏上。lcd_wcom(0x80);写命令,就是将第一行的数据要求写在液晶显示频上的第一行的第一个。for(m=0;m10;m+)将第一行的数据逐个写入液晶显示屏上 lcd_wdat(tablem);delay(5);lcd_wcom(0x80+0x40);将数据地址换到第二行的第一个for(n=0;n8;n+)写入第二行的所有数据 lcd_wdat(table1n);delay(5);while(1)循环语句,整屏不停的移动 lcd_wcom(0x18);(0001100)为整屏左移指令,每间隔250ms移动一个地址。 delay(250); 3.矩阵键盘下的电子时钟这是一个在液晶上的显示函数:void display(uchar hour,uchar minutes,uchar seconds) uchar hourge,hourshi,minutesshi,minutesge,secondsshi,secondsge; hourshi=hour/10; hourge=hour%10; lcd_wcom(0x80+0x40); lcd_wdat(hourshi+48); delay(5); lcd_wdat(hourge+48); delay(5); minutesshi=minutes/10; minutesge=minutes%10; lcd_wcom(0x80+0x43); lcd_wdat(minutesshi+48); delay(5); lcd_wdat(minutesge+48); delay(5); secondsshi=seconds/10; secondsge=seconds%10; lcd_wcom(0x80+0x46); lcd_wdat(secondsshi+48); delay(5); lcd_wdat(secondsge+48); delay(5); 定义时分秒的全局变量,然后在函数里分别定义时分秒的个位和十位。因为时间是显示在第二行的所以写命令的首地址是在(0x80+0x40),表示小时的两位写命令,随后写数据,因为单片机内要把数字转换成字符,用ASCII码表示,所以要十位和个位分别都加上48(0的ASCII)。分钟也是如此,只不过写命令的地址相对于小时要右移三位。同理,秒钟也是如此。P2=0x0f; if(P2!=0x0f) delay(10); if(P2!=0x0f) switch(P2) /列扫描 case(0x07):a=3;break; case(0x0b):a=2;break; case(0x0d):a=1;break; case(0x0e):a=0;break; P2=0xf0; switch(P2) /行扫描 case(0x70):a=a+12;break; case(0xb0):a=a+8;break; case(0xd0):a=a+4;break; case(0xe0):a=a+0;break; 按照电路图,我设置的是键盘从上往下为高位到地位,与P2的高低位对应着接。首先进行列扫描,从右往左数为第0到第3列。设置键值a为0,1,2,3。然后进行的是行扫描,从下往上为第0行到第3行,第一行为0加每一列的值,第二行与第一行隔了四个,为4加每一列的值,同理可以得到剩下两行的键值。从而对4*4的键盘矩阵赋予了015的键值给a。switch(a) /键盘控制 case(0):TR0=0;break; case(8):TR0=0;seconds+;break; case(4):TR0=0;seconds-;break; case(12):TR0=1;break;case(13):TR0=0;minutes+;break;case(9):TR0=0;minutes-;break;case(14):TR0=0;hour+;break;case(10):TR0=0;hour-;break;default:break;在设置定时器初始化时,只开启了总中断,定时器运行控制并没有设置,将它放在switch结构中,用键盘来控制,从而达到键盘控制定时器启动和暂停的目的。4.串口通信程序设计我设计的是通过串口来让上位机控制LCD的电子时钟的改变。void Timeinit() TMOD=0x21; TH0=(65536-50000)/256; TL0=(65536-50000)%256;TH1=0xfd;TL1=0xfd;EA=1;/开启总中断ET0=1;/开启定时器中断PS=1;/设置串口为高优先级ES=1;/串行口中断允许位TR1=1;REN=1;/允许串行口接收数据SM0=0;/串行口工作方式1设置SM1=1; TMOD=0x21,是定时和串口定时一起设定的,定时是定时器0的方式1,串口定时是定时器1 的工作方式2。设定串口通信在工作方式1,波特率为9600bps。系统晶振频率为11.0592MHz。波特率= (2SMOD/ 32)(定时器T1的溢出率);T=(256-X)12/fosc.取SMOD=0,则溢出率为307200Hz,算出X=253,转换成十六进制为0xfd。在TH1和TL1中装好计算好的初值,启动定时器,然后TL1寄存器便在时钟的作用下开始加一计数,当TL1计满溢出后,CPU会自动将TH1中的数装入TL1中继续计数,所以TL1和TH1中装的数值必须是一样的。写完初始化之后,就是串口中断程序。void ser() interrupt 4 /串口中断 RI=0; d=SBUF;switch(d) case(0):TR0=1;break;case(1):TR0=0;seconds+;break;case(2):TR0=0;seconds-;break;case(3):TR0=0;break;case(4):TR0=0;minutes+;break;case(5):TR0=0;minutes-;break;case(6):TR0=0;hour+;break;case(7):TR0=0;hour-;break;RI为接收中断标志位,RI清零,因为程序既然产生了串口中断,则是接收到了数据,此时RI会被硬件置1,进入串口中断服务程序后必须由软件清零,这样才能产生下一次中断。将SBUF中的数据读给d,d=SBUF表示单片机自动将串口接收寄存器中的数据取走给d,然后通过选择结构,选择d的值来控制时钟。这样就实现的串口的单向通信。5.模数转换程序设计本程序设计分为以下几个模块设计:1.液晶模块的操作程序(判断液晶模块的忙碌状态、将模块设置指令或显示地址写入液晶显示屏上、指定字符显示的实际地址、将数据写入液晶模块、对LCD的显示指令进行初始化)2.电压显示(显示电压符号、显示电压的小数点、显示电压的单位、显示电压的整数部分和小数部分、将模拟信号转换为数字信号)3.主函数模块。具体的程序见附录。四、总结如果是纯书本和纯理论来学习单片机的话,则会显得非常困难,很多知识点、原理和电路都不好理解。而本次课程设计则解决了很大的问题。首先,我们在焊电路板时,对电路的结构和原理有了更加清晰的认识,这对我们后续程序的设计也是有很大的帮助的。其次,我们在设计程序来实现相关功能时,我们对单片机的内部结构和其强大的功能有了更清晰的认识,思路也由开始的模模糊糊变得越发的清楚。再者,我们在做课程设计的过程中,也学到了很多的新东西。让我们处理事情更加有条理,思路更加清晰明了了,发现、提出、分析、解决问题和实践能力的提高都将受益于我在以后的学习、工作和生活中。此次的设计,其实也是我们所学知识的一次综合运用,让我深深的认识到了学习单片机要有一定的基础,要有电子技术方面的数字电路和模拟电路等方面的理论基础,特别是数字电路;也要有编程语言的汇编语言或C语言。要想成为单片机高手,我们首先要学好汇编语言,然后转入C语言学习,所以我们不能学到后面就忘了前面的知识,更应该将所学的知识紧紧的结合在一起,综合运用,所谓设计,就是要求创新,只有将知识综合运用起来才能真正的设计好。参考文献1 刘宁.单片机多功能时钟的设计D.浙江:浙江海洋学院,2009.2 汪文,陈林.单片机原理及应用M.湖北:华中科技大学出版社,20073 康华光.电子技术基础数字部分M.北京:高等教育出版社,2008.4 宋礼国.多功能电子时钟的硬件设计J. 中国科技博览,2009(1):217-208.5 李广弟等.单片机基础.北京航空航天出版社, 2001.76 楼然苗等.51系列单片机设计实例.北京航空航天出版社, 2003.37 唐俊翟等.单片机原理与应用.冶金工业出版社, 2003.98 刘瑞新等.单片机原理及应用教程.机械工业出版社, 2003.79 吴国经等.单片机应用技术.中国电力出版社, 2004.110 李全利,迟荣强编著.单片机原理及接口技术.高等教育出版社,2004.111 马忠梅等.单片机的C语言应用程序设计.北京航空航天大学出版社,2003修订版12 张毅刚等.MCS-51单片机应用设计.哈工大出版社,2004年第2版附录1.电路图2.程序清单 2.1.六十秒循环计数:#include#define uchar unsigned char;uchar LED1,LED2;uchar distab= 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6;/数码管段选0到9uchar num=0;sec;void delay(unsigned int a)/延时函数 unsigned int i,j; for(i=0;ia;i+) for(j=0;j120;j+);void display()/数码管显示函数 LED1=sec/10; LED2=sec%10; P2=0x01; P0=distabLED1; delay(3); P2=0x02; P0=distabLED2; delay(3);void time() interrupt 1/定时中断 TH0=(65536-50000)/256; TL0=(65536-50000)%256; num+; if(num=20) num=0; sec+; if(sec=60) sec=0; main() TMOD=0x01;/定时器0工作方式1初始化 TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1; EA=1; While(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论