实验2--定时器
计算机学院 学院 计算机科学与技术 专业 10)班__组 学号31110
姓名 协作者______________ 教师评定_______________
实验题目 定 时 器
一、实验目的
1. 学习80C51单片机定时器的使用和编程。
2. 熟悉定时器中断处理程序的编程。
3. 掌握编写数据处理程序。
4. 掌握具体的单片机嵌入式系统的软硬件设计方法。
二、实验内容
1. 打开ISIS 7 Professional,参照“二、实验电路”设计仿真电路原理图。
2. 编写程序实现:
(1). 计时精度百分之一秒的田径比赛电子计时器。
(2). 计时精度百分之一秒的篮球比赛电子计时器。
(3). 计时精度1ms的电子计时器,可实现正计时和倒计时。
要求:按“启动”按钮后,计时器开始工作;按“暂停/继续”按钮后,计时器停止计时,再按“暂停/继续”按钮后,计时器在此基础上开始计时;按“清0”按钮后,计时器变为0;按“退出”按钮后,退出计时。
三、实验电路
四、实验源程序
#include //片内寄存器定义
#include //输入输出函数库
int m=0,s=0,ms=0,ds=0,dm=0;
int stop = 1; // 1 表示现在为停状态, 0 表示现在为运行状态
int cl = 0,exit = 0; // 1 表示Clear键按下
int d0[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
int d1[10]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};
sbit sta_BUTTON = P0^0; // 开始按钮
sbit sc_BUTTON = P0^1; //暂停/继续
sbit clr_BUTTON = P0^2; // 清0按钮
sbit exit_BUTTON = P0^3; // 退出按钮
sbit rect_wave = P0^7;
sbit dec_BUTTON = P0^4; // -1按钮
void Display();
void Display2();
void Delay();
void init();
void initUart();
/*********** main C **************/
void main (void)
{
} initUart(); P1 = 0x00;//初始化 使其全为0 P2 = 0x00; P3 = 0x00; while(1) { if(stop == 0) { if(dec_BUTTON == 0) } Display2(); else Display(); } if(sta_BUTTON == 0) stop = 0; if(clr_BUTTON == 0) init(); while(sc_BUTTON == 0) {} if(exit_BUTTON == 0) {stop = 1;init(); }
void init()
{ P1 = 0x00;//初始化 使其全为0
P2 = 0x00; P3 = 0x00; m=0,s=0,ms=0,ds=0,dm=0;
}
void Display()
{ Delay();
ds=0,dm=0;
ms += 1;
if(ms >= 100)
{ ms = 0; ds=1; } P1 = d1[ms/10]+d0[ms%10] ; s += ds; if(s >=60) { s=0; dm=1; } P2 = d1[s/10]+d0[s%10] ; m += dm; if(m >=60 ) { m=0; } P3 = d1[m/10]+d0[m%10] ; rect_wave = !rect_wave;
}
void Display2()
ds=0,dm=0;
ms -= 1; if(ms == -1) { ms = 99; ds=1; } P1 = d1[ms/10]+d0[ms%10] ; s -= ds; if(s == -1) { s=59; dm=1; } P2 = d1[s/10]+d0[s%10] ; m -= dm; if(m == -1 ) { } m=59; P3 = d1[m/10]+d0[m%10] ;
rect_wave = !rect_wave;
}
void Delay() //延时 5ms
{ int i;
for(i=1000;i>0;i--)
;
}
void t1(void) interrupt 3 using 1 //计时器 1 中断
{ TH1=0xd8; //硬件10ms计时
TL1=0xf5; // TL1=0xf0; TR1=1; ds=0,dm=0; ms += 1; if(ms >= 100) { } s += ds; if(s >=60) { } s=0; dm=1; ms = 0; ds=1; m += dm; if(m >=60 )
}
}
/********** 初始化串口波特率 ************/
//为了使用串行口带格式输出函数printf,串口必须初始化
void initUart(void)/*初始化串口波特率,使用定时器1*/
{
/* Setup the serial port for 9600 baud at 11.0592MHz */
SCON = 0x50;
/* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xfd; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
}
五、实验总结
通过这次实验,我认识了80C51单片机的结构及各个端口的功能,同时,还掌握了怎样在Proteus环境中来导入Keilc环境下的程序来建立两个环境的联系,完成程序和电路图的联系。加深了定时器的使用,以及定时器设置方法的应用,懂得了中断对于程序的作用和定时时间的设定。在这次实验之前,我对中断的概念总是很模糊,不太明白中断子程序该在什么时候执行,直到自己动手用汇编编程,翻书仔细把书中关于中断的部分看了一遍,在结合书上的例题终于对中断有了个大致的了解。