基于定时计数器的单片机实验和C语言开发教材.docx
- 文档编号:15869119
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:26
- 大小:1.78MB
基于定时计数器的单片机实验和C语言开发教材.docx
《基于定时计数器的单片机实验和C语言开发教材.docx》由会员分享,可在线阅读,更多相关《基于定时计数器的单片机实验和C语言开发教材.docx(26页珍藏版)》请在冰点文库上搜索。
基于定时计数器的单片机实验和C语言开发教材
课程设计任务书
学生姓名:
黄蓉专业班级:
电信1204班
指导教师:
陈德军工作单位:
信息工程学院
题目:
基于定时器/计数器的单片机实验和C语言
开发
初始条件:
具备单片机的理论知识;
具备proteus仿真能力;
了解定时器及计数器应用;
提供仿真所需要的计算机一台
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、用定时器中断方式或查询定时器溢出标志方式从P口输出给定周期的方波
2、我们在此基础上扩展实现了矩阵键盘调节方波频率和占空比
时间安排:
一周,其中3天程序设计,2天程序调试
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
摘要
本次单片机课程设计是基于定时计数器的单片机实验与C语言开发,要求用定时器中断方式或查询定时器溢出标志方式从P口输出给定周期的方波。
以此为基础,我们进行了一些拓展,通过4乘2矩阵键盘,使其能实现输出方波的频率和占空比可调。
通过两个按键调节频率,两个按键调节占空比,以此实现定时器中断方式从P口输出给定周期的方波。
关键字:
定时器方波中断占空比
1.概述
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
单片机(Microcontrollers)诞生于1971年,经历了SCM、MCU、SoC三大阶段,早期的SCM单片机都是8位或4位的。
其中最成功的是INTEL的8051,此后在8051上发展出了MCS51系列MCU系统。
基于这一系统的单片机系统直到现在还在广泛使用。
随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。
90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。
随着INTELi960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。
单片机(Microcontrollers)有两种基本结构形式:
一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,称为普林斯顿结构。
另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器,目前的单片机以采用程序存储器和数据存储器截然分开的结构为多。
本课题讨论的方波发生器的核心是目前应用极为广泛的51系列单片机。
其内部包括:
(1)一个8位的CPU;
(2)4KB程序存储器ROM;
(3)128字节RAM数据存储器;
(4)两个16位定时/计数器;
(5)可寻址64KB外部数据存储器和64KB外部存储空间的控制电路;
(6)32条可编程的I/O线(4个8位并行I/O端口);
(7)一个可编程全双工串行口;
(8)具有两个优先级嵌套接口的5个中断源
2.设计方案
2.1方案简介
本方案中,微处理器模块使用STC89C52RC。
通过键盘扫描,输入四输入与门,实现外部中断0的中断。
本设计中用到两个定时器,定时器0和定时器1,其中定时器0工作在定时方式1下,通过扫描键盘S1,S2是否按下及按下次数调节方波频率;定时器1同样工作在定时方式1下,用于设定占空比。
键盘的操作是通过外中断与单片机共同来控制的,键盘操作来完成按要求对频率与占空比进行调节。
P2.0为方波输出口,它连接一个示波器即可观察输出的方波了。
2.2方波发生器原理与功能
方波发生器原理框图如图2.1所示:
频率与占空比调节
输出方波
示波器
AT89C51单片机
键盘
图2.1方波发生器原理框图
由于系统的要求不高,比较单一的,再加上我们是通过定时器来调节频率的,而非电阻,因此实现起来就相对简化了。
仅用键盘、AT89C51及示波器便可完成设计,达到所要求实现的功能。
初始化后,主程序扫描键盘,将设置信息输入,处理后,输出到示波器显示。
单片机的晶振为11.0592MHz,用到了两个定时器,即定时器0与定时器1,分别进行频率与占空比的定时,两个定时器都是工作在方式1。
根据计算定时器初值的公式:
(式2-1)
计算出定时器0与定时器1所要装入的初值,然后将工作方式控制字写入TMOD寄存器,再将
和
寄存器赋初值,最后启动定时器,即将
置位。
同时打开外部中断0。
置位EA(中断总开关)及
(允许定时/计数器中断),并编中断服务程序。
键盘是由一个状态键,四个功能键(调节频率与占空比的增减)组成,其特殊之处在于利用外部中断实现键盘扫描。
当按下S0时,输出频率为10HZ;按下S1时,频率加1HZ,当频率大于1000HZ时,恢复方波频率为10HZ;按下S2时,频率减1HZ,当频率小于10HZ时,恢复方波频率为1000HZ;按下S3时,占空比加1%,当占空比大于50%时,将占空比置为1%;按下S4时,占空比减1%,占空比小于1%时,恢复占空比为50%。
3.系统硬件设计
3.1STC89C52RC简介
图3.1STC89C52RC管脚图
单片机是在一块芯片中集成了CPU、RAM、ROM、定时/计数器和多功能I/O口等计算机所需要的基本部件的大规模集成电路,又称MCU。
其以体积小、功能全、性价比等诸多优点而独具特色,在工业控制、尖端武器、通信设备、家用电器等嵌入式应用领域中独占鳌头。
如果说C语言程序设计课程设计的基础课,那么单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计基础课。
其管脚图如图3.1所示。
3.2时钟电路
8XX51单片机的时钟信号通常用两种电路形式得到:
内部振荡方式和外部振荡方式。
因为此次课设我们用到的是内部振荡方式,所以只对前者进行简单介绍。
如图3.2所示,在引脚XTAL1和XTAL2外接晶体振荡器或陶瓷振荡器,就构成了内部振荡方式。
由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器,并产生振荡时钟脉冲。
晶振通常选用6MHz、12MHz、24MHz。
图中C2和C3起稳定振荡频率,快速起振的作用。
电容值一般为5~30pF。
图3.2内部振荡电路
3.3复位电路
图3.3复位电路
复位操作完成单片机内电路的初始化,使单片机从一确定的状态开始运行。
当8XX51单片机的复位引脚RST出现5ms以上的高电平时,单片机就完成了复位操作。
如果RST持续为高电平,单片机就处于循环复位状态,而无法执行程序,因此要求单片机复位后能脱离复位状态。
图3.3所示的为上电且开关复位电路,上电后电容充电,使RST持续一段时间的高电平,从而实现上电且开关复位的操作。
通常选择
。
3.4按键接口电路
小键盘如图3.4所示。
它包括8个键,系统中用到的键只有5个,分别为S0键,S1键,S2键,S3键,S4键。
其中S0键是初始键,按下时初始频率为10HZ;另外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~P1.4为4输入与门输入端,输出端接外部中断0控制端
,当有某一键按下时,由于输入端电平的变化会导致进入
的电平也发生变化,由此将会产生外部0中断,达到按键控制的作用。
图3.5按键控制外部中断电路
4.系统软件设计
方波发生器的软件设计包括主程序、延时子程序、系统初始化程序、键盘扫描程序、定时器中断子程序。
其中主程序用来控制整个程序的执行,它与各子程序紧密相联,共同实现方波发生器各种功能的执行。
4.1系统初始化程序
voidinit()
{
KEY=0x0f;
TIME0_L=176;
TIME0_H=60;
TL0=176;
TH0=60;
TMOD=0x11;//定时计数器0与定时计数器1均工作在方式1
ET1=1;
EX0=1;//外部中断0允许
ET0=1;
EA=1;
TR0=1;
TR1=1;
}
在系统初始化程序中,给键盘扫描口赋初值、设定定时计数器0与定时器1的工作方式,写入计数初值,启动了定时器0与定时器1,打开了外部中断。
4.2定时器中断子程序
voidTimer0()interrupt1//定时器0中断
{
TL0=TIME0_L;
TH0=TIME0_H;
TR1=1;
OutPut=1;
}
voidTimer1()interrupt3//定时器1中断
{
TH1=TIME1_H;
TL1=TIME1_L;
TR1=0;
OutPut=0;
}
定时器中断子程序中有定时器0与定时器1中断,定时器0中与定时器1控制频率与占空比流程图分别如图4.1和图4.2所示。
其过程为:
(1)定时器0遇中断执行的操作有复位,启动自身进行频率定时,同时启动定时器1,进行占空比定时,输出高电平。
(2)定时器1遇中断,停止自身的计时,输出低电平。
如此循环进行从而达到输出方波的目的。
图4.2占空比定时器0中断流程
图4.1频率定时器0中断流程
4.3键盘扫描程序
voidKeyScan()interrupt0//键盘扫描
{
ucharscancode,keycode,i;
floatTC0,TC1,temp;
EX0=0;//关外部中断0
delayms(5);
scancode=0xef;
while(scancode!
=0xff)
{
KEY=scancode;
keycode=KEY;
if((keycode&0x0f)!
=0x0f)break;//有键按下,break
scancode=(keycode<<1)|0x0f;//无键按下,扫描下一行
}
keycode=~keycode;//取反得键值
for(i=0;i<8;i++)
if(tabl2[i]==keycode)break;//扫描键表,与键值比较,找到则break
if(i==0)fre=10;//按下S0,设置初始频率为10HZ
if(i==1)//按下S1,频率加1
{fre++;
if(fre>1000)//大于1000HZ时恢复10HZ
fre=10;
}
if(i==2)//按下S2,频率减1
{fre--;
if(fre<10)//小于10HZ,恢复频率1000HZ
fre=1000;
}
if(i==0||1||2)//按下S0,S1,或S2时
{
TC0=(length-fosc/(24*fre));//计算定时器0计数初值
TIME0_H=(uint)TC0/256;
TIME0_L=(uint)TC0%256;
TC1=(1-zkb/100.0)*length+TC0*zkb/100.0;//计算定时器1计数初值
TIME1_H=(uint)TC1/256;
TIME1_L=(uint)TC1%256;
}
if(i==3)//按下S3时,占空比加1%
{zkb++;
if(zkb>50)zkb=1;//占空比大于50%时,恢复占空比为1
}
if(i==4)//按下S4时,占空比减1%
{zkb--;
if(zkb<1)zkb=50;//占空比小于1%时,恢复占空比为50%
}
if(i==3||i==4)//当按下S3或S4时,计算定时器1计数初值,装入初值
{
temp=length-fosc/24.0/fre;
TC1=(1-zkb/100.0)*length+temp*zkb/100.0;
TIME1_L=(uint)TC1/256;
TIME1_H=(uint)TC1%256;
}
KEY=0x0f;
EX0=1;
}
键盘扫描用外中断0实现,采用的是线反法,键盘扫描采用逐行扫描的方法。
当频率可调时,占空比保持原状不变,反之亦然,只能进行单一变量的调节,
当按下S0,S1,S2可以进行初始化、加1Hz、减1Hz操作。
如果按住某个键不放,便会执行连续加值或减值操作。
这里的频率的最大值为1000Hz,当频率增至最大值时,还按增值键,此时频率会自动跳到10Hz开始继续增加。
同理,频率的最小值为10Hz,当减频率减至最小值时,再按减频率键,则频率会跳到1000Hz。
频率保持不变,进行占空比调节。
只可进行加1与减1操作,分别由S3键、S4键控制。
要注意的是占空比的初值是50%,我们定义的zkb为50(百分比的分子部分,为一整数),故调节占空比时,zkb会进行加1,减1操作。
zkb的最大值为50,当增到最大值时,便会返回到值1,如此循环。
为了减轻单片机的工作量,在软件设计中采取了这样的措施,在修改参数确定后才进行定时器初值TC0、TC1的计算。
键盘中断处理子程序流程图与键处理流程图分别如图4.3、图4.4所示:
是否为抖动
图4.4键处理流程图
4.4主函数
voidmain()
{
init();//初始化
while
(1);//等待按键,外部中断
5.软件仿真
5.1keil编译器生成HEX文件
由于这次能力拓展使用的C语言编程,所以不能用WAVE软件进行仿真,于是我们选用keil编译器进行仿真。
主要介绍C程序生成hex文件的方法:
(1)双击打开KeiluVision3,选择project新建工程并保存,在出现的CPU对话框中选择ATMEL中的AT89C51芯片。
(2)点击确定生成工程,在file菜单中选择新建,新建一个文件,在里面输入自己写的程序代码,并保存。
(3)在左面的工程上右击选择addfilestogroup,将刚开的文件添加的工程,然后同样右键target选择optionsfortarget,打开设置,在output选项中选择createhexfil这一项。
(4)点击编译,
以及它后面的生成选项,便可在工程目录下生成hex文件。
5.2proteus软件仿真
在生成*.HEX文件后,进入Protues软件,此时软件已自动打开一新建项目。
我们可直接在其中构建电路图,点击板面左侧按键P,在弹出的Pickdevices对话框中进行元器件的选择,文件要求必须是HEX文件。
然后可以点击运行观察现象,看与自己设置的符合否,如果不相符在查找错误进行修改,一般的错误都是程序中的,所以要认真的读取程序的每一个部分。
在元器件都找到后,我们可以先进行排版再按照电路图连接,如连接好后如下图所示:
图5.1仿真电路图
当完成以上步骤后,就可以点击开始按钮进行仿真了,原始方波输出如图5.3所示:
图5.3输出原始波形图
当仿真开始后,按一次S1,可以进行频率的调整,频率调整后波形输出如下图所示:
图5.3频率调整后的波形输出
再按S1将Flag状态调整为状态2,此时可以对波形的占空比进行调整,调整占空比后的波形如下图所示:
图5.5占空比调整后的输出波形
6.硬件调试
6.1电路板焊制及测试
元器件焊接顺序依次为:
电阻器,电容器,二极管,三极管,集成电路,大功率管,其他元器件为先小后大。
焊接时,要使焊点周围都有锡,将其牢牢焊住,防止虚焊。
焊接完成后,检查是否所有线已连接,并用万用表检查。
6.2电路板调试
将程序烧写入STC89C52RC芯片,接入+5V电源,将示波器探头接到P2.0口,按键盘,观察输入波形,分别如下:
图6.1原始波形图6.2频率增加波形
图6.3频率减小波形图6.4占空比改变后波形
7.心得体会
完成本次课程设计的过程,是一个从无到有的过程,经历了兴奋、自信、失落、奋发、所悟、完成几个过程。
刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么困难的,所用的知识书上都有。
可是当我动手开始做的时候,才发现其中的算法,设计是那么繁琐。
经过一天的努力,毫无结果。
失落的心情油然而生。
于是,再到图书馆和网上查找资料,在经过借鉴很多类似的资料,文献后,总算是有点眉目了。
埋头苦干的过程是痛苦的,尤其是在思考算法和程序框架时,迷茫,烦躁,特别是当苦思出来一个结果,又被自己推翻,心痛的无法言绘。
在痛苦中挣扎,建立,推翻,参考别人的思路,建立,再次在推翻,在这不断循环中,终于最后完善了程序。
其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域”的困难。
但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,不懂付出怎么能知道回报的快乐,一分耕耘一分收获,有付出才会有回报,就在这样的痛与快乐的交换中,我学到了知识,学到了做人的道理。
单片机设计是一门很实用,很难的设计。
这个设计用到了单片机,电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。
参考文献
[1]何立民.MCS51单片机应用系统设计[M].北京:
北京航空航天大学出版社,2003.
[2]徐君毅.单片微型机原理与应用[M].上海:
上海科技出版社,1995
[3]公茂法.单片机人机接口实例集[M].北京:
航空航天大学出版社,1998.
[4]沈红卫.基于单片机的智能系统设计与实现[M].北京:
电子工业出版社,2005.
[5]李广弟,朱月秀等.单片机基础[M].北京:
北京航空航天大学出版社,2003.
附录:
源程序代码
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineKEYP1
sbitOutPut=P2^0;
floatfosc=12000000;
floatlength=65536;
longintfre=10,zkb=50;
ucharTIME0_L,TIME0_H,TIME1_L,TIME1_H;
ucharcodetabl2[18]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28};
voiddelayms(uintn)
{
uinti,j;
for(i=n;i--;i>0)
for(j=110;j--;j>0);
}
voidinit()
{
KEY=0x0f;
TIME0_L=176;
TIME0_H=60;
TL0=176;
TH0=60;
TMOD=0x11;//定时计数器0与定时计数器1均工作在方式1
ET1=1;
EX0=1;//外部中断0允许
ET0=1;
EA=1;
TR0=1;
TR1=1;
}
voidKeyScan()interrupt0//键盘扫描
{
ucharscancode,keycode,i;
floatTC0,TC1,temp;
EX0=0;//关外部中断0
delayms(5);
scancode=0xef;
while(scancode!
=0xff)
{
KEY=scancode;
keycode=KEY;
if((keycode&0x0f)!
=0x0f)break;//有键按下,break
scancode=(keycode<<1)|0x0f;//无键按下,扫描下一行
}
keycode=~keycode;//取反得键值
for(i=0;i<8;i++)
if(tabl2[i]==keycode)break;//扫描键表,与键值比较,找到则break
if(i==0)fre=10;//按下S0,设置初始频率为10HZ
if(i==1)//按下S1,频率加1
{fre++;
if(fre>1000)//大于1000HZ时恢复10HZ
fre=10;
}
if(i==2)//按下S2,频率减1
{fre--;
if(fre<10)//小于10HZ,恢复频率1000HZ
fre=1000;
}
if(i==0||1||2)//按下S0,S1,或S2时
{
TC0=(length-fosc/(24*fre));//计算定时器0计数初值
TIME0_H=(uint)TC0/256;
TIME0_L=(uint)TC0%256;
TC1=(1-zkb/100.0)*length+TC0*zkb/100.0;//计算定时器1计数初值
TIME1_H=(uint)TC1/256;
TIME1_L=(uint)TC1%256;
}
if(i==3)//按下S3时,占空比加1%
{zkb++;
if(zkb>50)zkb=1;//占空比大于50%时,恢复占空比为1
}
if(i==4)//按下S4时,占空比减1%
{zkb--;
if(zkb<1)zkb=50;//占空比小于1%时,恢复占空比为50%
}
if(i==3||i==4)//当按下S3或S4时,计算定时器1计数初值,装入初值
{
temp=length-fosc/24.0/fre;
TC1=(1-zkb/100.0)*length+temp*zkb/100.0;
TIME1_L=(uint)TC1/256;
TIME1_H=(uint)TC1%256;
}
KEY=0x0f;
EX0=1;
}
voidTimer0()interrupt1//定时器0中断
{
TL0=TIME0_L;
TH0=TIME0_H;
TR1=1;
OutPut=1;
}
voidTimer1()interrupt3//定时器1中断
{
TH1=TIME1_H;
TL1=TIME1_L;
TR1=0;
OutPut=0;
}
voidmain()
{
init();//初始化
while
(1);//等待按键,外部中断
}
本科生课程设计成绩评定表
姓名
性别别
专业、班级
课程设计题目:
成绩评定依据:
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 定时 计数器 单片机 实验 语言 开发 教材