基于定时器计数器的单片机仿真和C语言开发_第1页
基于定时器计数器的单片机仿真和C语言开发_第2页
基于定时器计数器的单片机仿真和C语言开发_第3页
基于定时器计数器的单片机仿真和C语言开发_第4页
基于定时器计数器的单片机仿真和C语言开发_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

摘要本次能力拓展的要求是要求实现利用定时器中断方式或查询定时器溢出标志方式从P口输出给定周期的方波。在此根底上,我决定进行一些拓展,使其能实现输出方波的频率和占空比可调。如果以调节变阻器的阻值来实现频率的调节相对来说要麻烦些,所以我们决定用按键来调节频率和占空比,而以键盘扫描来实现各键的不同功能。关键字:定时器;中断;方波概述单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为〞。单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速开展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广阔领域。单片机有两种根本结构形式:一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,称为普林斯顿结构。另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器,目前的单片机以采用程序存储器和数据存储器截然分开的结构为多。本课题讨论的方波发生器的核心是目前应用极为广泛的51系列单片机。其内部包括:一个8位的CPU;4KB程序存储器ROM;128字节RAM数据存储器;两个16位定时/计数器;可寻址64KB外部数据存储器和64KB外部存储空间的控制电路;32条可编程的I/O线〔4个8位并行I/O端口〕;一个可编程全双工串行口;具有两个优先级嵌套接口的5个中断源;总体设计方案2.1方案介绍在电子技术领域中,实现方波发生器的方法有很多种,可以采用不同的原理及器件构成不同的电路,但可以实现相同的功能。在此次课设中,微处理器模块使用AT89C51。本设计中用到两个定时器,定时器0和定时器1,其中定时器0工作在定时方式下,决定方波的频率;定时器1同样工作在定时方式下,用于设定占空比。键盘的操作是通过外中断与单片机共同来控制的,键盘操作来完成按要求对频率与占空比进行调节。P0.7为方波输出口,它连接一个示波器即可观察输出的方波了。2.2方波发生器原理与功能方波发生器原理框图如图2.1所示:频率与占空比调节频率与占空比调节输出方波输出方波示波器AT89C51单片机键盘示波器AT89C51单片机键盘图2.1方波发生器原理框图由于系统的要求不高,比拟单一的,再加上我们是通过定时器来调节频率的,而非电阻,因此实现起来就相对简化了。仅用键盘、AT89C51及示波器便可完成设计,到达所要求实现的功能。方波发生器工作原理与功能:简单的流程为:主程序扫描键盘,将设置信息输入,处理后,输出到示波器显示。单片机的晶振为11.0592MHz,用到了两个定时器,即定时器0与定时器1,分别进行频率与占空比的定时,两个定时器都是工作在方式1。根据计算定时器初值的公式:〔式2-1〕计算出定时器0与定时器1所要装入的初值,然后将工作方式控制字写入TMOD存放器,再将和存放器,最后启动定时器,即将置位。如果工作于中断方式,需置位EA〔中断总开关〕及〔允许定时/计数器中断〕,并编中断效劳程序。此电路的键盘是由一个状态键,四个功能键〔调节频率与占空比的增减〕组成,其特殊之处在于利用外部中断实现键盘扫描。状态键有三种状态,当其处于状态0时,那么其它的键会处于无用状态;当其处于状态1时,可通过按四个调节键来调节频率;当处于状态2时,按四个调节键中的前两个便可对占空比进行调节了;当处于状态3时,又会回到状态0,此时正常显示方波。系统硬件设计3.1AT89C51简介单片机是在一块芯片中集成了CPU、RAM、ROM、定时/计数器和多功能I/O口等计算机所需要的根本部件的大规模集成电路,又称MCU。其以体积小、功能全、性价比等诸多优点而独具特色,在工业控制、尖端武器、通信设备、家用电器等嵌入式应用领域中独占鳌头。如果说C语言程序设计课程设计的根底课,那么单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计根底课。其管脚图如右图所示。图3.1AT89C51管脚图3.2内部振荡电路图3.2内部振荡电路8XX51单片机的时钟信号通常分为内部振荡方式和外部振荡方式。因为此次课设我们用到的是内部振荡方式,所以只对前者进行简单介绍。如图3.2所示,在引脚XTAL1和XTAL2外接晶体振荡器或陶瓷振荡器,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶体后,就构成了自激振荡器,并产生振荡时钟脉冲。晶振通常选用6MHz、12MHz、24MHz。图中C2和C3起稳定振荡频率,快速起振的作用。电容值一般为5~30pF。3.3复位电路图3.3复位电路复位操作完成单片机内电路的初始化,使单片机从一确定的状态开始运行。当8XX51单片机的复位引脚RST出现5ms以上的高电平时,单片机就完成了复位操作。如果RST持续为高电平,单片机就处于循环复位状态,而无法执行程序,因此要求单片机复位后能脱离复位状态。图3.3所示的为上电且开关复位电路,上电后电容充电,使RST持续一段时间的高电平,从而实现上电且开关复位的操作。通常选择。3.4按键接口电路小键盘如图3.4所示。它包括8个键,系统中用到的键只有5个,分别为S1键,S2键,S3键,S4键,S5键。其中S1键是状态键,采用外部中断控制,用它来确定其它几个键的按键功能,具体作用在前述的系统功能中已做介绍了;另外4个键为功能键,是用来调节频率与占空比的。小键盘中引出的6根线依次分别接单片机的P1.0、P1.1、P1.2、P1.3、P1.4、P1.5口。其中P1.0~P1.3是为键盘列线,P1.4和P1.5是键盘行线。当某个键按下时,由行扫描值和列回馈信号共同形成键编码。图3.4按键接口电路如上所介绍的,按键接口电路采用的是外部中断控制,如图3.5所示,P1.0~P.14为4输入与门输入端,输出端接外部中断0控制端,当有某一键按下时,由于输入端电平的变化会导致进入的电平也发生变化,由此将会产生外部0中断,到达按键控制的作用。图3.5按键控制外部中断电路系统软件设计方波发生器的软件设计包括主程序、延时子程序、系统初始化程序、键盘扫描程序、定时器中断子程序。其中主程序用来控制整个程序的执行,它与各子程序紧密相联,共同实现方波发生器各种功能的执行。4.1系统初始化程序在此程序中,给所有变量赋初值,有键盘扫描口、选择串行口工作方式SCON、状态标志位flag、初始频率与占空比及其定时、定时器0与定时器1的工作方式等。初始化时启动了定时器0与定时器1。4.2定时器中断子程序voidTimer0_PL()interrupt1 //频率定时器0中断{TR1=1; //启动定时器1,占空比定时TL0=TIMER0_L;TH0=TIMER0_H;OutPut=1; //输出高电平}voidTimer1_PL()interrupt3 //占空比定时器1中断{TR1=0; //定时器1停止TL1=TIMER1_L;TH1=TIMER1_H;OutPut=0; //输出低电平}定时器中断子程序中有定时器0与定时器1中断,频率定时器0中断流程图与占空比定时器1流程图分别如图4.1和图4.2所示。其过程为:〔1〕定时器0遇中断执行的操作有复位,启动自身进行频率定时,同时启动定时器1,进行占空比定时,输出高电平。〔2〕定时器1遇中断,停止自身的计时,输出低电平。如此循环进行从而到达输出方波的目的。定时器1中断入口TR1=0定时器1中断入口TR1=0重装定时初值输出低电平结束图4.2占空比定时器0中断流程定时器0中断入口TR1=1重装定时初值输出高电平结束图4.1频率定时器0中断流程4.3键盘扫描程序键盘扫描用外中断0实现,采用的是线反法,键盘扫描采用逐行扫描的方法。当频率可调时,占空比保持原状不变,反之亦然,只能进行单一变量的调节,状态标志flag的初始值为0。〔1〕频率调节:i==0时,按键为状态键,此时flag加1,即flag==1,此时进行频率的调节。可以进行加1Hz、减1Hz、加100Hz、减100Hz操作,分别由S2键、S3键、S4键、S5键控制。如果按住某个键不放,便会执行连续加值或减值操作。这里的频率的最大值为15000Hz,当频率增至最大值时,还按增值键,此时频率会自动跳到1Hz开始继续增加。同理,频率的最小值为1Hz,当减频率减至最小值时,再按减频率键,那么频率会跳到15000Hz。〔2〕占空比调节:当状态值flag==2时,此时频率保持不变,进行占空比调节。只可进行加1与减1操作,分别由S2键、S3键控制。要注意的是占空比的初值是50%,我们定义的ZKB为50〔百分比的分子局部,为一整数〕,故调节占空比时,ZKB会进行加1,减1操作。ZKB的最大值为99,当增到最大值时,便会返回到值1,如此循环。〔3〕为了减轻单片机的工作量,在软件设计中采取了这样的措施,在修改参数确定后才进行定时器初值TC0、TC1的计算。键盘中断处理子程序流程图与键处理流程图分别如图4.3、图4.4所示:NYNYi==1ZKB++i==2ZKB--边界处理Flag=2?NYi==0?Flag+=1键处理YYi==3PL+=100i==4PL-=100i==2PL--i==1PL++边界处理NFlag=1?YNFlag=3?Flag=0,计算定时器0和1的初值键处理结束图4.4键处理流程图图4.3键盘中断处理子程序流程图YNEA=0软件延时消抖外部中断0入口键盘扫描,得到键码查表取键值i实时显示键盘口初始化EA=1结束键处理是否为抖动软件仿真5.1keil编译器生成HEX文件由于这次能力拓展使用的C语言编程,所以不能用WAVE软件进行仿真,于是我们选用keil编译器进行仿真。主要介绍C程序生成hex文件的方法:双击翻开KeiluVision3,选择project新建工程并保存,在出现的CPU对话框中选择ATMEL中的AT89C51芯片。点击确定生成工程,在file菜单中选择新建,新建一个文件,在里面输入自己写的程序代码,并保存。在左面的工程上右击选择addfilestogroup,将刚开的文件添加的工程,然后同样右键target选择optionsfortarget,翻开设置,在output选项中选择createhexfil这一项。点击编译,以及它后面的生成选项,便可在工程目录下生成hex文件。5.2proteus软件仿真在生成*.HEX文件后,进入Protues软件,此时软件已自动翻开一新建工程。我们可直接在其中构建电路图,点击板面左侧按键P,在弹出的Pickdevices对话框中进行元器件的选择,文件要求必须是HEX文件。然后可以点击运行观察现象,看与自己设置的符合否,如果不相符在查找错误进行修改,一般的错误都是程序中的,所以要认真的读取程序的每一个局部。在元器件都找到后,我们可以先进行排版再按照电路图连接,如连接好后如下列图所示:图5.1仿真电路图在电路连接好后,双击AT89C51在弹出对话框中选择单片机中要输入的程序,见下列图:图5.2向AT89C51中参加程序当完成以上步骤后,就可以点击开始按钮进行仿真了,原始方波输出如图5.3所示:图5.3输出原始波形图当仿真开始后,按一次S1,那么此时Flag状态为1,可以进行平率的调整,频率调整后波形输出如下列图所示:图5.3频率调整后的波形输出再按S1将Flag状态调整为状态2,此时可以对波形的占空比进行调整,调整占空比后的波形如下列图所示:图5.5占空比调整后的输出波形心得体会单片机设计是一门很实用,很难的设计。这个设计用到了单片机,电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的缺乏。完本钱次课程设计的过程,是一个从无到有的过程,经历了兴奋、自信、失落、发奋、所悟、完成几个过程。刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么困难的,所用的知识书上都有。可是当我动手开始做的时候,才发现其中的算法,设计是那么繁琐。经过一天的努力,毫无结果。失落的心情油然而生。于是,再到图书馆和网上查找资料,在经过借鉴很多类似的资料,文献后,总算是有点眉目了。埋头苦干的过程是痛苦的,尤其是在思考算法和程序框架时,迷茫,烦躁,特别是当苦思出来一个结果,又被自己推翻,心痛的无法言绘。在痛苦中挣扎,建立,推翻,参考别人的思路,建立,再次在推翻,在这不断循环中,终于最后完善了程序。其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域〞的困难。但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,不懂付出怎么能知道回报的快乐,一分耕耘一分收获,有付出才会有回报,就在这样的痛与快乐的交换中,我学到了知识,学到了做人的道理。通过这短短一周的实践,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。最少很多元器件根本不知道有什么成效,在仿真仪器中是什么代码。有的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。我遇到了不少问题,花费了很多的时间。这让我重新反思我们的学习,深刻领悟到我们这个专业动手,实践的重要性。理论不经过实践考验,是没法实施的,就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防范方法措施。这次的课程设计,让我学到了很多书本上学不到的东西,学到了实际应用时,是取用本钱的最小化,做设计不仅要考虑大的方面,小的方面也必须做到完美。最大的收获是C51语言的应用有了深刻的了解。参考文献[1]何立民.MCS51单片机应用系统设计[M].北京:北京航空航天大学出版社,2003.[2]徐君毅.单片微型机原理与应用[M].上海:上海科技出版社,1995[3]公茂法.单片机人机接口实例集[M].北京:航空航天大学出版社,1998.[4]沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出版社,2005.[5]李广弟,朱月秀等.单片机根底[M].北京:北京航空航天大学出版社,2003.附录:源程序代码#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineKEY_PORTP1 //P1口为键盘扫描口sbitOutPut=P0^7;//矩形波输出口/*设全局变量*/floatfosc=11059200;//系统时钟频率floatlength=65536;//方式1计数长度ucharflag; //状态键标志ucharZKB; //占空比uintPL; //频率ucharTIMER0_L,TIMER0_H,TIMER1_L,TIMER1_H;//定时器0和1的定时初值ucharcodetabl[12]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};//LED共阴极代码ucharcodetabl2[18]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88}; //键值表/*****************************************延时子程序*****************************************/voiddelay1ms(ucharn) //延时nms{ucharj;while(n--)for(j=0;j<122;j++){;}}/*****************************************系统初始化*****************************************/voidsystem_init(void){KEY_PORT=0x0f;SCON=0x00;flag=0;PL=1000;ZKB=50;TL0=0x66; //初始频率1KHz定时1msTH0=0xfc;TL1=0x33; //初始占空比50定时0.5msTH1=0xfe;TMOD=0x11;//定时器1和定时器0工作在方式1,的定时模式IT0=0;//选择INT0为低电平触发方式EX0=1;//外部中断0允许ET0=1;//定时器1和定时器0中断允许ET1=1;EA=1;//系统中断允许TR0=1;//定时器1和定时器0开始定时TR1=1;}/*****************************************发送数据*****************************************/voidsend(uchard){SBUF=d;while(!TI);TI=0;}/*****************************************显示子程序*****************************************/voiddisplay(uintPL,ucharZKB){uchara,b,c,d,e,m,n;a=PL/10000; //别离频率的各位数值b=PL/1000;b=b%10;c=PL/100;c=c%10;d=PL%100;d=d/10;e=PL%10;if(a==0) //频率显示的高位灭零{a=10;if(b==0){ b=10; if(c==0) { c=10; if(d==0) {d=10; if(e==0)e=10; } }}}m=ZKB/10; //别离占空比各位数值n=ZKB%10;if(m==0){m=10; //占空比显示的高位灭零if(n==0)n=10;}send(tabl[a]);send(tabl[b]);send(tabl[c]);send(tabl[d]);send(tabl[e]);send(0x02); //频率和占空比中间加一横线“-〞以示区别send(tabl[m]);send(tabl[n]);delay1ms(200);delay1ms(200); //延时开键盘中断,处理好〔防止又利用〕连击问题}/*****************************************键盘扫描〔线反法〕*****************************************/voidKey_Scan()interrupt0//键盘扫描用外中断0{ucharscancode,keycode,i;floatTC0,TC1;EX0=0;//关中断delay1ms(5);scancode=0xef;//键盘扫描码,采用逐行扫描的方法while(scancode!=0xff){KEY_PORT=scancode;//输入扫描码,扫描P1.4对应的行keycode=KEY_PORT;//读出数据,看是否在此行上的某列键盘被按下if((keycode&0x0f)!=0x0f)break;//扫描到按下的键,那么退出scancode=(keycode<<1)|0x0f;//否那么,更新扫描码继续扫描}keycode=~keycode;for(i=0;i<8;i++) if(tabl2[i]==keycode)break;//取得键号 if(i==0)flag++; if(flag==1) //状态1下对频率进行调整 { if(i==1) //按键为1号,频率加1 {PL++; if(PL>15000)PL=15; } if(i==2) //按键为2号,频率减1 {PL--; if(PL<15)PL=15000; } if(i==3) //按键为3号,频率加100 {PL+=100; if(PL>15000)PL=15; } if(i==4) //按键为4号,频率减100 {PL=PL-100; if(PL<15)PL=15000; } } if(flag==2) //状态2下对占空比进行调整 { if(i==1) //按键为1号,占空比加1 {ZKB++; if(ZKB>99)ZKB=1; } if(i==2) //按键为2号,占空比减1 {ZKB--; if(ZKB<1)ZKB=99; } }if(flag==3) //状态返回,正常工作{flag=0; //清状态标志 TC0=(length-fosc/(12*PL)+0.5); //频率定时初值 TC1=(length-(fosc*ZKB)/(12*100*PL)+0.5);//占空比定时初值 TIMER0_L=(uint)TC0/256;//计算定时器0和定时器1的初值 TIMER0_H=(uint)TC0%256; TIMER1_L=(uint)TC1/256; TIMER1_H=(uint)TC1%256; } display(PL,ZKB);KEY_PORT=0x0f; //给键盘扫描口赋初值,以便下次按键正确读入EX0=1;//开中断}/*****************************************定时器中断子程序*****************************************/voidTimer0_PL()interrupt1 //频率

温馨提示

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

评论

0/150

提交评论