秒表设计策划书.docx
《秒表设计策划书.docx》由会员分享,可在线阅读,更多相关《秒表设计策划书.docx(9页珍藏版)》请在冰豆网上搜索。

秒表设计策划书
单片机的秒表设计
策划书
姓名:
________
班级:
________
一、课题题目
秒表设计——用C51设计一个7SEG-MPX2-CA数码管
显示“秒表”,显示时间为00~60秒,每秒自动加一。
二、课题内容
本课题利用单片机的定时器/计数器定时和记数的原理,结合AT89C51单片机、7SEG-MPX2-CA数码管来设计计时器。
将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。
用C51设计一个7SEG-MPX2-CA数码管显示“秒表”,显示时间为00~60秒,每秒自动加一。
其中设计了两个开关按键:
按一下PB0的按钮开关,即可开始定时。
再按一下PB0按钮开关,即可停止定时。
PB1所接的按钮开关的功能室将秒表归零,按一下PB1按钮开关,则不管有没有定时都要从00开始。
三、需要的元器件
7SEG-MPX2-CA数码管1个
AT89C51单片机1个
BUTTON开关3个
CAP电容3个
CRYSTAL晶振1个
RES电阻3个
四、原理图
如图1简易码表电路图
五、实验流程图
如图2主程序INTO中断子程序
如图3INT0中断子程序INT1中断子程序
如图4T0中断子程序T1中断子程序
六、实验电路图
如图5
如图6
如图7
如图
七、实验程序
;******************************************************************
;/*ch07-5-4.c-码表实验-PB0:
开始/暂停PB1:
归零*/
//==声明区================================
#include//定义8x51暂存器之标头档,P2-17~19
#defineSEGP2//定义七节显示器接至Port2
#defineSCANPP1//定义扫瞄线接至Port1
sbitPB0=P3^2;//PB0按钮接至P3.2(INT0)
sbitPB1=P3^3;//PB1按钮接至P3.3(INT1)
/*声明T0计时相关声明*///THxTLx
#definecount_M150000//T0(MODE1)之计量值,0.05s
#defineTH_M1(65636-count_M1)/256//T0(MODE1)计量高8位元
#defineTL_M1(65636-count_M1)%256//T0(MODE1)计量低8位元
intcount_T0=0;//计算T0中断次数
/*声明T1扫瞄相关声明*/
#definecount_M2250//T1(MODE2)之计量值,0.25ms
#defineTH_M2(256-count_M2)//T1(MODE2)自动载入计量
#defineTL_M2(256-count_M2)//T1(MODE2)计数量
charcount_T1=0;//计算T1中断次数
/*声明七节显示器驱动信号阵列(共阳)*/
charcodeTAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,//数字0-4
0x92,0x83,0xf8,0x80,0x98};//数字5-9
chardisp[2]={0xc0,0xc0};//声明显示区阵列初始显示00
/*声明基本变量*/
charseconds=0;//秒数
charscan=0;//扫瞄信号
voiddebouncer(void);//声明防弹跳函数
//==主程序================================
main()//主程序开始
{IE=0x8f;//10001111,启用INT0/1、TF0/1中断(6-4页)
TCON=0x00;//设定INT0/1采低态动作(6-4页)
TMOD=0x21;//00100001,T1采mode2、T0采mode1
TH0=TH_M1;TL0=TL_M1;//设置T0计数量高8位元、低8位元
TR0=0;//不启动T0(7-7页)
TH1=TH_M2;TL1=TL_M2;//设置T1自动载入值、计数量
TR1=1;//启动T1(7-7页)
P3=0xff;//规划PB0/PB1输入
while
(1);//无穷回圈,程序停滞
}//主程序结束
//==T0中断子程序-计算并显示秒数===================
voidT0_1s(void)interrupt1//T0中断子程序开始
{TH0=TH_M1;TL0=TL_M1;//设置T0计数量高8位元、低8位元
if(++count_T0==20)//若中断20次,即0.05x20=1秒
{count_T0=0;//重新计次
seconds++;//秒数加1
if(seconds==60)//若超过60秒
seconds=0;//秒数归0,重新开始
}//if叙述结束(中断20次)
disp[1]=TAB[seconds/10];//填入十位数显示区
disp[0]=TAB[seconds%10];//填入个位数显示区
}//T0中断子程序结束
//===T1中断子程序-扫瞄===========================
voidT1_8ms(void)interrupt3//T1中断子程序开始
{if(++count_T1==32)//若中断32次,即0.25mx32=8ms
{count_T1=0;//重新计次
if(++scan==3)scan=1;//若超过十位数,显示个位
SEG=0xff;//关闭7段显示器
SCANP=~scan;//输出扫瞄信号
SEG=disp[scan-1];//输出显示信号
}//结束if判断(中断32次)
}//T0中断子程序结束
//==int0中断子程序-码表之开始/暂停==================
voidint0_sw(void)interrupt0//int0中断子程序开始
{TR0=~TR0;//切换T0为开始/暂停
while(PB0==0);//等待放开PB0
debouncer();//防弹跳
}//int0中断子程序结束
//==int1中断子程序-码表归零=======================
voidint1_RST(void)interrupt2//int1中断子程序开始
{while(PB1==0);//等待放开PB1
debouncer();//防弹跳
seconds=0;//秒数归零
disp[0]=disp[1]=0xc0;//显示
}//int1中断子程序结束
//===防弹跳函数=====================================
voiddebouncer(void)//防弹跳函数开始
{inti;//声明变量i
for(i=0;i<2400;i++);//连数2400次,约20ms
}//防弹跳函数结束
;