单片机实验3 中断.定时器计数器实验

西南科技大学

实验报告

课程名称: 单片机原理及应用A

实验名称: 中断、定时器/计数器实验

姓 名:

学 号:

班 级: 生医1401

指导教师: 雷华军

西南科技大学信息工程学院制

实验题目

数码管动态扫描显示驱动、键盘动态扫描驱动

一、 实验目的

作,会使用HEX文件进行单片机的仿真。 计数,利用定时器进行延时等。 1、熟练巩固单片机开发环境KEIL界面的相关操作和PROTUES仿真软件的操 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。 2

3、定时器间隔1ms产生一个脉冲

利用单片机1 P3.0口进行脉冲的输出,通过定时器进行端口定时控制,实现每1ms高低电平变换。就可以实现一个占空比为50%的矩形脉冲输出。对于定时器的定时功能实现,需要进行定时器模式选择,定时器初值设定。

4、利用中断进行脉冲的计数

将单片机1 P3.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的方脉冲信号触发中断进行计数,没来一个脉冲记一次数,再通过数码管显示出来。

3

四、 实验结果及分析

图④

通过按下按键开始进行脉冲的产生和计数,如图④左边为单片机1产生脉冲并通过数码管显示脉冲产生数,右边为单片机2接受脉冲同时也通过数码管显示脉冲接受数字。当按下按键时开始产生并传送脉冲,通过一个VSM counter timer进行计数验证的准确与否。

按下按键后发现两个多位数码管同时显示并跳转同样的数字,并且计数器也显示同样的数字。如图⑤所示。

图⑤

最后通过示波器验证观察所产生的脉冲是否正确,通过调节示波器上的时间和幅度旋钮可以观察到矩形方波的产生。如图⑥所示

4

图⑥

问题一:运行电路时,数码管乱码

解决的方法:检查电路,发现程序中扫描信号端口错误,将扫描信号的端口顺序调换,重新运行。

问题二:定时器的时间设置问题

解决的方法:检查程序,发现是是定时器的初始化设置问题,在改动后,重新编译后在次运行电路,电路正常显示,符合要求。

通过本次实验,通过实验我切身实际的进行代码的编写以及电路的仿真连接从中发现问题,解决问题,再而收获知识,获取经验。

五、 体会

通过本次的实验,在前三个实验的基础上让我复习了知识点,也让我在次掌握了新的知识。在完成这次实验后,让我更加熟悉数码管的显示功能代码的实现。并且还学会了定时器中断的运用,学会了用更加精确的方式去进行定时延时操作。我觉得这次的课程实验让我知道,一次次的失败,并不会让我放弃去追求,相反它会引领着我去发现问题,从而解决问题,完成更深入的探索。也让我明白理论知识的重要性,并且与实际相结合,多动手,在实践中成长。所以我会很重视每一次的实验。我坚信:每次实验都会给我自身很大帮助。慢慢的积累点滴的知识,到最后就会多的。

六、 附录

1、单片机1脉冲产生代码

#include

