首页资源分类电子电路电路仿真 > 简单实例助你快速掌握PROTEUS的用法

简单实例助你快速掌握PROTEUS的用法

已有 445109个资源

下载专区

电子电路热门资源

本周本月全部

文档信息举报收藏

标    签:proteus

分    享:

文档简介

简单实例助你快速掌握PROTEUS的用法

文档预览

 子情境1:简单实例助你快速掌握PROTEUS的用法 1 子情境二:用发光二极管实现流水灯乒乓球效果 16 子情境1:简单实例助你快速掌握PROTEUS的用法 为了更快掌握PROTEUS设计与仿真操作,我们先从一简单实例入手带你入门。 让我们首先来熟悉一下仿真软件的主界面: 图5-1 仿真软件的主界面 运行protues的ISIS模块,进入仿真软件的主界面,如图5-1所示,区域①为菜单及工具栏,区域②为元器件预览区,区域③为对象选择器窗口,区域④为编辑窗口,区域⑤为绘图工具栏,区域⑥为元器件调整工具栏,区域⑦为运行工具条。 Proteus是一种集单片机仿真和SPICE分析于一身的仿真软件。其功能非常强大,不仅能仿真模拟电路、数字电路以及模拟数字混合电路,更重要的是可以仿真51系列、AVR、PIC等常用主流单片机。 Protues提供了丰富的资源: (1)Proteus拥有的元器件资源:Proteus可提供30多种元件库,超过8000种模拟、数字元器件。 (2)Proteus可提供的仿真仪表资源 :仿真仪器仪表的数量、类型和质量是衡量仿真实验室是否合格的一个关键因素。Proteus可提供常用的示波器(本文的实例中示波器被用来观察产生的波形)、逻辑分析仪、虚拟终端、SPI调试器、I2C调试器、信号发生器、模式发生器、交直流电压表、交直流电流表。 以下简要罗列了proteus中常用元器件和仿真仪表中英文对照表: 7407 驱动门   1N914 二极管   74Ls00 与非门  74LS04 非门 74LS08 与门   74LS390 TTL 双十进制计数器  7SEG 4针BCD-LED 输出从0-9 对应于4根线的BCD码 7SEG 3-8译码器电路BCD-7SEG转换电路     AND 与门   BATTERY 电池/电池组   BUS 总线   CAP 电容   CAPACITOR 电容器   CLOCK 时钟信号源   CRYSTAL 晶振   FUSE 保险丝   GROUND 地   LAMP 灯   LED-RED 红色发光二极管   LM016L 2行16列液晶可显示2行16列英文字符,有8位数据总线D0-D7,RS,R/W,EN三个控制端口(共14线),工作电压为5V。 LOGIC ANALYSER 逻辑分析器   LOGICPROBE 逻辑探针   LOGICPROBE[BIG] 逻辑探针 用来显示连接位置的逻辑状态 LOGICSTATE 逻辑状态 用鼠标点击,可改变该方框连接位置的逻辑状态 LOGICTOGGLE 逻辑触发   MOTOR 马达   OR 或门  POT-LIN 三引线可变电阻器 POWER 电源 RES 电阻  RESISTOR 电阻器   SWITCH 按钮 手动按一下一个状态 VOLTMETER 伏特计  VOLTMETER-MILLI mV伏特计 VTERM 串行口终端   Electromechanical 电机  Inductors 变压器   Laplace Primitives 拉普拉斯变换 Miscellaneous 各种器件 AERIAL-天线;ATAHDD;ATMEGA64;BATTERY;CELL;CRYSTAL-晶振;FUSE;METER-仪表; Optoelectronics 各种发光器件 发光二极管,LED,液晶等等 Resistors 各种电阻   Simulator Primitives 常用的器件   Speakers & Sounders  扬声器 Switches & Relays 开关,继电器,键盘 Transistors 晶体管(三极管,场效应管) TTL 74 series  TTL 74ALS series  TTL 74AS series  TTL 74F series  TTL 74HC series  TTL 74HCT series  TTL 74LS series  TTL 74S series  此 模拟电路集成芯片  Capacitors 电容集合  Connectors 排座,排插  Data Converters ADC,DAC Debugging Tools 调试工具   下面开始我们的第一个任务: 1.1 子情境内容:让单片机动起来,用单片机控制一个LED灯闪烁发光。 用P1口的第一个引脚控制一个LED灯, 1秒钟闪烁一次。 1.2 子情境目标: 通过此子情境的练习,快速掌握PROTEUS的基本用法 1.3 子情境步骤 1.3.1步骤一: PROTEUS电路设计 整个设计都是在ISIS编辑区中完成的。 (1)单击工具栏上的“新建”按钮,新建一个设计文档。单击“保存”按钮,弹出如图5-2所示的“Save ISIS Designe File”对话框,在文件名框中输入“LED”(简单实例的文件名),再单击“保存”按钮,完成新建设计文件操作,其后缀名自动为.DSN。 图5-2保存ISIS设计文件 (2)选取元器件 此简单实例需要如下元器件: 单片机:AT89C51 发光二极管:LED-RED 瓷片电容:CAP* 电阻:RES* 晶振:CRYSTAL 按钮:BUTTON 单击图5-3中的“P”按钮,弹出如图5-4所示的选取元器件对话框,在此对话框左上角“keywords(关键词)”一栏中输入元器件名称,如“AT89C52”,系统在对象库中进行搜索查找,并将与关键词匹配的元器件显示在“Results”中。在“Results”栏中的列表项中,双击“AT89C51”,则可将“AT89C52”添加至对象选择器窗口。按照此方法完成其它元器件的选取,如果忘记关键词的完整写法,可以用“*”代替,如“CRY*”可以找到晶振。被选取的元器件都加入到ISIS对象选择器中。如图5-5所示。 图5-3单击“P”按钮选取元器件 图5-4选取元器件窗口 图5-5选取元器件均加入到ISIS对象选择器中 (3)放置元器件至图形编辑窗口 在对象选择器窗口中,选中AT89C51,将鼠标置于图形编辑窗口该对象的欲放置的位置、单击鼠标左键,该对象被完成放置。同理,将BUTTON、RES等放置到图形编辑窗口中。如图5-6所示。 若元器件方向需要调整,先在ISIS对象选择器窗口中单击选中该元器件,再单击工具栏上相应的转向按钮,把元器件旋转到合适的方向后再将其放置于图形编辑窗口。 若对象位置需要移动,将鼠标移到该对象上,单击鼠标右键,此时我们已经注意到,该对象的颜色已变至红色,表明该对象已被选中,按下鼠标左键,拖动鼠标,将对象移至新位置后,松开鼠标,完成移动操作。 通过一系列的移动、旋转、放置等操作,将元器件放在ISIS编辑窗口中合适的位置。如图5-6所示。 (4)放置终端(电源、地) 放置电源操作:单击工具栏中的终端按钮,在对象选择器窗口中选择“POWER”如图5-7所示,再在编辑区中要放电源的位置单击完成。放置地(GROUND)的操作与此类似。 图5-6各元器件放在ISIS编辑窗口中合适的位置 图5-7放置终端符号 (5)元器件之间的连线 Proteus的智能化可以在你想要画线的时候进行自动检测。下面,我们来操作将电阻R1的右端连接到LED显示器的左端,如图5-6所示。当鼠标的指针靠近R1右端的连接点时,跟着鼠标的指针就会出现一个“□”号,表明找到了R1的连接点,单击鼠标左键,移动鼠标(不用拖动鼠标),将鼠标的指针靠近LED的左端的连接点时,跟着鼠标的指针就会出现一个“□”号,表明找到了LED显示器的连接点,单击鼠标左键完成电阻R1和LED的连线。 Proteus具有线路自动路径功能(简称WAR),当选中两个连接点后,WAR将选择一个合适的路径连线。WAR可通过使用标准工具栏里的“WAR”命令按钮来关闭或打开,也可以在菜单栏的“Tools”下找到这个图标。 同理,我们可以完成其它连线。在此过程的任何时刻,都可以按ESC键或者单击鼠标的右键来放弃画线。 (6)修改、设置元器件的属性 PROTEUS库中的元器件都有相应的属性,要设置修改元器件的属性,只需要双击ISIS编辑区中的该元器件。例如,发光二极管的限流电阻R1,双击它弹出如图5-7所示的属性窗口,在窗口中已经将电阻的阻值修改为330欧姆。图5-9是编辑完成的“简单实例”的电路。 图5-8设置限流电阻阻值为330欧姆 图5-9编辑完成的简单实例的电路图 1.3.2步骤二:源程序设计与生成目标代码文件 (1)程序流程图 图5-10 发光二极管闪烁的流程图 (2)源程序设计 将放光二极管闪烁的程序保存在文件FLASH_LED.C中,在keil中编译生成目标代码文件,本例为FLASH_LED.HEX。 #include //头文件 #define uint unsigned int //宏定义 sbit D1=P1^0; //声明单片机P1口的第一位 void delay(uint z); //声明子函数 void main() { while(1) //大循环 { D1=0; //点亮第一个发光二极管 delay(500); //延时500毫秒 D1=1; //关闭第一个发光二极管 delay(500); //延时500毫秒 } } void delay(uint z) //延时子程序延时约z毫秒 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 1.3.3 步骤三:PROTEUS仿真 (1)加载目标代码文件 双击编辑窗口的AT89C52器件,在弹出如图5—11所示属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到FLASH_LED.HEX文件,单击“打开”按钮,完成添加文件。在Clock frequency栏中把频率设置为12MHZ,仿真系统则以12MHZ的时钟频率运行。因为单片机运行的时钟频率以属性设置中的“Clock frequency”为准,所以在编辑区设计MCS-51系列单片机系统电路时,可以略去单片机振荡电路,并且复位电路也可以略去。所以从子情境三开始就将振荡电路和复位电路省略。 图5-11加载目标代码文件窗口 (2)仿真 单击按钮,启动仿真,仿真运行片段如图5-12所示。发光二极管间隔500毫秒闪烁。 图5—12仿真运行片段 红色方块代表低电平,蓝色方块代表高电平,灰色方块代表不确定电平 1.4 扩展练习 改成让P1.1口控制LED灯1秒钟闪烁一次。 子情境二:用发光二极管实现流水灯乒乓球效果 2.1 子情境目标: (1)通过AT89C52单片机控制8个发光二极管,实现亮点由低位到高位再由高位到低位来回流动的乒乓球效果 (2)用PROTEUS设计、仿真以AT89C52为核心的放光二极管流水灯电路。 (3)掌握发光二极管的控制方法 2.2 子情境步骤 2.2.1 步骤一: PROTEUS电路设计 (1)选取元器件:按快捷键“P”按钮,打开元器件选择窗口。在关键词栏中输入元器件的关键词,选取需要的元器件。 ①单片机:AT89C52 ②电阻、8排阻:RES* ③红色发光二极管:LED-RED ④瓷片电容:CAP* ⑤晶振:CRYSTAL (2)放置元器件:在对象选择器中单击选中AT89C52,在编辑区中合适的位置单击,器件AT89C52就被放置到编辑区中。如果要改变元器件的放置方向,先在ISIS对象选择器中单击选中该元器件,再单击工具栏上相应的转向按钮,把元器件旋转到合适的方向后再将其放置于图形编辑窗口。 (3)放置终端(电源、地) 放置电源操作:单击工具栏中的终端按钮,在对象选择器窗口中选择“POWER”,再在编辑区中要放电源的位置单击完成。放置地(GROUND)的操作与此类似。 (4)元器件之间的连线 因为ISIS的智能化程度很高,只要单击所要连线的起点和终点。例如元器件的引脚、终端等,在这两点间会自动生成一条线。若要画折线,只要在转折点单击;若中途想取消连线,右击即可。 (5)元器件属性设置 PROTEUS库中的元器件都有相应的属性,要设置修改元器件的属性,只需要双击ISIS编辑区中的该元器件。设置好的原理图如图5-13所示。 图5-13流水灯乒乓效果原理图 2.2.2步骤二:源程序设计与目标代码文件生成 (1)程序流程图 (2)源程序设计 #include //52系列单片机头文件 #include //包含_crol_(循环左移)函数所在的头文件 void delay(int z); //声明子函数 unsigned char temp; //定义一个变量,用来给P1口赋值 int i,j; void main() { temp=0xfe; //赋初值11111110 P1=temp; //先点亮第一个发光二极管 while(1) //大循环 { for(i=7;i>0;i--) //控制亮点从低位往高位移动7次 { delay(500); //延时500毫秒 temp=_crol_(temp,1); //将temp循环左移一位后再赋给temp P1=temp; //将移位后的值赋给P1口,从低位到高位逐个点亮发光二极管 } for(j=7;j>0;j--) //控制亮点从高位往低位移动7次 { delay(500); //延时500毫秒 temp=_cror_(temp,1); //将temp循环右移一位后再赋给temp P1=temp; //将移位后的值赋给P1口,从高位到地位逐个点亮发光二极管 } } } void delay(int z) { unsigned int x,y; for(x=z;x>0;x--) //延时z毫秒 for(y=110;y>0;y--); } (2)生成目标代码文件 在KEIL软件中,编译C语言源程序,生成目标代码文件,本例中为pingpang.hex。 2.2.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到pingpang.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图5-15所示。通过AT89C52单片机控制8个发光二极管,实现亮点由低位到高位再由高位到低位来回流动的乒乓球效果。 图5-15流水灯乒乓效果运行片段 2.4 扩展练习 此子情境中流水灯在同一时刻只显示一盏灯,现在完成同时亮着两个灯流动的效果。 子情境三:数码管动态扫描 3.1子情境内容:利用动态扫描让四位数码管稳定的显示1234。 3.2 子情境目标: (1)掌握单片机控制四位数码管的动态扫描技术,包括程序设计和电 路设计,本任务的效果是让四位数码管稳定的显示1234。 (2)用PROTEUS进行电路设计和实时仿真 3.3 知识点链接 (1)数码管动态扫描 (动态扫描的定义以及与静态显示的区别) 动态显示的特点是将所有位数码管的段选线s一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。 (2)总线的应用 元器件与总线的连线 P0口的接线采用总线方式,详细如图5-17所示。 1 选择总线按钮 2 绘制总线:与普通电线的绘制方法一样,选择合适的起点、终点单击。 如果终点在空白处,左键双击结束连线。 画总线的时候为了和一般的导线区分,我们一般喜欢画斜线来表示分支线。此时我们需要自己决定走线路径,只需在想要拐点处单击鼠标左键即可。在画斜线时,需要关闭线路自动路径功能才好绘制。 Proteus的线路自动路径功能简称WAR,当选中两个连接点后,WAR将选择一个合适的路径连线。WAR可通过使用标准工具栏里的“WAR”命令按钮来关闭或打开,也可以在菜单栏的“Tools”下找到这个图标。 3 给与总线连接的导线贴标签PART LABELS 与P0口相连的线标签名依次为P00—P06,本电路中的P0口的上拉电阻通过总线与P0口相连,数码管也是通过总线与P0口相连,这些都需要标注,以表明正确的电气连接。单击绘图工具栏中的导线标签按钮,使之处于选中状态。将鼠标置于图形编辑窗口的欲标标签的导线上,跟着鼠标的指针就会出现一个“×”号,表明找到了可以标注的导线,单击鼠标左键,弹出编辑导线标签窗口,如图5-16所示。 在“string”栏中,输入标签名称(如p00),单击“OK”按钮,结束对该导线的标签标定。同理,可以标注其它导线的标签,如图5-16所示。 注意,在标定导线标签的过程中,相互接通的导线必须标注相同的标签名。 图5-16编辑导线标签窗口 3.4 任务步骤 3.4.1 步骤一:PROTEUS电路设计,单片机控制四位共阴极数码管动态扫描显示的原理图如图5-17所示。 图5-17 四位共阴极数码管动态扫描显示的原理图 1、选取元器件 ①单片机:AT89C52 ②带公共端的排阻:RESPACK-8 ③四位共阴极数码管:7SEG-MPX4-CC 2、放置元器件、放置电源和地、连线、元器件属性设置 数码管动态扫描显示的原理图如图5-17所示,整个电路设计操作都在ISIS平台中进行。 (1)带公共端的排阻(RESPACK-8)如图5-18所示,在本电路中作为P0的 上拉电阻,在如图5-19所示Component Value一栏中可更改阻值,例如本例中将阻值更改为200欧姆。 图5-18排阻 图5-19排阻属性框 至此,我们便完成了整个电路图的绘制。 3.4.2 步骤二:源程序设计与目标代码文件生成 (1)程序流程图 图5-20 数码管动态扫描的流程图 (2)源程序设计 #include //52系列单片机头文件 #define uchar unsigned char #define uint unsigned int uint x,y; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //共阴极数码管编码 void display(uchar,uchar,uchar,uchar); //声明子函数 void delay(int); //声明子函数 void main() { while(1) { display(1,2,3,4); //主程序始终调用数码管显示子程序 } } void display(uchar a,uchar b,uchar c,uchar d) { P2=0xef; P0=table[a]; //给第一个数码管送"a" delay(1); //延时1ms P2=0xdf; P0=table[b]; //给第二个数码管送"b" delay(1); //延时1ms P2=0xbf; P0=table[c]; //给第三个数码管送"c" delay(1); //延时1ms P2=0x7f; P0=table[d]; //给第三个数码管送"d" delay(1); //延时1ms } void delay(uint z) //延时子函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } (2)生成目标代码文件 在KEIL软件中,编译C语言源程序,生成目标代码文件,本例中为dongtai.hex。 3.4.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到dongtai.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图5-21所示。通过AT89C52单片机控制四位数码管,实现让四位数码管稳定的显示“1234”的效果。 图5-21数码管动态扫描显示“1234” 3.5 扩展练习 本子情境中单片机趋动的是共阴极的数码管,请使用四位共阳极的数码管重新设计和仿真。 子情境四:定时/计数器的使用——方波发生器 4.1子情境内容:用AT89C51单片机定时/计数器0的定时功能可构成一简单的方波发生器,实现周期为2s的方波,并能在虚拟示波器上直观地显示波形。 4.2 子情境目标: (1)通过用AT89C52单片机定时/计数器0的定时功能构成一简单的方波发生器,掌握定时器的基本用法。 (2)用PROTEUS进行电路设计和实时仿真 (3)学会使用虚拟示波器观察波形 4.3 知识点链接 虚拟示波器的基本操作: 单击工具栏中的按钮(虚拟仪器),在对象选择器列表中选择OSCILLOSCOPE(示波器),在ISIS编辑窗口中合适位置单击就可以将示波器放置好了。最后将单片机的P1.0口与示波器的A通道相连,如图5-22所示。 4.4 任务步骤 4.4.1 步骤一:PROTEUS电路设计,实现周期为2s的方波的原理图如图5-22所示。 图5-22 方波发生器原理图 1、选取元器件 ①单片机:AT89C52 ②电阻:RES ③LED发光二极管:LED-RED 2、放置元器件、放置电源和地、连线、元器件属性设置 方波发生器的原理图如图5-22所示,整个电路设计操作都在ISIS平台中进行。与子情景3相似,故不详述。 (1)程序流程图 图5-23 方波发生器的流程图 (2)源程序设计 #include #define uchar unsigned char #define uint unsigned int sbit D1=P1^0; uchar aa; void main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; //定时50ms中断一次 EA=1; //开总中断 ET0=1; //允许定时器T0中断 TR0=1; //起动定时器开始工作 D1=1; //让LED灯初始时处在熄灭状态 while(1); //等待中断产生 } void my_timer0() interrupt 1 //中断服务程序 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; //重新赋初值 aa++; //中断一次变量aa加1 if(aa==20) //当aa=20时中断了20次,定时时间为20*50ms=1s,更改一次P1.0口的输出状态,这样得到的方波周期为2s { aa=0; //将变量aa清零,以便于下次重新定时 D1=~D1; //改变引脚P1.0的输出状态 } } 4.4.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到fangbo.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图5-24所示。用AT89C51单片机定时/计数器0的定时功能可构成一简单的方波发生器,实现周期为2s的方波,并能在虚拟示波器上直观地显示波形。 我们可以适当调整示波器面板上的按钮来使波形最有利于我们观察。调整好以后,系统产生的波形效果如图5-25所示。 转动如图5-26所示的A通道的转盘旋钮,可调整A通道的电压显示幅值,范围为2ms-20v/格,如图电压幅值为2v/格,从波形可以看出P1.0口输出电压近似为5V。 转动如图5-27所示的转盘旋钮,可调整时基。如图时基为0.5s/格。从图中我们能够看出,波形的周期为2s,这与我们设定的目标相一致。 图5-24方波发生器仿真运行图 图5-25示波器上显示的方波图 图5-26 调节电压幅值 图5-27 调节时基 4.5 扩展练习 将子情境中方波的周期更改为1秒,并能在虚拟示波器上直观地显示波形。 子情境五:单片机外部中断仿真 5.1子情境内容:外部中断是单片机的重要内容,本子情境用外部中断功能改变流水灯和数码管的显示状态。没有发生中断时,数码管从0至F顺序显示,不断循环。当有外部中断0发生时(在单片机P3.2引脚上有低电平),立即产生中断,数码管从0至F顺序显示的工作停下来,转去执行中断服务程序。中断服务程序为:流水灯上下来回流动3次。完成中断服务程序后,返回主程序原断点处继续执行,数码管接着原来的数字继续顺序显示。程序流程图如5-29所示。 5.2 子情境目标: (1)理解单片机的中断原理及中断过程 (2)用PROTEUS设计、仿真单片机的外部中断。 5.3 知识点链接 5.4 任务步骤 5.4.1 步骤一:PROTEUS电路设计,实现外部中断功能改变流水灯和数码管的显示状态的原理图如图5-28所示。 1、选取元器件 ①单片机:AT89C51 ②电阻、排阻:RES* ③LED发光二极管:LED-RED ④按钮:BUTTON ⑤带公共端共阳七段蓝色数码管:7SEG-COM-AN-BLUE 2、放置元器件、放置电源和地、连线、元器件属性设置 外部中断实验的原理图如图5-28所示,整个电路设计操作都在ISIS平台中进行。与子情景3相似,故不详述。与LED串联的排阻阻值为1K欧姆,与数码管串联的电阻的阻值为330欧姆左右。 图5-28外部中断子情境原理图 5.4.2 步骤二:源程序设计与目标代码文件生成 (1)程序流程图 图5-29 外部中断流程图 (2)源程序设计 #include #include //包含_crol_和_cror_函数所在的头文件 #define uchar unsigned char #define uint unsigned int sbit d1=P1^0; //定义P1口的第一个引脚 char i,j,m,n,temp,k; uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x98,0x88,0x83, 0xa7,0xa1,0x06,0x8e};//共阳极数码管编码 void delay(int z); void main() { EA=1; //中断总允许 EX0=1; //允许外部中断0中断 IT0=0; //外部中断0的触发方式为低电平触发 while(1) { for(i=0;i<16;i++) //主程序一直在从事顺序显示数字的工作 { P0=table[i]; //将段码逐个送至P0口 delay(500); //延时500ms } } } void my_int0() interrupt 0 //外部中断0的中断服务程序:中断后流水灯上下循环三次 { temp=0xfe; //给流水灯赋初值 P1=temp; // 让第一个灯点亮 for(k=0;k<3;k++)// 实现循环三次的功能 { for(m=0;m<7;m++)//左移7次 { delay(200); temp=_crol_(temp,1);//库函数里面的循环左移函数,将temp的值左移一位后重新赋给temp P1=temp; //将左移一位后的temp值送P1口显示 } for(n=0;n<7;n++)//右移7次 { delay(200); temp=_cror_(temp,1);//库函数里面的循环右移函数,将temp的值右移一位后重新赋给temp P1=temp;//将右移一位后的temp值送P1口显示 } } delay(200); d1=1; } void delay(int z)//延时子函数 { int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 5.4.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到zhongduan.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图5-30、5-31、5-32所示。 图5-30中是主程序的运行片段,主程序中数码管从0至F顺序显示 图5-31中,按下按钮后,在单片机P3.2引脚上有低电平,立即产生中断,数码管从0至F顺序显示的工作停下来,流水灯上下循环移动三次。 图5-32中,完成中断服务程序后,返回主程序原断点处继续执行,数码管接着原来的数字继续顺序显示。 图5-30主程序中数码管从0至F顺序显示 图5-31按下按钮后数码管停下来,流水灯上下循环移动三次 图5-32完成中断服务程序后,返回主程序原断点处继续执行,数码管接着原来的数字继续顺序显示。 5.5 扩展练习 主程序中数码管从0至9顺序显示数字,中断发生后(在单片机P3.2引脚上有低电平),数码管从9至0反序显示。 子情境六:直流电机正反转 6.1子情境内容:用单片机AT89C51控制直流电机正反转。在此将由89C51的P2.0,P2.1通过晶体管控制继电器,当P2.0输出低电平,P2.1输出高电平时,三极管Q1导通,而三极管Q2截止,从而导致与Q1相连的继电器吸合,电机因两端产生电压而转动。由P3.0,P3.1,P3.2控制电机的正传、反转和停止。 6.2 子情境目标: (1)掌握趋动电机正反转的电路 (2)用PROTEUS实现电机正反转电路的设计,并进行实时交互仿真 6.3 知识点链接 二极管保护电路: 在图5-33中,在两个继电器的两端都反相接了一个二极管,这个二极管非常重要,当使用电磁继电器时必须接。原因如下:线圈通电正常工作时,二极管对电路不起作用。当继电器线圈在断电的一瞬间会产生一个很强的反向电动势,在继电器线圈两端反相并联二极管就是用来消耗这个反向电动势的,通常这个二极管叫做消耗二极管,如果不加这个消耗二极管,反向电动势就会直接作用在趋动三极管上,很容易将三极管烧毁。 6.4 任务步骤 6.4.1 步骤一:PROTEUS电路设计,实现用单片机AT89C51控制直流电机正反转原理图如图5-33所示。 图5-33直流电机正反转原理图 1、选取元器件 ①单片机:AT89C51 ②电阻:RES* ③直流电机:MOTOR ④按钮:BUTTON ⑤三极管:NPN* ⑥继电器:RELAY* ⑦二极管:DIODE* 2、放置元器件、放置电源和地、连线、元器件属性设置 直流电机正反转的原理图如图5-33所示,整个电路设计操作都在ISIS平台中进行。与子情景3相似,故不详述。 (1)关于元器件属性的设置在此实例中需要特别注意: ①三极管基极的限流电阻更改为1K欧姆 ②双击电机图标,弹出如图5-34所示的电机属性对话框,在Nominal Voltage一栏中将默认值更改为5v 4 双击继电器图标,在弹出的如图5-35所示的继电器属性对话框中,在Component Value一栏中将默认值更改为5 v 图5-34更改电机属性 图5-35更改继电器属性 6.4.2 步骤二:源程序设计与目标代码文件生成 (1)程序流程图 图5-36 电机正反转流程图 (2)源程序设计 #include sbit p20=P2^0; //P2^0的功能是控制三极管的导通和截止 sbit p21=P2^1; //P2^1的功能是控制三极管的导通和截止 sbit p30=P3^0; //声明直流电机的正传位置 sbit p31=P3^1; //声明直流电机的反转位置 sbit p32=P3^2; //声明直流电机的停止位置 void main() { while(1) //无穷循环 { if(p30==0) //若按下p30 { p20=1; //P2^0控制的三极管截止 p21=0; //P2^1控制的三极管导通,线圈吸合,两者共同控制电机正转 } if(p31==0)//若按下p31 { p20=0;//P2^0控制的三极管导通,线圈吸合 p21=1;//P2^1控制的三极管截止,两者共同控制电机反转 } if(p32==0)//若按下p32 { p20=1;//P2^0控制的三极管截止 p21=1;//P2^1控制的三极管截止,两者共同控制电机停转 } } } 6.4.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到dianji.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图所示。 图5-37为电机正转运行状态,按下“正转”按钮,P2.0口输出高电平,三极管处于导通状态,继电器吸合,从而使电机左端为高电平。右端依然为低电平(由于P2.1 口输出低电平,三极管处于截止状态,继电器不吸合)。在电机两端有一个+5v的电压,所以电机正转。 图5-38为电机反转运行状态,按下“反转”按钮,原理与正转的情况恰好相反,故不详述。但请大家关注两个图中继电器开关的状态,是恰好相反的。这样在两种情况下,电机的转向是相反的。 图5-37电机正转运行状态 图5-38电机反转运行状态 6.5 扩展练习 在此子情境的基础上加上两个按键:加速和减速。控制电机的转速。想想硬件和软件应该做如何改动。 子情境七:用ADC0809实现电压表 7.1子情境内容:利用单片机AT89C52和ADC0809设计一个数字电压表,能够测量0-5V之间的电压值,用四位数码管显示。 7.2 子情境目标: (1)掌握PROTEUS中电压探针和电压表的使用方法 (2)通过制作简易电压表,学会AD转换芯片在单片机应用系统中的硬件接口技术和编程方法。 7.3 知识点链接 了解ADC0809芯片的功能以及使用方法 (1)功能:ADC0809芯片为8通道模/数转换器,可以和单片机直接接口,将IN0~IN7任何一通道输入的模拟电压转换成八位二进制数,在时钟为500KHZ时,一次变换时间约为100us。 (2)使用方法:28脚双列直插式封装如图5-39所示,各引脚功能如下: 图5-39 ADC0809引脚图 IN0~IN7:8个通道的模拟量输入端。可输入0~5V待转换的模拟电压。本实例中采用IN0通道。 ADDA、ADDB、ADDC:为地址输入线,用于选通IN0~IN7上的一路模拟量输入,通道选择表如表5-1所示。在本实例中直接将ADDA、ADDB、ADDC接地,选通IN0通道。 CLK:外部时钟信号输入端。ADC0809的典型时钟频率为640kHz,转换时间约为100μs。本实例中产生时钟信号的方法由软件来提供。 START:启动转换信号输入端。在START上升沿时,所有的内部寄存器清零,在下降沿时,开始进行A/D转换;A/D转换期间,START应保持低电平。 D0~D7:8位转换结果输出端。三态输出,D7是最高位,D0是最低位。 EOC:ADC0809自动发出的转换状态端,EOC=0,表示正在进行转换;EOC=1,表示转换结束; OE:转换数据允许输出控制端。OE=0,表示禁止输出;OE=1,表示允许输出。 REF(-)、REF(+):参考电压输入端。ADC0809的参考电压为+5V。 ALE:为高电平时,通道地址输入到地址锁存器中,下降沿将地址锁存,并译码。所以本实例中将ALE与START相连。由于ALE和START连在一起,因此ADC0809启动转换同时也在锁存通道地址。 7.4 任务步骤 7.4.1 步骤一:PROTEUS电路设计,利用单片机AT89C52和ADC0809设计一个数字电压表的原理图如图5-40所示。 图5-40 ADC0809与单片机的接口电路 1、选取元器件 ①单片机:AT89C52 ②电阻:RES* ③4位共阴极的数码管:7SEG-MPX4-CC ④A/D转换芯片:ADC0808(代替0809) ⑤电位器:POT-LOG ⑥瓷片电容:CAP ⑦晶振:CRYSTAL 2、放置元器件、放置电源和地、连线、元器件属性设置 数字电压表的原理图如图5-40所示,整个电路设计操作都在ISIS平台中进行。与子情景3相似,故不详述。 (1)电压探针和电压表 单击工具栏中中的电压探针按钮,连接到要实时监控的电路上,以便仿真时观察该处电压的实时变化。见图5-40所示。 单击工具栏中的按钮(虚拟仪器),在对象选择器列表中选择DC VOLTMETER(直流电压表),在ISIS编辑窗口中合适位置单击就可以将电压表放置 好了。通过电压表可以观察到电位器电压的实时变化。 (2)ADC0809与单片机的接口电路需要做些说明 ADDA、ADDB、ADDC:在本实例中直接将ADDA、ADDB、ADDC接地,选通IN0通道。 CLK:在图5-40所示的电路中,CLK与P3^3口相连,单片机通过软件的方法在P3^3口输出时钟信号供ADC0809使用。 START:在图5-40所示的电路中,START与P3^0口相连。 D0~D7:8位转换结果输出端。在图5-40所示的电路中,与P0口相连,从P0口读出转换结果。 EOC:ADC0809自动发出的转换状态端,在图5-40所示的电路中,EOC与P3^2口相连。 OE:转换数据允许输出控制端,在图5-40所示的电路中,OE与P3^1口相连。 ALE:在图5-40所示的电路中将ALE与START相连。由于ALE和START连在一起,因此ADC0809启动转换同时也在锁存通道地址。 7.4.2 步骤二:源程序设计与目标代码文件生成 (1)程序流程图 图5-41 电压表流程图 (2)源程序设计 #include #define uint unsigned int #define uchar unsigned char uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; uchar disp[4]; //定义数组变量 sbit ST=P3^0; //定义START引脚 sbit OE=P3^1; //定义OE引脚 sbit EOC=P3^2; //定义EOC引脚 sbit CLK=P3^3; //定义CLOCK引脚 sbit p17=P1^7; //定义数码管小数点 int getdata,temp; void delay(uint z); void display(); void initial(); void main() { initial(); //调用初始化函数 while(1) { OE=0; //刚开始禁止将转换结果输出 ST=0; ST=1; ST=0; //启动AD转换开始 while(EOC==0); //等待转换结束 OE=1; //允许转换结果输出 getdata=P0; //将转换结果赋值给变量getdata OE=0; //禁止转换结果输出 temp=getdata*1.0/255*5000; //将得到的数据进行处理 disp[0]=temp%10; //取得个位数 disp[1]=temp/10%10; //取得十位数 disp[2]=temp/100%10; //取得百位数 disp[3]=temp/1000; //取得千位数 display(); //调用显示子程序 } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void initial() //中断服务程序初始化 { TMOD=0x01; TH0=(65536-20)/256; TL0=(65536-20)%256; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 //给AD0809提供25KHZ的时钟脉冲 { TH0=(65536-20)/256; TL0=(65536-20)%256; CLK=~CLK; } void display() //将显示结果在数码管中显示 { P2=0xf7; P1=table[disp[0]]; delay(1); P2=0xfb; P1=table[disp[1]]; delay(1); P2=0xfd; P1=table[disp[2]]; delay(1); P2=0xfe; P1=table[disp[3]]; delay(1); p17=1; } 7.4.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到dianya.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图所示。 图5-42中,电位器调节到最左端,为最高电压。图5-43中电压探针和电压表实时显示此电压值。 调节电位器,IN0通道获得的模拟量都可以在数码管上实时显示。如图 5-44调节电位器后采集到的电压。图5-45中电压探针和电压表实时显示此电压值。 图5-42 电位器调节到最左端采集到的最高电压 图5-43 电压表和电压探针实时显示 图5-44 调节电位器后采集到的电压 图5-45 调节电位器后采集到的电压用电压表和电压探针实时显示 7.5 扩展练习 试着扩大电压表的量程,做一个最大量程为12V的电压表。想想硬件和软件应该做如何改动。 子情境八:1602液晶显示器 8.1子情境内容:利用单片机AT89C52控制液晶显示器(Liquid Crystal Display,简称为LCD)实时显示。在1602液晶的第一行显示“I LOVE MY FAMILY”,在第二行显示“WWW.YZCIT.CN”。 8.2 子情境目标: (1)掌握1602液晶与单片机的接口电路 (2)通过控制LCD,学会LCD液晶模块在单片机应用系统中的编程方法。 8.3 知识点链接 了解LCD1602芯片的功能以及使用方法 (1)功能:本情境中所使用的液晶显示器型号为1602,意思是每行显示16个字符,一共可以显示两行。此液晶只能显ASCII字符,如数字、大小写字母、各种符号等。 (2)使用方法:1602液晶的引脚图如图5-45所示。 图5-45 1602液晶引脚图 接口说明如下: ①液晶1,2端为电源;15、16为背光电源;为防止直接加5V电压烧坏背光灯,在15脚串接一个10欧姆电阻用于限流。 ②液晶3端为液晶对比度调节端,通过一个10K欧姆电位器接地来调节液晶显示对比度。首次使用时,在液晶上电状态下,调节至液晶上面一行显示出黑色小格为止。 ③液晶4端为向液晶控制器写数据/写命令选择端,接单片机的P3.0口。 ④液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入命令和显示数据,因此此端始终选择写状态,我们直接将它接地。 5 液晶6端为使能信号,是操作时必需的信号,接单片机的P3.1口 6 液晶7-14端为八位数据口,接单片机的P2口。 8.4 任务步骤 8.4.1 步骤一:PROTEUS电路设计,利用单片机AT89C52控制液晶显示器实时显示的原理图如图5-46所示。 图5-46 1602液晶原理图 1、选取元器件 ①单片机:AT89C52 ②电位器:POT-LOG ③1602液晶显示器:LM016L 2、放置元器件、放置电源和地、连线、元器件属性设置 单片机AT89C52控制液晶显示器实时显示的原理图如图5-46所示,整个电路设计操作都在ISIS平台中进行。与子情景3相似,故不详述。 (1)做标记 8.4.2 步骤二:源程序设计与目标代码文件生成 (1)程序流程图 图5-47 液晶显示流程图 (2)源程序设计 #include #define uchar unsigned char #define uint unsigned int uchar code table[]="I LIKE MY FAMILY"; uchar code table1[]="WWW.YZCIT.CN"; sbit lcden=P3^1; //液晶使能端 sbit lcdrs=P3^0; //液晶数据命令选择端 uchar num; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com)//写命令函数 { lcdrs=0; //选择写命令模式 P2=com; //将要写的命令字送到数据总线上 delay(5); //稍作延时以待数据稳定 lcden=1; //使能端给一高脉冲,因为初始化函数中已经将lcden置为0 delay(5); //稍作延时 lcden=0; //将使能端置0以完成高脉冲 } void write_data(uchar date)//写数据函数 { lcdrs=1; //选择写数据模式 P2=date; //将要写的数据送到数据总线上 delay(5); //稍作延时以待数据稳定 lcden=1; //使能端给一高脉冲,因为初始化函数中已经将lcden置为0 delay(5); //稍作延时 lcden=0; //将使能端置0以完成高脉冲 } void init() { lcden=0; //初始化函数中将lcden置为0 write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口 write_com(0x0c); //设置开显示,不显示光标 write_com(0x06); //写一个字符后地址指针自动加一 write_com(0x01); //显示清零,数据指针自动清零 } void main() { init(); //调用初始化函数 write_com(0x80); //将数据指针定位到第一行第一个字处 for(num=0;num<16;num++) //使用FOR语句逐个写完要显示的字符 { write_data(table[num]); delay(5); //在每两个字符间做简短延时 } write_com(0x80+0x40);//重新定位数据指针,将数据指针定位到第二行第一个字处 for(num=0;num<12;num++)//使用FOR语句逐个写完要显示的字符 { write_data(table1[num]); delay(5);//在每两个字符间做简短延时 } while(1); } 8.4.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到yejing.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图5-48所示。 在1602液晶的第一行从第一个字符开始显示“I LOVE MY FAMILY”,在第二行也从第一个字符开始显示“WWW.YZCIT.CN”。 图5-48 1602液晶显示图 8.5 扩展练习 另外一种型号的液晶显示器12864可以显示汉字,试着仿真一下显示“扬州工业职业技术学院 电子系”这几个字。 子情境九:简易秒表制作 9.1子情境内容:制作简易秒表,利用按键构成键盘实现秒表的启动、停止与复位,利用LED数码管显示时间。 9.2 子情境目标: (1)通过简易秒表的制作,进一步熟悉LED数码管与单片机的接口电路 (2)学习定时/计数器、中断技术的综合运用并会使用简易键盘 9.3 知识点链接 独立式按键的使用:图5-49为按键与单片机的连接图。 机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图5-50所示,抖动时间的长短与开关的机械特性有关,一般为5~10ms。 在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。本子情境中采用软件去抖。 图5-49 按键与单片机连接图 图5-50 按键被按下时电压的变化 9.4 任务步骤 9.4.1 步骤一:PROTEUS电路设计,简易秒表的原理图如图5-51所示。 1、选取元器件 ①单片机:AT89C51 ②两位共阴极蓝色数码管:7SEG-MPX2-CC-BLUE ③排阻:RESPACK-8 ④按钮:BUTTON 2、放置元器件、放置电源和地、连线、元器件属性设置 简易秒表的原理图如图5-51所示,整个电路设计操作都在ISIS平台中进行。与子情景3相似,故不详述。 图5-51 简易秒表的原理图 9.4.2 步骤二:源程序设计与目标代码文件生成 (1)程序流程图 图5-52 秒表流程图 (2)源程序设计 #include #define uint unsigned int #define uchar unsigned char sbit key1=P3^0; //定义"启动"按钮 sbit key2=P3^1; //定义"停止"按钮 sbit key3=P3^2; //定义"复位"按钮 uchar temp,aa,shi,ge; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //共阴极数码管编码 void display(uchar shi,uchar ge); //声明显示子函数 void delay(uint z); //声明延时子函数 void init(); //声明初始化函数 void main() { init(); //调用初始化子程序 while(1) { if(key1==0) //检测"启动"按钮是否按下 { delay(10); //延时去抖动 if(key1==0) //再次检测"启动"按钮是否按下 { while(!key1); //松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此while语句处 TR0=1; //启动定时器开始工作 } } if(key2==0) //检测"停止"按钮是否按下 { delay(10); //延时去抖动 if(key2==0) //再次检测"停止"按钮是否按下 { while(!key2); //松手检测 TR0=0; //关闭定时器 } } if(key3==0) //检测"复位"按钮是否按下 { delay(10); //延时去抖动 if(key3==0) //再次检测"复位"按钮是否按下 { while(!key3); //松手检测 temp=0; //将变量temp的值清零 shi=0; //将十位清零 ge=0; //将个位清零 TR0=0; //关闭定时器 } } display(shi,ge); //调用显示子函数 } } void delay(uint z) //延时子函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(uchar shi,uchar ge) //显示子程序 { P2=0xbf; P0=table[shi]; delay(10); P2=0x7f; P0=table[ge]; delay(10); //使用动态扫描的方法实现数码管显示 } void init() //初始化子程序 { temp=0; TMOD=0x01; //使用定时器T0的方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; //定时50ms中断一次 EA=1; //中断总允许 ET0=1; //允许定时器T0中断 } void timer0() interrupt 1 { TH0=(65536-50000)/256;//重新赋初值 TL0=(65536-50000)%256; aa++; //中断一次变量aa的值加1 if(aa==20) //中断20次后,定时时间为20*50ms=1000ms=1s,将变量temp的值加1 { aa=0; temp++; if(temp==60) //秒表到达60s后回零 { temp=0; } shi=temp%100/10; ge=temp%10; //分离个位和十位 } } 9.4.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到miaobiao.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图5-53所示。 按下“启动”按钮后,秒表开始计时,如图5-53所示。 按下“停止”按钮,秒表停止计时。 按下“复位”按钮,秒表回到最初始的状态,如图5-54所示。 图5-53按下“启动”按钮后秒表开始计时 图5-54按下“复位”按钮后,秒表回到最初始的状态 9.5 扩展练习 此子情境设计的秒表只能显示两位整数,如果要记录110跨栏12:88秒的成绩,则必须再增加两位数码管来显示小数位。想想硬件和软件应该做如何改动。 子情境十:点阵LED简单图形显示技术 10.1子情境内容:利用单片机AT89C52在8×8点阵上逐次显示心形、圆形和菱形图。 10.2 子情境目标: (1)通过学习点阵LED显示技术,掌握单片机与点阵的接口电路。 (2)进一步熟悉单片机I/O口的运用方法,了解动态显示的编程方法 10.3 知识点链接 怎样利用单片机系统实现LED点阵显示: 一般的LED显示屏是用许多发光二极管排成行与列构成点阵,点亮不同位置的放光二极管,就可以显示不同的图形或文字符号。在电子市场,有专门的LED点阵模块产品,本子情境中使用的是8×8点阵模块,它有64个像素,可以显示一些较为简单的字符或图形。 图5-55是LED点阵模块内部结构等效电路。从图中可以看出,它有8行(Y0-Y7),8列(X0-X7),对外共有16个引脚,其中8根行线用数字0-7表示,8根列线用字母A-H表示。 点亮跨接在某行某列的二极管的条件是:对应的行为高电平,对应的列为低电平,例如Y0=1,X0=0点亮的是第一个发光二极管。在很短的时间内依次点亮多个发光二极管,就可以看到多个发光二极管同时发光,即可以看到显示的数字、字母和图形符号。 图5-55 LED点阵模块内部结构等效电路 10.4 任务步骤 10.4.1 步骤一:PROTEUS电路设计,LED点阵的原理图如图5-56所示。 1、选取元器件 ①单片机:AT89C52 ②点阵:MATRIX-8×8-RED 2、放置元器件、放置电源和地、连线、元器件属性设置 点阵模块的原理图如图5-56所示,整个电路设计操作都在ISIS平台中进行。与子情景3相似,故不详述。 图5-56 LED点阵的原理图 10.4.2 步骤二:源程序设计与目标代码文件生成 (1)程序流程图 图5-57 点阵显示流程图 (2)源程序设计 #include unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char code digittab[][]= {{0x1c,0x22,0x42,0x84,0x84,0x42,0x22,0x1c},//心形 {0x00,0x3c,0x42,0x81,0x81,0x81,0x42,0x3c},//圆形 {0x00,0x18,0x24,0x42,0x81,0x42,0x24,0x18},//菱形 }; unsigned int timecount; unsigned char cnta; //定义列 unsigned char cntb; //定义行 void main(void) { TMOD=0x01; //使用定时器T0的方式1 TH0=(65536-5000)/256; TL0=(65536-5000)%256; //5ms中断一次 EA=1 //中断总允许 TR0=1; //启动定时器开始工作 ET0=1; //允许定时器T0中断 while(1) {; } //等待中断产生 } void t0(void) interrupt 1 using 0 //中断服务程序 { TH0=(65536-5000)/256; //重新赋初值 TL0=(65536-5000)%256; P3=tab[cnta]; P1=digittab[cntb][cnta];//行数保持不变,列每中断一次加1 cnta++; if(cnta==8) //一行只有8个数码,列加到8之后回零 { cnta=0; } timecount++; if(timecount==200) //200*5=1000ms后行加1,控制每个图形显示的时间为1000ms,即为1s { timecount=0; cntb++; if(cntb==3) //只有三行数码,行加到3之后回零 { cntb=0; } } } 10.4.3 步骤三:PROTEUS仿真 加载目标代码文件,双击编辑窗口的AT89C52器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到dianzhen.hex文件,单击“打开”按钮,完成添加文件。单击按钮,启动仿真,仿真运行片段如图所示。 图5-58 显示心形图形; 图5-59 显示圆形图形; 图5-60 显示心形图形; 图5-58 显示心形图形; 图5-59 显示圆形图形 图5-60 显示心形图形; 10.5 扩展练习 试着在8×8点阵上逐个0-9这几个数字。 课后练习 (1)P0口的1、3、5、7个引脚控制发光二极管1秒钟闪烁一次。 (2)用单片机控制扬声器产生“滴、滴、滴…”的报警声从P1.0端口输出,产生频率为1KHZ。 (3)用单片机趋动蜂鸣器产生1KHZ的频率的声音,持续0.1s,停0.1s,然后从头执行。 (4)8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。 (5)用单片机趋动4位共阳极数码管同时点亮,依次显示从0到F,时间间隔1秒。此过程一直循环。 (6)用动态扫描方法在6位共阴极数码管上显示出稳定的654321。 (7)利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以 1HZ闪烁,设晶振频率为12MHz。 (8)利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数。 (9)用定时器T0以间隔500ms在6位数码管上依次显示0、1、2、3….C、D、E、F,一直重复下去。 (10)主程序中P1口控制的8个流水灯1s钟闪烁一次,中断发生后(在单片机P3.2引脚上有低电平),进行单灯左移三次。 (11)主程序中数码管从0至9顺序显示数字,中断发生后,8个流水灯一起闪烁三次。 (12)控制单片机输出不同占空比PWM信号来控制直流电机的转速,分别让PWM为1:3,2:2,3:1。 (13)用单片机控制步进电机,使用按键分别控制电机正转、反转、加速、减速。 (14)用单片机控制DAC0832芯片输出电流,让发光二极管由灭均匀变到最亮,再由最亮均匀熄灭。 (15)用单片机控制ADC0809测量电阻的阻值。 (16)用单片机控制液晶,实现第一行从右侧移入“Good morning!”同时第二行从左侧移入“Hello everyone!” (17)用单片机控制12864液晶,能在液晶上显示图片。 (18)用液晶做一个可以预置时间的倒计时简易秒表,利用按键构成键盘实现秒表的启动、停止与复位。 (19)使用1302时钟芯片和1602液晶仿真做一个实时时钟。 (20)在8×8点阵上实现“GOOD LUCK TO YOU”这行字循环显示。 (21)在8×8点阵上实现先让横向亮条从上至下流动,再让竖向亮条从左至右流动,一直循环下去。

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。