单片机实验3 中断定时器计数器实验Word下载.docx
《单片机实验3 中断定时器计数器实验Word下载.docx》由会员分享,可在线阅读,更多相关《单片机实验3 中断定时器计数器实验Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
一、实验目的
1、熟练巩固单片机开发环境KEIL界面的相关操作和PROTUES仿真软件的操作,会使用HEX文件进行单片机的仿真。
2、了解定时器的原理和四种工作方式的使用方法,学习定时器的相关应用,包括产生信号和计数,利用定时器进行延时等。
3、进一步掌握熟练单个数码管以及多位数码管的显示原理,学会将0~1000的数字进行显示。
4、掌握利用单片机产生矩形方脉冲的相关原理。
二、实验原理
1、定时器结构和原理
图①
上图①为定时器T0、T1的结构,其中振荡器经12分频后作为定时器的时钟脉冲,T为外部计数脉冲输入端,通过开关K1选择。
反相器,或门,与门共同构成启/停控制信号。
TH和TL为加1计数器,TF为中断标志。
每接收到一个脉冲,加1计数器自动加1,当计数器中的数被加为0时产生溢出标志,TF将被置1。
计数器工作方式的选择和功能的实现需要配置相应的寄存器TMOD和TCON。
2、定时器工作方式
定时器共有四种工作方式分别为方式0——方式3。
方式0:
13位计数器,最大计数值为213个脉冲。
方式1:
16位计数器,最大计数值为216个脉冲。
方式2:
8位自动重装计数器。
该方式下,TL进行计数工作,TH用于存放计数初值,当产生溢出中断请求时会自动将TH中的初值重新装入TL,以使计数器继续工作。
方式3:
仅限于T0计数器,在方式3下,T0计数器被分成两个独立的8为计数器TL0和TH0。
3、定时器间隔1ms产生一个脉冲
利用单片机1P3.0口进行脉冲的输出,通过定时器进行端口定时控制,实现每1ms高低电平变换。
就可以实现一个占空比为50%的矩形脉冲输出。
对于定时器的定时功能实现,需要进行定时器模式选择,定时器初值设定。
4、利用中断进行脉冲的计数
将单片机1P3.0口输出的脉冲连接到单片机2的中断INT0口P3.2,通过脉冲的高低电平变换触发中断0,进行脉冲个数的计数。
三、实验步骤
(一)实验详细步骤
1、启动KEIL建立一个空白工程,然后命名文件。
2、新建源程序文件,输入程序代码并保存,然后进行综合编译。
若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
3、通过设置生成HEX文件,保存。
4、启动Protues建立一个空白工程,然后命名文件
5、进行电路的原理图连接并输入HEX文件进行仿真。
(二)实验仿真原理图
图②图③
如图②为单片机1的脉冲产生系统,通过定时的定时控制,让P3.0口输出脉宽为1ms的方脉冲,
对于定时器程序的初始化。
TMOD=(TMOD&
0XF0)|0X00;
//定时器模式0的选择
s=8192-11059.2/12;
TH0=s/32;
TL0=s%32;
//定时器的初值的设定
如图③为单片机2的电路连接原理,单片机②通过接受单片机1的方脉冲信号触发中断进行计数,没来一个脉冲记一次数,再通过数码管显示出来。
四、实验结果及分析
图④
通过按下按键开始进行脉冲的产生和计数,如图④左边为单片机1产生脉冲并通过数码管显示脉冲产生数,右边为单片机2接受脉冲同时也通过数码管显示脉冲接受数字。
当按下按键时开始产生并传送脉冲,通过一个VSMcountertimer进行计数验证的准确与否。
按下按键后发现两个多位数码管同时显示并跳转同样的数字,并且计数器也显示同样的数字。
如图⑤所示。
图⑤
最后通过示波器验证观察所产生的脉冲是否正确,通过调节示波器上的时间和幅度旋钮可以观察到矩形方波的产生。
如图⑥所示
图⑥
问题一:
运行电路时,数码管乱码
解决的方法:
检查电路,发现程序中扫描信号端口错误,将扫描信号的端口顺序调换,重新运行。
问题二:
定时器的时间设置问题
检查程序,发现是是定时器的初始化设置问题,在改动后,重新编译后在次运行电路,电路正常显示,符合要求。
通过本次实验,通过实验我切身实际的进行代码的编写以及电路的仿真连接从中发现问题,解决问题,再而收获知识,获取经验。
五、体会
通过本次的实验,在前三个实验的基础上让我复习了知识点,也让我在次掌握了新的知识。
在完成这次实验后,让我更加熟悉数码管的显示功能代码的实现。
并且还学会了定时器中断的运用,学会了用更加精确的方式去进行定时延时操作。
我觉得这次的课程实验让我知道,一次次的失败,并不会让我放弃去追求,相反它会引领着我去发现问题,从而解决问题,完成更深入的探索。
也让我明白理论知识的重要性,并且与实际相结合,多动手,在实践中成长。
所以我会很重视每一次的实验。
我坚信:
每次实验都会给我自身很大帮助。
慢慢的积累点滴的知识,到最后就会多的。
六、附录
1、单片机1脉冲产生代码
#include<
STC12C5A60S2.h>
unsignedcharcodeET[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedintAT,s;
unsignedinta,b,c,d;
voiddelay(intcounter)
{
inti,j;
for(i=0;
i<
10;
i++)
for(j=0;
j<
counter;
j++);
}
voidanjian(void)interrupt0//按键进行控制开始产生脉冲
P30=1;
TR0=~TR0;
voidTimer(void)interrupt1//中断函数
unsignedintcount;
s=8192-11059.2/12;
TH0=s/32;
TL0=s%32;
if(++count>
10)
{
count=0;
P30=~P30;
//高低电平取反
if(P30==0)
{AT++;
if(AT>
9999)
{
AT=0;
}
}
voidmain()
TMOD=(TMOD&
//模式0选择
//初值设定
TR0=0;
ET0=1;
IT0=1;
EX0=1;
EA=1;
//定时器的初始化
while
(1)
if(AT<
{
a=AT;
P2=0xff;
//消除鬼影
P1=0xf7;
P2=ET[a];
}
elseif(AT<
100)
{
a=AT%10;
P2=0xff;
P1=0xf7;
P2=ET[a];
delay
(2);
b=AT/10;
P1=0xfb;
P2=ET[b];
}
1000)
{
a=AT%100%10;
b=AT%100/10;
c=AT/100;
P1=0xfd;
P2=ET[c];
10000)
{
a=AT%1000%100%10;
b=AT%1000%100/10;
c=AT%1000/100;
d=AT/1000;
P1=0xfe;
P2=ET[d];
}//数码管进行数字显示部分
}
2、单片机2接受脉冲代码
unsignedintAT;
voidanjian(void)interrupt0//中断函数,触发一次计数一次
AT++;
//中断0初始化