unsigned char code ET[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned int AT,s;

unsigned int a,b,c,d;

void delay(int counter)

{

int i,j;

for(i = 0;i

for(j =0;j

}

void anjian(void) interrupt 0 //按键进行控制开始产生脉冲

5

图⑥

问题一:运行电路时,数码管乱码

解决的方法:检查电路,发现程序中扫描信号端口错误,将扫描信号的端口顺序调换,重新运行。

问题二:定时器的时间设置问题

解决的方法:检查程序,发现是是定时器的初始化设置问题,在改动后,重新编译后在次运行电路,电路正常显示,符合要求。

通过本次实验,通过实验我切身实际的进行代码的编写以及电路的仿真连接从中发现问题,解决问题,再而收获知识,获取经验。

五、 体会

通过本次的实验,在前三个实验的基础上让我复习了知识点,也让我在次掌握了新的知识。在完成这次实验后,让我更加熟悉数码管的显示功能代码的实现。并且还学会了定时器中断的运用,学会了用更加精确的方式去进行定时延时操作。我觉得这次的课程实验让我知道,一次次的失败,并不会让我放弃去追求,相反它会引领着我去发现问题,从而解决问题,完成更深入的探索。也让我明白理论知识的重要性,并且与实际相结合,多动手,在实践中成长。所以我会很重视每一次的实验。我坚信:每次实验都会给我自身很大帮助。慢慢的积累点滴的知识,到最后就会多的。

六、 附录

1、单片机1脉冲产生代码

#include

unsigned char code ET[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned int AT,s;

unsigned int a,b,c,d;

void delay(int counter)

{

int i,j;

for(i = 0;i

for(j =0;j

}

void anjian(void) interrupt 0 //按键进行控制开始产生脉冲

5

{

P30=1;

TR0 =~TR0;

}

void Timer(void) interrupt 1 //中断函数

{

unsigned int count;

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;

}

}

}

void main ()

{

TMOD = (TMOD&0XF0)|0X00; //模式0选择

s = 8192-11059.2/12;

TH0 = s/32;

TL0 = s%32; //初值设定

TR0 = 0;

ET0 = 1;

IT0 = 1;

EX0 = 1;

EA = 1; //定时器的初始化

while (1)

{

if(AT

{

a=AT;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

}

else if(AT

{

6

a=AT%10;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT/10;

P2 = 0xff; //消除鬼影

P1 = 0xfb;

P2 = ET[b];

delay(2);

}

else if(AT

{

a=AT%100%10;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT%100/10;

P2 = 0xff; //消除鬼影

P1 = 0xfb;

P2 = ET[b];

delay(2);

c=AT/100;

P2 = 0xff; //消除鬼影

P1 = 0xfd;

P2 = ET[c];

delay(2);

}

else if(AT

{

a=AT%1000%100%10;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT%1000%100/10;

P2 = 0xff; //消除鬼影

P1 = 0xfb;

P2 = ET[b];

delay(2);

7

c=AT%1000/100;

P2 = 0xff; //消除鬼影

P1 = 0xfd;

P2 = ET[c];

delay(2);

d=AT/1000;

P2 = 0xff; //消除鬼影

P1 = 0xfe;

P2 = ET[d];

delay(2);

} // 数码管进行数字显示部分

}

}

2、单片机2接受脉冲代码

#include

unsigned char code ET[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned int AT;

unsigned int a,b,c,d;

void delay(int counter)

{

int i,j;

for(i = 0;i

for(j =0;j

}

void anjian(void) interrupt 0 //中断函数,触发一次计数一次

{

AT++;

}

void main ()

{

IT0 = 1;

EX0 = 1;

EA = 1; //中断0初始化

while (1)

{

if(AT

{

a=AT;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

}

8

else if(AT

P2 = 0xff; //消除鬼影 P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT/10;

P2 = 0xff; //消除鬼影 P1 = 0xfb;

P2 = ET[b];

delay(2);

}

else if(AT

{

a=AT%100%10;

P2 = 0xff; //消除鬼影 P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT%100/10;

P2 = 0xff; //消除鬼影 P1 = 0xfb;

P2 = ET[b];

delay(2);

c=AT/100;

P2 = 0xff; //消除鬼影 P1 = 0xfd;

P2 = ET[c];

delay(2);

}

else if(AT

{

a=AT%1000%100%10; P2 = 0xff; //消除鬼影 P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT%1000%100/10;

P2 = 0xff; //消除鬼影 P1 = 0xfb;

9

西南科技大学

实验报告

课程名称: 单片机原理及应用A

实验名称: 中断、定时器/计数器实验

姓 名:

学 号:

班 级: 生医1401

指导教师: 雷华军

西南科技大学信息工程学院制

实验题目

数码管动态扫描显示驱动、键盘动态扫描驱动

一、 实验目的

作,会使用HEX文件进行单片机的仿真。 计数,利用定时器进行延时等。 1、熟练巩固单片机开发环境KEIL界面的相关操作和PROTUES仿真软件的操 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。 2

3、定时器间隔1ms产生一个脉冲

利用单片机1 P3.0口进行脉冲的输出,通过定时器进行端口定时控制,实现每1ms高低电平变换。就可以实现一个占空比为50%的矩形脉冲输出。对于定时器的定时功能实现,需要进行定时器模式选择,定时器初值设定。

4、利用中断进行脉冲的计数

将单片机1 P3.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的方脉冲信号触发中断进行计数,没来一个脉冲记一次数,再通过数码管显示出来。

3

四、 实验结果及分析

图④

通过按下按键开始进行脉冲的产生和计数,如图④左边为单片机1产生脉冲并通过数码管显示脉冲产生数,右边为单片机2接受脉冲同时也通过数码管显示脉冲接受数字。当按下按键时开始产生并传送脉冲,通过一个VSM counter timer进行计数验证的准确与否。

按下按键后发现两个多位数码管同时显示并跳转同样的数字,并且计数器也显示同样的数字。如图⑤所示。

图⑤

最后通过示波器验证观察所产生的脉冲是否正确,通过调节示波器上的时间和幅度旋钮可以观察到矩形方波的产生。如图⑥所示

4

图⑥

问题一:运行电路时,数码管乱码

解决的方法:检查电路,发现程序中扫描信号端口错误,将扫描信号的端口顺序调换,重新运行。

问题二:定时器的时间设置问题

解决的方法:检查程序,发现是是定时器的初始化设置问题,在改动后,重新编译后在次运行电路,电路正常显示,符合要求。

通过本次实验,通过实验我切身实际的进行代码的编写以及电路的仿真连接从中发现问题,解决问题,再而收获知识,获取经验。

五、 体会

通过本次的实验,在前三个实验的基础上让我复习了知识点,也让我在次掌握了新的知识。在完成这次实验后,让我更加熟悉数码管的显示功能代码的实现。并且还学会了定时器中断的运用,学会了用更加精确的方式去进行定时延时操作。我觉得这次的课程实验让我知道,一次次的失败,并不会让我放弃去追求,相反它会引领着我去发现问题,从而解决问题,完成更深入的探索。也让我明白理论知识的重要性,并且与实际相结合,多动手,在实践中成长。所以我会很重视每一次的实验。我坚信:每次实验都会给我自身很大帮助。慢慢的积累点滴的知识,到最后就会多的。

六、 附录

1、单片机1脉冲产生代码

#include

unsigned char code ET[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned int AT,s;

unsigned int a,b,c,d;

void delay(int counter)

{

int i,j;

for(i = 0;i

for(j =0;j

}

void anjian(void) interrupt 0 //按键进行控制开始产生脉冲

5

图⑥

问题一:运行电路时,数码管乱码

解决的方法:检查电路,发现程序中扫描信号端口错误,将扫描信号的端口顺序调换,重新运行。

问题二:定时器的时间设置问题

解决的方法:检查程序,发现是是定时器的初始化设置问题,在改动后,重新编译后在次运行电路,电路正常显示,符合要求。

通过本次实验,通过实验我切身实际的进行代码的编写以及电路的仿真连接从中发现问题,解决问题,再而收获知识,获取经验。

五、 体会

通过本次的实验,在前三个实验的基础上让我复习了知识点,也让我在次掌握了新的知识。在完成这次实验后,让我更加熟悉数码管的显示功能代码的实现。并且还学会了定时器中断的运用,学会了用更加精确的方式去进行定时延时操作。我觉得这次的课程实验让我知道,一次次的失败,并不会让我放弃去追求,相反它会引领着我去发现问题,从而解决问题,完成更深入的探索。也让我明白理论知识的重要性,并且与实际相结合,多动手,在实践中成长。所以我会很重视每一次的实验。我坚信:每次实验都会给我自身很大帮助。慢慢的积累点滴的知识,到最后就会多的。

六、 附录

1、单片机1脉冲产生代码

#include

unsigned char code ET[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned int AT,s;

unsigned int a,b,c,d;

void delay(int counter)

{

int i,j;

for(i = 0;i

for(j =0;j

}

void anjian(void) interrupt 0 //按键进行控制开始产生脉冲

5

{

P30=1;

TR0 =~TR0;

}

void Timer(void) interrupt 1 //中断函数

{

unsigned int count;

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;

}

}

}

void main ()

{

TMOD = (TMOD&0XF0)|0X00; //模式0选择

s = 8192-11059.2/12;

TH0 = s/32;

TL0 = s%32; //初值设定

TR0 = 0;

ET0 = 1;

IT0 = 1;

EX0 = 1;

EA = 1; //定时器的初始化

while (1)

{

if(AT

{

a=AT;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

}

else if(AT

{

6

a=AT%10;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT/10;

P2 = 0xff; //消除鬼影

P1 = 0xfb;

P2 = ET[b];

delay(2);

}

else if(AT

{

a=AT%100%10;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT%100/10;

P2 = 0xff; //消除鬼影

P1 = 0xfb;

P2 = ET[b];

delay(2);

c=AT/100;

P2 = 0xff; //消除鬼影

P1 = 0xfd;

P2 = ET[c];

delay(2);

}

else if(AT

{

a=AT%1000%100%10;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT%1000%100/10;

P2 = 0xff; //消除鬼影

P1 = 0xfb;

P2 = ET[b];

delay(2);

7

c=AT%1000/100;

P2 = 0xff; //消除鬼影

P1 = 0xfd;

P2 = ET[c];

delay(2);

d=AT/1000;

P2 = 0xff; //消除鬼影

P1 = 0xfe;

P2 = ET[d];

delay(2);

} // 数码管进行数字显示部分

}

}

2、单片机2接受脉冲代码

#include

unsigned char code ET[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned int AT;

unsigned int a,b,c,d;

void delay(int counter)

{

int i,j;

for(i = 0;i

for(j =0;j

}

void anjian(void) interrupt 0 //中断函数,触发一次计数一次

{

AT++;

}

void main ()

{

IT0 = 1;

EX0 = 1;

EA = 1; //中断0初始化

while (1)

{

if(AT

{

a=AT;

P2 = 0xff; //消除鬼影

P1 = 0xf7;

P2 = ET[a];

}

8

else if(AT

P2 = 0xff; //消除鬼影 P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT/10;

P2 = 0xff; //消除鬼影 P1 = 0xfb;

P2 = ET[b];

delay(2);

}

else if(AT

{

a=AT%100%10;

P2 = 0xff; //消除鬼影 P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT%100/10;

P2 = 0xff; //消除鬼影 P1 = 0xfb;

P2 = ET[b];

delay(2);

c=AT/100;

P2 = 0xff; //消除鬼影 P1 = 0xfd;

P2 = ET[c];

delay(2);

}

else if(AT

{

a=AT%1000%100%10; P2 = 0xff; //消除鬼影 P1 = 0xf7;

P2 = ET[a];

delay(2);

b=AT%1000%100/10;

P2 = 0xff; //消除鬼影 P1 = 0xfb;

9


相关文章

  • 51单片机定时器实验
  • 电子信息工程学系实验报告 课程名称:单片机原理 实验项目名称:51定时器实验 实验时间:2012-11-27 班级:测控081 姓名: 学号:810707132 实 验 目 的: 熟悉keil仿真软件.伟福仿真器的使用和C51定时程序的编写 ...查看


  • 单片机定时器实验
  • 实验三 单片机内部定时器应用 实验目的 1.理解单片机内部定时器的工作原理及使用方法 2.了解单片机定时中断程序的编写和调试方法 3.掌握定时器的基本使用方法 实验仪器 单片机开发板.万利仿真机.稳压电源.计算机 实验原理 1. 单片机定时 ...查看


  • 定时器中断实验
  • 实验四 定时器中断实验 一 .实验目的 (1)深刻理解对MCS-51单片机定时/计数器内部结构.工作原理和工作方式. (2)掌握定时/计数器工作在定时和计数两种状态下的编程方法. (3)掌握中断服务程序设计方法. 二 .实验设备 计算机 操 ...查看


  • 单片机定时器实验程序
  • ORG 0000H LJMP START ORG 001BH ;定时器/计数器1中断程序入口地址 LJMP INT ORG 0100H START: MOV TMOD,#10H ;计数器置为方式1 MOV TL1,#0B0H ;装入时间常数 ...查看


  • 单片机--中断系统实验-定时器实验
  • 实验三 中断系统实验 一.实验目的 1.完成中断系统的综合实验,包括中断请求源,中断请求标志,中断允许与禁止,中断优先级控制,中断响应过程,外部中断触发方式与中断响应时间等. 2.掌握中断系统的应用知识. 二.实验原理 中断系统的功能:(1 ...查看


  • 实验报告基于AT89C51的液晶显示频率计的设计
  • 本科学生单片机课程设计报告 题 目 基于单片机的频率计设计 姓 名 学 号 院 (系) 专业.年级指导教师 杨 进 宝 课程设计成绩评定表 实评总分 指导教师签名 引言 在设计单片机和数字电路时经常需要测量脉冲个数.脉冲宽度.脉冲周期.脉冲 ...查看


  • 总结计数器使用特点
  • 篇一:计数器及其应用 实验七 计数器及其应用 一.实验目的 1.学习用集成触 发器构成计数器的方法 2.掌握中规模集 成计数器的使用及功能测试方法 3.运用集成计数器构成1/n分频器 二.实验原理 计数器是一个用以 实现计数功能的时序部件, ...查看


  • 单片机教案
  • 吴允志 单 片 机 1 2011年2月21日 08高职电子2班 2 单片机概述(一) 通过本讲教学,要求学生了解单片机的概念及组成.单片机 与通用微机的区别与联系,单片机的特点及其广泛应用.了解本课程的性质.任务及其在本专业中的地位,结合单 ...查看


  • 单片机 四人抢答器 课程设计4
  • 四人抢答器模拟实验报告 一.目的与要求 1. 目的: (1)培养学生综合利用MCS-51单片机的软硬件知识进行程序设计的能力,解决一些实际问题. (2)进一步加深对MCS-51单片机内部结构和程序设计方法的理解. (3)提高学生建立程序文档 ...查看


热门内容