




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机技术与项目实施MicroControllerUnit
CentralProcessingUnit
MCUCPU单片机中央处理单元1单片机概念MicroControllerUnit把微处理器CPU、存储器ROM、RAM、输入/输出口I/O等功能部件集成在一个芯片内的单芯片微型控制器可单独地完成所需要的智能化控制功能单片机封装形式双列直插式
DIP封装单片机
封装形式塑料封装有引线芯片载体
PLCC封装单片机
封装形式SOP封装PQFP封装单片机
封装形式2单片机发展史单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段
1.SCM即单片微型计算机(SingleChipMicrocomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。
2.MCU即微控制器(MicroControllerUnit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips、ST、AT公司。
3.SoC
即片上系统(SystemonaChip)单片机是嵌入式系统的独立发展之路,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。最著名的厂家当数SANSUN、ST公司(基于ARM内核)。对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统3单片机的应用军事技术
通常在这些电子系统的集中显示系统、动力监测控制系统、自动驾驭系统、通讯系统以及运行监视器(黑匣子)都会用到单片机技术。
单片机的应用人工智能
工业机器人的控制系统由中央控制器、感觉系统、行走系统、擒拿系统等节点构成的单机或多机网络系统。而其中的每一个小系统(如数据采集、远程监控系统)都是由单片机进行控制的。
单片机的应用工业控制单片机的应用为传统的仪器仪表行业的产品“更新换代”提供了非常理想的条件。目前各种变送器、电器测量仪表普遍采用单片机系统代替原来的测量系统,使测量系统的各种功能如存储、数据处理、查找、判断、联网和语音等功能得以实现。
单片机应用领域
消费类电子产品学习内容与考核项目一LED电子显示屏学习内容:单片机端口应用;编译软件KEIL、仿真软件proteus的操作;单片机芯片内外数据的读、写。(在proteus界面上仿真电路,完成C51程序的编制与功能调试。)案例一点亮一只LED案例二流水显示八只LED案例三32只彩灯多模式案例四LED点阵显示屏项目二定时开关控制器
学习内容:动态、静态数码结构、特点与控制;独立、矩阵键盘结构、特点与识别。(在proteus界面上仿真电路,完成C51程序的编制与功能调试。)案例1数码静态显示案例2数码动态显示案例3独立键盘案例4
0-9键控秒表案例5行列键盘案例6
99-00键控倒计时秒表案例7定时开关控制器(中断)项目三调光控制器
学习内容:串行通讯方式、控制,无线通讯设计、调试;电路中不同类型信号与单片机的接口、编程与调试。(在proteus界面上仿真电路,完成C51程序的编制与功能调试。)案例1串口通信案例2数字电压计设计案例3信号发生器设计案例4基于SPI总线的电子时钟设计案例5调光控制系统项目四多路温湿度巡检仪学习内容:掌握单片机综合系统设计、制作、调试、维护方法,了解单片机在产品中的应用。(在proteus界面上仿真电路,完成C51程序的编制与功能调试。)任务一温度测控仪项目一LED电子显示屏学习内容:编译软件KEIL、仿真软件proteus的操作与联调;单片机端口应用;C51语言基本知识;了解常用芯片。(在proteus界面上仿真电路,完成C51程序的编制与功能调试。)案例一点亮一只LED案例二流水显示八只LED案例三32只彩灯多模式案例四LED点阵显示屏相关知识与实践Proteus软件
试一试Keilc软件
联调
案例一
案例二C51基本语法51单片机管脚
案例三_1流水灯(案例三_2)案例四-LED点阵小结
芯片资料
NOTEC语言与C51C51是以C语言作基础在结构上、定义及函数表达方式等是相同不同的地方51特殊之处(寄存器、位操作、数据分区等)C51基础知识运算符基本语句数据类型存储器类型基本结构重要库函数关键字与C语言基本相同:+-*/(加减乘除)>>=<<=(大于大于等于小于小于等于)==!=(测试等于测试不等于)&&||!(逻辑与逻辑或逻辑非)>><<(位右移位左移)&
|(按位与按位或)∧~(按位异或按位取反)C-51的运算符C-51的基本语句与标准C语言基本相同:break
退出最内层循环case
;switch语句中的选择项continue
转向下一次循环default
;switch语句中的失败选择项for
构成for循环结构goto
构成goto转移结构if
构成if..else选择结构return
函数返回while
构成while和do..while循环结构c51基本结构#include<reg51.h>
/*头文件说明部份*/
unsignedcharx1,x2;
/*全局变量声明部份*/
…Function1(…){
……}/*功能函数定义部份*/
main()
{
inti,j;
/*整型变量声明部份*/
Function1(…);
/*功能函数说明部份*/
……}#include<reg51.h>unsignedchari;voiddelay(){unsignedcharj,k;for(j=i;j>0;j--) for(k=250;k>0;k--);}voidmain(){unsignedchar
m,n;while(1){n=0x01; for(m=0;m<=7;m++){P1=~n;i=10; delay(); n=n<<1; }}}重要库函数1.专用寄存器include文件
例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。2.绝对地址include文件absacc.h
该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。3.动态内存分配函数,位于stdlib.h中4.缓冲区处理函数位于“string.h”中
其中包括拷贝比较移动等函数如:
memccpymemchrmemcmpmemcpymemmovememset。5.输入输出流函数,位于“stdio.h”中
流函数通过8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。6.本征库函数位于“intrins.h”中包含charintlong变量的左右移动,空操作,判位等。关键字_at_
为变量定义存储空间绝对地址
alien声明与PL/M51兼容的函数bdata
可位寻址的内部RAMbit
位类型
codeROMcompact使用外部分页RAM的存储模式data
直接寻址的内部RAMidata间接寻址的内部RAMinterrupt
中断服务函数
large使用外部RAM的存储模式pdata分页寻址的外部RAM_priority_RTX51的任务优先级reentrant可重入函数
sbit
声明可位寻址的特殊功能位
sfr8位的特殊功能寄存器
sfr1616位的特殊功能寄存器small内部RAM的存储模式_task_实时任务函数
using
选择工作寄存器组
xdata
外部RAMKEILuVision2C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char,int,short,long,float和double,在C51编译器中int和short相同,float和double相同,它们的具体定义见下表:C51的数据类型数据类型长度值域unsignedchar单字节0~255signedchar单字节-128~+127unsignedint双字节0~65535signedint双字节-32768~+32767unsignedlong四字节0~4294967295signedlong四字节-2147483648~+2147483647float四字节±1.175494E-38~±3.402823E+38*1~3字节对象的地址bit位0或1sfr单字节0~255sfr16双字节0~65535sbit位0或1从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。在51系列中data,idata,xdata的区别data:固定指前面0x00-0x7f的128个RAM,速度最快,生成的代码也最小。idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。xdata:外部扩展RAM,指外部0x0000-0xffff空间,用类似C中的指针方式访问或用绝对地址方式访问。存储器类型存储器类型说明data直接访问内部数据存储器(128字节),访问速度最快bdata可位寻址内部数据存储器(16字节),允许位与字节混合访问idata间接访问内部数据存储器(256字节),允许访问全部内部地址pdata分页访问外部数据存储器(256字节)xdata外部数据存储器(64KB)code程序存储器(64KB)Keil软件介绍启动界面点击Project菜单,选择弹出的下拉式菜单中的NewProject,如下图。接着弹出一个标准Windows文件对话窗口。选择所用的单片机类型新建文件“1”是新建文件的快捷按钮,在“2”中出现一个新的文字编辑窗口“3”是存盘的快捷按钮向项目中添加文件
1、2、3都是编译按钮。1是用于编译单个文件。2是编译当前项目(如果先前编译过一次之后文件没有编辑改动,不会再次重新编译的)。3是重新编译(每点击一次均会再次编译链接一次,不管程序是否有改动)。在3右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。4是信息窗口。5是包含了1、2、3。6是进入调试模式。图中1为运行,2为停止,3是复位,4是打开串行调试窗口,5是串行调试窗口。
1.Proteus的基本性能1)Proteus系统包括.ISIS.EXE(电路原理图设计.电路原理仿真)
ARES.EXE(印刷电路版设计)两个主要程序.其电路原理仿真功能,能用箭头与颜色表示电流的方向与大小,而且有多种带CPU的可编程序器件的仿真功能,不仅可作电路原理,模拟电路.数字电路实验,而且可作单片机与接口实验.2)Proteus的主界面可分为:
三大窗口:编辑窗口;器件工具窗口;浏缆窗口.
两大菜单:主菜单与辅助菜单(通用工具与专用工具菜单),其中主菜单有:
文件菜单
浏览菜单编辑菜单库操作菜单工具菜单设计菜单图形分析菜单源文件菜单调试菜单模板菜单系统菜单帮助菜单主菜单通用工具菜单Proteus的主界面简介专用工具菜单PCB电路电路编辑窗口坐标原点浏览窗口器件工具列表窗口仿真按键Proteus的主菜单简介点击主菜单主菜单编辑工具←点击鼠标:点击此键可取消左键的放置功能,但可编辑对象.←选择元器件:在元件表选中器件,在编辑窗中移动鼠标,点击左键放置器件.←标注联接点:当两条连线交叉时,放个接点表示连通.←标志网络线标号:电路联线可用网络标号代替,相同标号的线是相同的.←放置文本说明:是对电路的说明,与电路仿真无关!←放置总线:当多线并行简化联线,用总线标示.←放置子电路:可将部分电路以子电路形式画在另一图纸上.←放置器件引脚:有普通.反相.正时钟.反时钟.短引脚.总线←放置图纸内部终端:有普通.输入.输出.双向.电源.接地.总线.调试工具←放置分析图:有模拟.数字.混合.频率特性.传输特性.噪声分析等.←放置录音机:可录/放声音文件.←放置电源.信号源:有直流电源,正弦信号源,脉冲信号源等.←放置电压探针:显示网络线上的电压.←放置电流探针:串联在指定的网络线上,显示电流值.←放置虚拟仪器:有示波器.计数器.RS232终端.SPI调试器.I2C调试器.信号发生器.
图形发生器.直流电压表.直流电流表,交流电压表.交流电流表.图形工具←放置各种线:有器件.引脚.端口.图形线.总线等←放置矩形框:移动鼠标到框的一角,按下左键拖动,释放后完成.←放置圆形框:移动鼠标到圆心,按下左键拖动,释放后完成.←放置圆弧线:鼠标移到起点,按下左键拖动,释放后调整弧长,点击鼠标完成.←画闭合多边形:鼠标移到起点,点击产生折点,闭合后完成.←放置文字标签:在编辑框放置说明文本标签.←放置特殊图形:可在库中选择各种图形←放置特殊节点:可有原点.节点.标签引脚名.引脚号.Proteus选择图标简介Proteus元件库简介搜索关键词元件分类子分类厂商连接器.插头插座库→数据转换ADC.DAC→调试工具库→可编程逻辑器件→电阻→简单模拟器件→扬声器.音响器件→555←模拟集成电路库←电容库←CMOS4000库←二极管库←ECL1000库←电机库←电感库←拉普拉斯变换库←存储器库←微处理器库←混合类型库←简单模式库←运算放大库←光电器件库←开关和继电器←开关器件库←热电子器件库←晶体管库←晶体管库←TTL74系列库←TTL74LS系列库型号类型特性元件图形符号预览元件PCB封装预览确认键5552.电路原理图设计操作1)建立设计文件:打开ISIS系统,选择合适类型,确认建立无标题文件,并再存储时命名即可.2)按左键:放置对象(含元件.电源.仪表):①根据对象类别,选择相应模式图标;②根据对象具体类型,选择具体对象.--对象是元件要从元件库中确认调至器件窗口!!③改变元件方向,元件在预览/编辑窗口时,点击旋转键.④在编辑窗口点击左键,放置对象(元件).按右键:确定对象
--删除对象:对要删除对象双击右键;--拖动对象:对要拖动对象,按左键拖到目的地.3)编辑(修改)元件参数:
①按右键选中对象(元件),②按左键编辑(修改)元件参数.4)放置连线,建立电路图:①按左键点击第1个对象(元件),②再按左键点击第2个对象(元件),二者间就有自动连线了!画一画Keil与proteus联调注意问题1keil设置在出现的对话框里在右栏上部的下拉菜单里选中“ProteusVSMMonitor一51Driver”。并且还要点击一下“Use”前面表明选中的小圆点。再点击“Setting”按钮,设置通信接口,在“Host”后面添上“127.0.0.1”,如果使用的不是同一台电脑,则需要在这里添上另一台电脑的IP地址(另一台电脑也应安装Proteus)。在“Port”后面添加“8000”。设置好的情形如左图所示,点击“OK”按钮即可。最后将工程编译,进入调试状态,并运行。单击“Project菜单/OptionsforTarget”选项或者点击工具栏的“optionfortarget”按钮,弹出窗口,点击“Debug”按钮,出现如左图所示页面。
2proteus设置进入Proteus的ISIS,鼠标左键点击菜单“Debug”,选中“useromotedebugermonitor”,如图所示,便可实现KeilC与Proteus连接调试。Keil与proteus联调注意问题总线的概念总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。
总线是一种内部结构,它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。工作原理当总线空闲(其他器件都以高阻态形式连接在总线上)且一个器件要与目的器件通信时,发起通信的器件驱动总线,发出地址和数据。其他以高阻态形式连接在总线上的器件如果收到(或能够收到)与自己相符的地址信息后,即接收总线上的数据。发送器件完成通信,将总线让出(输出变为高阻态)。系统总线,即通常意义上的总线三种不同功能的总线,即数据总线DB(DataBus)、地址总线AB(AddressBus)和控制总线CB(ControlBus)。试一试(案例一)1在proteus上画出如下电路图.2在keil中写出如下程序,编译.3运行程序,观察电路中LED的变化.#include<reg51.h>#defineucharunsignedcharsbitP1_0=P1^0;voiddelay05(){uchari,j,k;for(i=5;i>0;i--)for(j=200;j>0;j--) for(k=250;k>0;k--);}voidmain(){while(1) { P1_0=0; delay05(); P1_0=1; delay05(); }}作业1完成单片机控制一只彩灯显示的电路控制原理图及相应驱动程序,并详细注释程序。2完成单片机控制八只彩灯显示的电路控制原理图及相应驱动程序,并详细注释程序。#include<reg51.h>#defineucharunsignedcharvoiddelay05(){uchari,j,k;for(i=5;i>0;i--)for(j=200;j>0;j--) for(k=250;k>0;k--);}voidmain(){ ucharm,n;while(1) { n=0x01; for(m=0;m<=7;m++){P2=~n; delay05(); n=n<<1;} }}试一试(案例二)1在proteus上画出如下电路图.2在keil中改变如下程序,变换显示模式.3运行程序,观察电路中LED的变化.单片机管脚双向三态输入输出端口。P0口身兼两职,既可作为地址总线(A0-A7),也可作为数据总线(D0-D7)。作为通用I/O时,是一个漏极开路电路。需外接上拉电阻。作为地址/数据总线使用时,不需处接上拉电阻。并行输入和输出端口P0P1口结构:P1口为8位准双向输入输出端口。P2口结构
P2口作为通用I/O时,准双向输入输出端口。
P2口作为高8位地址总线,A8-A15。
P2口与P0一起构成单片机与外电路相连接的扩展端口。通常可以用来扩展存储器、及与其它总线型连接方式的外设。P3口结构P3口作为通用I/O时,为准双向输入输出端口。
P3口的第二功能。
·P3.0
串行输入口(RXD)·P3.1
串行输出口(TXD)·P3.2外中断0(INT0)·P3.3外中断1(INT1)·P3.4定时/计数器0的外部输入口(T0)·P3.5定时/计数器1的外部输入口(T1)·P3.6外部数据存储器写选通(WR)·P3.7外部数据存储器读选通(RD)试一试(案例三_1)1在proteus上画出如下电路图.2在keil中编制程序,要求能变换显示模式.3运行程序,观察电路中LED的变化.(WR与ALE)扩展LED编程程序参考锁存器74LS3738D锁存器8输入:1D~8D8输出:1O~8O输入允许端:OE(1)输出预选端:G(11)74LS373电平触发,锁存缓冲74LS374上升沿触发74LS273无三态门,用于只需 输不需三态场合74LS1383-8译码器74LS2448路单向数据缓冲器74LS2458路双向数据缓冲器缓冲器:无锁存功能,在外设和CPU之间起缓冲驱动和隔离作用。总线缓冲器具有三态功能。锁存器:除具有缓冲功能外还有数据锁存记忆功能。芯片资料74LS373的真值表
H为高电平,L为低电平,Q0为原状态,Z为高阻抗,×为任意值。
74LS373锁存器主要用于锁存信息。 常用的锁存器还有74LS374,573,574,Intel8282和8283等使能LE(11)输出允许OE(1)输入输出HLLLHLHHLL×Q0×H×Z74LS138真值表LLLLLLLLCAB74LS2458路双向数据缓冲器8输入:A1~A8 8输出:B1~B8允许端:G 方向端:DIRGDIR功能00AB01BA1ⅹ高阻A B ALE与WRvoidmain(){unsignedcharxdata*ledaddr;ledaddr=0x1234;while(1) { *ledaddr=0x56; }}指针是一个与地址相关的复合类型,它的值是数据存放的位置(地址)ALE与WR扩展LED实验74LS373观察图,思考1两片74LS373的地址.2如何编程对应如图LED显示.带扩展的彩灯程序参考#include<reg51.h>unsignedcharxdata*LEDAD;//彩灯地址unsignedcharLEDDATA;//显示模式unsignedcharI;//循环次数voidDelay(unsignedintk)//12M晶振,k*1ms{unsignedintm,j;for(m=0;m<k;m++)//注意,此处无符号for(j=0;j<121;j++);}voidmain(void){LEDAD=0X7800;//指向地址为何地址是0x78LEDDATA=0Xee;//初始化LED,只亮1只,低电平点亮I=8;//8个LED*LEDAD=0Xff;//LED全灭while(I){*LEDAD=LEDDATA;I--;LEDDATA=LEDDATA>>1;Delay(500);}}项目任务要求:请详细说明每一句功能32只LED实验74LS373观察图,思考1两片74LS373的地址.2如何编程对应如图LED显示3如何实现32只彩灯流水显示.Y0->001111100X3EY1->110001010XC5Y2->100101010X95Y3->101100010XB1Y4->0XB1Y5->0X95Y6->0XC5Y7->0X3E74LS138->Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7若1:将LED负端按列分别与P1管脚相连,如何编程若2:Y0-Y7同位端均连P0的同位管脚,如何编程提示:利用视觉暂留效果)案例四LED点阵显示编程实现LED图像显示并注释程序。参考程序见书小结硬件单片机(管脚应用)、最小系统电路、彩灯控制电路、扩展彩灯控制电路(74ls373,74ls138)软件
proteuskeilcc51编程项目二定时开关控制器
学习内容:动态、静态数码结构、特点与控制;独立、矩阵键盘结构、特点与识别。(在proteus界面上仿真电路,完成C51程序的编制与功能调试。)案例1数码静态显示案例2数码动态显示案例3独立键盘案例4
0-9键控秒表案例5行列键盘案例6
99-00键控倒计时秒表案例7定时开关控制器(中断)相关知识与实践一、显示
1、基础知识
2、静态显示案例一
3、动态显示案例二二、按键
1、键盘接口
2、独立按键案例三、四
3、行列按键案例五、六三、单片机应用
1、数组
2、中断
3、定时器4、案例七四、拓展部分
51单片机常识
辅助任务
难点、问题分析
小结难点、问题分析1、数组2、地址的形成3、特殊功能寄存器(SFR)4、中断(定时器)
八段LED显示块基础知识--数码显示共阴结构共阳结构基础知识--数码显示共阴数码:假定Px.0-a,Px.1-b,Px.2-c,Px.3-d,Px.4-e,Px.5-f,Px.6-g,Px.7-dp则从Px口,送0x3f,显示0,送0x06,显示1
送0x5b,显示2,送0x4f,显示3
送0x66,显示4,送0x6d,显示5
送0x7d,显示6,送0x07,显示7
送0x7f,显示8,送0x6f,显示9
N位LED显示器基础知识--数码显示
四位静态LED显示器电路静态数码显示每一个数码管的显示笔画都要占用单独的具有锁存功能的I/O接口。即需N×8个I/O控制线静态显示技术静态显示数码管相应笔段一直处于点亮状态,因此功耗大,而且占用硬件资源多,几乎只能用在显示位数极少的场合。优点:LED亮度高,可用在室外显示场合。程序工作量小。例如:静态显示技术案例一显示601111101P2=0X7DDPabcdefg1在proteus上画出如下电路图.2在keil中编制程序,要求能显示学号最后4位数.3运行程序,观察电路中数码管显示.#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D;voidmain(){ Led_D=0x0800;*Led_D=0x6f;//9
Led_D=0x0900;*Led_D=0x5b;//2Led_D=0x0a00;*Led_D=0x06;//1Led_D=0x0b00;*Led_D=0x3f;//0
while(1);}
八位LED动态显示器电路
动态数码显示所有数码管的8个笔画段同名端连在一起,公共端各自独立。即需N+8个I/O控制线动态显示技术动态显示是多只数码管共享段码线,通过位选线(公共端)逐位逐位分时进行扫描显示(任时刻只有一只点亮)。其优点是占用硬件资源少,功耗小。软件工作量大.
必须注意:扫描周期必须控制在视觉停顿时间内,一般在20ms以内,否则会出现闪烁或跳动现象。最为广泛的一种显示方式。动态显示技术_案例二首先扫描最后扫描1在proteus上画出如下电路图.2在keil中编制程序,要求能显示学号最后8位数.3运行程序,观察电路中数码管显示.(注意:换位前先清段码)#include<reg51.h>#defineucharunsignedcharvoiddelay(){ uchari; for(i=0;i<100;i++);}voidmain(){ while(1) {P2=0Xfe;P0=0X7f;delay();//8
P2=0Xfd;P0=0X06;delay();//1P2=0Xfb;P0=0X5b;delay();//2P2=0Xf7;P0=0X4f;delay();//3P2=0Xef;P0=0X66;delay();//4P2=0Xdf;P0=0X6d;delay();//5P2=0Xbf;P0=0X7d;delay();//6P2=0X7f;P0=0X07;delay();//7}}P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;P0=0X00;消除拖尾重影现象#include<reg52.h>#defineucharunsignedcharcodeuchardisplay[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};voiddelay(){ uchari; for(i=0;i<100;i++);}voidmain(){ while(1) {P2=Tab[7];P0=display[8];delay();//8
P2=Tab[6];P0=display[1];delay();//1P2=Tab[5];P0=display[2];delay();//2P2=Tab[4];P0=display[3];delay();//3P2=Tab[3];P0=display[4];delay();//4P2=Tab[2];P0=display[5];delay();//5P2=Tab[1];P0=display[6];delay();//6P2=Tab[0];P0=display[7];delay();//7
}}P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];P0=display[10];使用数组1在proteus上画出如下电路图.2在keil中编制程序,要求能显示学号最后8位数.3运行程序,观察电路中数码管显示.(注意:换位前先清段码)#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x0};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];//数组长度要给出voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){*Led_D=0;*Led_W=Tab[i];*Led_D=led[i];delay();}voidmain(){ led[0]=display[0];led[1]=display[1];led[2]=display[2];led[3]=display[3];led[4]=display[4];led[5]=display[5]; led[6]=display[6];led[7]=display[7];
while(1){display(); }}辅助任务一设计两位数的十进制减法显示电路原理图并编制程序.二设计电子时钟显示(时-分-秒)电路原理图并编制程序.三设计用数码显示8只LED循环次数,显示的范围为0-99.减法运算显示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;
ucharled[8];//数组长度要给出voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){ *Led_D=0; *Led_W=Tab[i];*Led_D=led[i]; delay(); }}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y; *Led_D=0; *Led_W=0xff; led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10];bzie=0;} display(); }}X-Y=Z显示#include<reg52.h>#include<absacc.h>#defineucharunsignedchar#defineLed_DXBYTE[0xc000]#defineLed_WXBYTE[0xc800]ucharcodedisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};ucharcodeTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];bitbzie=1;voiddelay(){ uchari; for(i=0;i<100;i++);}voiddisplay(){ inti;for(i=0;i<8;i++){ Led_D=0; Led_W=Tab[i];Led_D=led[i]; delay(); }}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y;
Led_D=0; Led_W=0xff; led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10]; bzie=0; } display(); }}X-Y=Z显示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;inti;ucharled[8];
voiddisplay()interrupt1{ TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;
if(i==8)i=0;*Led_D=0; *Led_W=Tab[i];*Led_D=led[i];i++;}voidmain(){ unsignedintX=98,Y=56,Z;Z=X-Y;
TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;//1ms时间间隔不能长
i=0;IE=0x82;TMOD=0x01;TCON=0x10;led[2]=display_code[10];led[5]=display_code[11]; while(1) { if(bzie){ led[0]=display_code[X/10];led[1]=display_code[X%10]; led[3]=display_code[Y/10];led[4]=display_code[Y%10]; led[6]=display_code[Z/10];led[7]=display_code[Z%10];bzie=0;} }}X-Y=Z显示时钟显示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;
unsignedintx=0;ucharled[8];//数组长度要给出voiddelay(){ uchari; for(i=0;i<100;i++);if((++x)==1000){x=0;bzie=1;}}voiddisplay(){ inti;for(i=0;i<8;i++){*Led_D=0; *Led_W=Tab[i];*Led_D=led[i]; delay(); }}voidmain(){ unsignedinthour=0,mit=0,sec=0; *Led_D=0; *Led_W=0xff; led[2]=display_code[10];led[5]=display_code[10]; while(1){ if(bzie){
if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}} led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10];bzie=0;} display(); }}时分秒显示#include<reg52.h>#include<absacc.h>#defineucharunsignedchar#defineLed_DXBYTE[0xc000]#defineLed_WXBYTE[0xc800]ucharcodedisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};ucharcodeTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};ucharled[8];bitbzie=1;unsignedintx=0;
voiddelay(){ uchari; for(i=0;i<100;i++);if((++x)==1000){x=0;bzie=1;}}voiddisplay(){ inti;for(i=0;i<8;i++){ Led_D=0; Led_W=Tab[i];Led_D=led[i]; delay(); }}voidmain(){ unsignedinthour=0,mit=0,sec=0;
Led_D=0; Led_W=0xff; led[2]=display_code[10];led[5]=display_code[10]; while(1){ if(bzie){
if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}}
led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10]; bzie=0; } display(); }}时分秒显示#include<reg52.h>#defineucharunsignedcharucharxdata*Led_D=0xc000;ucharxdata*Led_W=0xc800;codeuchardisplay_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x48};codeucharTab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};bitbzie=1;inti;ucharled[8];unsignedintx=0;
voiddisplay()interrupt1{ TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;
if(i==8)i=0;*Led_D=0; *Led_W=Tab[i];*Led_D=led[i];i++;if((++x)==1000){x=0;bzie=1;}}voidmain(){ unsignedinthour=0,mit=0,sec=0;
TH0=(256*256-1*f/12000)/256;TL0=(256*256-1*f/12000)%256;//1ms,时间间隔不能长
i=0;IE=0x82;TMOD=0x01;TCON=0x10;led[2]=display_code[10];led[5]=display_code[10]; while(1) {if(bzie){
if((++sec)>=60){sec=0;if((++mit)>=60){mit=0;if((++hour)>=24)hour=0;}}
led[0]=display_code[hour/10];led[1]=display_code[hour%10]; led[3]=display_code[mit/10];led[4]=display_code[mit%10]; led[6]=display_code[sec/10];led[7]=display_code[sec%10];bzie=0;} }}时分秒显示根据实验电路图.在keil中编制程序,实现数码管显示LED循环点亮的次数.数组概念数组的本质则是一系列的数据元素(变量)。该数组中若干个元素必须是同一个类的。对象数组的定义、赋值和引用和普通数组相同。
1.数组的定义
数组定义格式如下:
<类名><数组名>[<大小>]...
其中,<类名>指出该数组元素是属于该类的对象,方括号内的<大小>给出某一维的元素个数。一维对象数组只有一个方括号,二维对象数组要有两个方括号,等等,例如:datadates[7];
表明dates是一维对象数组名,该数组有7个元素,每个元素都是类data的对象。
2.对象数组的赋值
对象数组能够被赋初值,也能在程序中被赋值(除code类)。例如codeadd[3]={0x3f,0x06,0x4f};数组应用(查表程序)codeunsignedcharLEDMAP[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchari;unsignedcharLED;………….LED=LEDMAP[i];//i取值0-15或16进制0-F键盘接口技术1、键盘消抖2、键盘形式键盘消抖软件去抖动
前沿抖动稳定后沿抖动
按键抖动信号波形即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。键盘消抖硬件消抖:如RC滤波电路键盘消抖硬件消抖:如双稳态电路:RS触发器为常用的硬件消抖电路。CD2、键盘的形式键盘的形式有以下两种:独立式键盘行列式键盘独立式键盘结构每一个按键的电路是独立的,占用一条I/O数据线1在proteus上画出如下电路图.2在keil中编制程序,要求能显示按键数值.3运行程序,观察电路中数码管显示.4用本图实现键控0-9秒表程序案例三、四
if((P1=P1|0x55)!=0xff){delay();if((P1=P1|0x55)==0xfd)*pled=0x06;if((P1=P1|0x55)==0xf7)*pled=0x5b;if((P1=P1|0x55)==0xdf)*pled=0x4f;if((P1=P1|0x55)==0x7f)*pled=0x66;}1在proteus上画出如下电路图.2在keil中编制程序,要求能显示按键数值.3运行程序,观察电路中数码管显示.拓展题行列式键盘结构每一个按键的电路是由行列组成,每一个按键占用两条I/O数据线。当键盘按下时,相应的行列线呈现短路。求键的位置(行、列)若D1=0,则D5=0假定S6按下求键的位置(行、列)假定S7按下若D1=0,则D5=?只有D2=0,则D5=0行列式键盘的工作原理扫描原理:首先确定是否有键闭合(消抖,再判)然后逐一扫描以进一步确定是哪一键闭合
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国纯棉内衣市场运营状况及发展前景分析报告
- 2025-2030年中国离合器制造行业十三五规划与投资战略研究报告
- 2025-2030年中国盆景行业竞争状况规划研究报告
- 二年级数学下册教案-7 角的初步认识(46)-苏教版
- Unit 5 Section B 3a - selfcheck 教学设计 2024-2025学年人教版八年级英语下册
- 3-复式统计表-人教版三年级数学下册单元测试卷(含答案)
- 2024年折射仪项目资金筹措计划书代可行性研究报告
- 2025年安全员C证(专职安全员)考试题库
- 2024年包装检测仪器项目投资申请报告代可行性研究报告
- 2025年甘肃卫生职业学院单招职业适应性测试题库汇编
- 地理-天一大联考2025届高三四省联考(陕晋青宁)试题和解析
- 部编版小学五年级下册《道德与法治》全册教案含教学计划
- 运动会活动流程中的医疗安全保障措施
- 2025公司员工试用期合同(范本)
- GB/T 19342-2024手动牙刷一般要求和检测方法
- 2024年山东铁投集团招聘笔试参考题库含答案解析
- 计价格(2002)10号文
- 青果巷历史街区改造案例分析
- 桩身强度自动验算表格Excel
- 《钢铁是怎样炼成的》读书报告
- 净土资粮——信愿行(11)第六讲净业三福变化气质
评论
0/150
提交评论