MCU实验三

更新时间:2023-10-26 03:41:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验三 定时器/计数器

一、实验目的:

1、熟悉单片机内部脉冲计时原理; 2、掌握各种模式下计时程序设计方法;

3、掌握定时器/计数器控制字及计数初值设置方法; 二、实验内容:

1、定时器:内部脉冲计时。振荡频率11.0592MHz。设置T0工作于方式1,分别采用“中断方式”和“查询方式”,实现1s延时。运用此定时,控制P1.0口LED实现每隔1秒状态发生一次反转。

2、计数器:外部脉冲计数。P3.4口接按键,P1口接

2位数显,BCD码方式显示。设置T0工作于方式2,通过

控制字利用T0实现24进制计数,按键每按下一次数显显示数字加1。

三、实验方法: 1、在方式1下,采用20个50ms循环延时的方法,实现1s定时。振荡频率11.0592MHz时,每一次计时长12/11059200=1.085μs,50ms计数则需计数

50*10^3/1.085=46083次,对应计数初值

(65536-46083)。

(1)中断方式:开定时开中断,利用中断矢量,通过定时器溢出触发中断服务。 参考汇编程序:

COUNT EQU 30H ORG 0000H

LJMP START ORG 000BH LJMP INTR0 START:MOV COUNT,#20 ORG 0100H

MOV TMOD,#00000001B MOV TH0,#(65536-46083)/256 //计数初值设定 //工作方式设定50ms MOV TL0,#(65536-46083) MOD 256 延时 SETB ET0 SETB EA SETB TR0 ////开中断启动T0 INTR0:DJNZ COUNT,NOOP SJMP $

CPL P1.0 NOOP: MOV TH0,#(65536-46083)/256 MOV COUNT,#20

MOV TL0,#(65536-46083)MOD 256 SETB TR0 RETI END

(2)查询方式:关定时关中断,通过查询TCON中TF0位,判断是否达到延时上限。

参考汇编程序: COUNT EQU 30H

ORG 0000H

LJMP START

START:MOV COUNT,#20 ORG 0100H

MOV TMOD,#00000001B

MOV TH0,#(65536-46083)/256 ////工作方式设定计数初值设定

50ms延时 MOV TL0,#(65536-46083) MOD 256 CLR ET0 //关中断 CLR EA WAIT:JBC TF0,NOOP SETB TR0 //指定位是否为1,为1则清0并跳转

NOOP:MOV TH0,#(65536-46083)/256 SJMP WAIT

//重设初值

MOV TL0,#(65536-46083)MOD 256

SETB TR0

DJNZ COUNT,WAIT

CPL P1.0

MOV COUNT,#20

RET END

2、设置T0工作于自重装的方式2,计数初值为(2^8-24)。TH0、TL0都赋同样初值,保证TL0溢出后自动从TH0取初值再次计数。开总中断的同时要关闭T0的中断,让其自循环运行。

注意:

(1)TH0中数据保持不变,TL0中数据是从232(2^8-24)开始加1到255的,显示时计数值必须减掉232;

(2)TL0减232后仍为一个十六进制数,交给数显会显示出“A、B、C、D、E、F”的字符,所以必须进行调整。调整的方法有:

a、判断需要输出的数值大小,如果小于10则不需要调整;大于10小于20则+6;大于20则执行2次+6;

b、将需要输出的数值对“十”分别取商取余,将商左移4位,再与余数“或”操作,组合后输出。

参考汇编程序:

ORG 0000H LJMP START START: MOV TMOD,#06H ORG 0100H

MOV TH0,#(256-24) MOV TL0,#(256-24) CLR ET0 SETB EA LOOP: MOV A,TL0 SETB TR0

SUBB A,#232 MOV B,#10 DIV AB

//\取商取余\组合法 RL A

RL A RL A RL A ORL A,B // LJMP DIS // MOV R1,A //\过十加六\调整法// CLR C

// SUBB A,#10 // JC // MOV A,R1 SLV1 // CLR C

// SUBB A,#20 // JC SLV2 // JNC SLV3 //SLV1: MOV A,R1 JMP LOOP // // CLR C //试着将三处“C清零”删除,看看结果如何 //SLV2: MOV A,R1 JMP DIS

// // CLR C

// ADDC A,#6 //SLV3: MOV A,R1 JMP DIS

// // CLR C

// ADDC A,#12 DIS:MOV P1,A JMP DIS SJMP LOOP END

四、实验报告

1、编写C程序分别用“中断方式”和“查询方式”实现1s延时,绘制程序流程图,记录实验结果;

2、在方式1下,调整计数初值或循环次数,使得延时长度尽可能准确到1s;

3、提高要求:在4种定时工作方式1下,采用不同的循环延时方法,实现1s定时。

*4、课程考核项目(最后一周):

(1)利用定时/计数器实现6位24小时制数字时钟; (2)利用定时/计数器实现三方向交通灯; (3)采用“四相单双八拍”方式控制步进电机; (★)利用定时/计数器测试脉冲宽度。 五、思考:

(1)计时程序设计时,将主操作写在主程序中和放在中断服务程序中,对延时精度有什么影响;

(2)若采用方式0,同样实现1s定时,能否仍采用20个50ms延时循环的方式实现,为什么;

(3)对比分析“中断方式”和“查询方式”控制定时器/计数器实现1s延时方法的差异;

(4)实验内容2中,十六进制数显示为十进制形式时必须进行调整。简述需要调整的原因,及“过十加六”和“取商取余”两种方法的原理。

参考C程序:

1(1):

#include sbit LED=P1^0;

unsigned char temp;

void Time0(void) interrupt 1 { temp++;

TH0=(65536-46083)/256; //TH0重装 temp=0;

while(1) //无限查询 { while(TF0) //检测到标志位被置位 { TF0=0; TH0=(65536-46083)/256; //TH0重装 TL0=(65536-46083)%6; //TL0重装 temp++; if(temp==20) { }

TL0=(65536-46083)%6; void main(void) {

EA=1; ET0=1; TMOD=0x01; TH0=(65536-46083)/256; TL0=(65536-46083)%6; TR0=1; temp=0; while(1) { if(temp==20) { LED=~LED; temp=0; }

} } #include 1(2):

sbit LED=P1^0;

unsigned char temp; void main() {

// // EA=0; ET0=0; TMOD=0x01; TH0=(65536-46083)/256; TL0=(65536-46083)%6; TR0=1; TF0=0; //TL0重装 ////T0总中断开//T0中断允许 //TH0模式1 //TL0赋值 //启动定时器赋值 T0 ////关总中断,可省略//T0关T0中断,可省略 //TH0模式1 //TL0赋值 //赋值 //启动标志位清零T0,不可省

LED=~LED; temp=0; } } }

} #include 2:

#include unsigned char temp;

unsigned char gewei,shiwei; void main() { TMOD=0x06; ET0=0; EA=1; TR0=1; TH0=(256-24); TL0=(256-24); while(1) { // temp=TL0-232; // { //“过十加六”调整法 // // if(temp<10) // P1=temp; else if(temp<20) // // P1=temp+6; // else P1=temp+6+6; } { //“取商取余”组合法 shiwei=temp/10; gewei=temp;

}

}

}

shiwei=_crol_(shiwei,4); P1=(shiwei | gewei);

本文来源:https://www.bwwdw.com/article/des2.html

Top