单片机定时器程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十一定时器实验三
一、实验要求
1.将P2口和四个数码管的数据口相连,P1口和位选线相连接,电路用共阳极;
2.数码管显示4位从前两位分钟、后两位为秒;分钟和秒的值从00到59增加;
3.实现定时器1S的定时,每1S时间到时,使秒钟加一,当秒钟为60时,显示为00
秒,分钟加一;当分钟为60时,显示为00分,从新开始一个小时的计时。
#include
#define SEG7P P2 //定义数码管就接口在P2口
#define SCANP P1 //定义P3口为数码管位选口unsigned char TAB[]={ 0xc0,0xf9,0xa4,0xb0,0x99, //数字0~4的码值
0x92,0x83,0xf8,0x80,0x98 }; //数字5~9的码值unsigned int show_s,show_m; //定义变量show_s,show_m void Get_disp(char show_s1,char show_m1); //声明赋值函数
void Display(); //声明显示函数
void delay_ms(int x); //声明延时函数
char disp[4]; //定义显示数字数组
char scan[4]={0xfe,0xfd,0xfb,0xf7}; //定义位选扫描数组
main() //主程序的开始
{
SEG7P=0xff; //赋初值关闭数码管
IE=0x82; //开启中断总开关和定时器0开关
TMOD=0x01; //设置模式为1
TR0=1; //开启定时器0
TH0=(65535-50000)/256; //设置定时器初值,计数高八位
TL0=(65535-50000)%256; //计数低八位
while(1) //无穷循环
{
Get_disp(show_s,show_m); //调用赋值函数
Display(); //调用显示函数}
}
/*****定时器0中断子函数*****/
void TF_0(void) interrupt 1
{
int T;
TH0=(65535-50000)/256; //重新转载定时器的初值
TL0=(65535-50000)%256;
T++; //计数自增
if(T==20) //判断T
{
T=0; //T回到初值
show_s++; //秒自增
if(show_s>=60) //秒计到60
{
show_s=0; //秒回到0
show_m++; //分自增
if(show_m>=60)
show_m=0;
}
}
}
/*****disp数组赋值函数*****/
void Get_disp(char show_s1,char show_m1)
{
disp[0]=show_m1/10; //显示千位
disp[1]=show_m1%10; //显示百位
disp[2]=show_s1/10; //显示十位
disp[3]=show_s1%10; //显示个位
}
/*****显示函数*****/
void Display() //声明延迟函数
{
char i; //声明变量
for(i=0;i<4;i++) //for语句开始 {
SCANP=scan[i]; //扫描位选
SEG7P=TAB[disp[i]]; //赋值到数码管
delay_ms(5); //延时5ms }
}
/******延时函数******/
void delay_ms(int x) //延迟函数开始