秒表实验十二实验目的1、复习独立按键、数码管和定时器的相关知识点;2、初步掌握利用单片机完成综合项目的能力。实验设备与文件PC机、stc89c52实验箱、USB线、杜邦线、Stc89c52实验板原理图。OTXE独立键盘模块1AAA#88V4HCS78.8.8.8.8.8.8.8.1111RAA数码管锁存器模块8位共阴极数码管图1原理图
1 实验十二 秒表 一、 实验目的 1、复习独立按键、数码管和定时器的相关知识点; 2、初步掌握利用单片机完成综合项目的能力。 二、 实验设备与文件 PC 机、stc89c52 实验箱、USB 线、杜邦线、stc89c52 实验板原理图。 图 1 原理图
三、实验内容及步骤1、利用keil4软件搭建好实验环境;2、实现0~99秒的计时,在数码管上显示秒计时数(到达99秒后重新从0开始);按下S2键,暂停计时,按下S3键,继续计时,达到类似秒表的效果;3、实现秒小数点后第一位和第二位计时数值的显示。2
2 三、 实验内容及步骤 1、 利用 keil4 软件搭建好实验环境; 2、 实现 0~99 秒的计时,在数码管上显示秒计时数(到达 99 秒后重新从 0 开始);按下 S2 键,暂停计时,按下 S3 键,继续计时,达到类似秒表的 效果; 3、 实现秒小数点后第一位和第二位计时数值的显示
四、实验参考程序按下键盘中的S2键,暂停计时:按下S3键,继续计时/晶振为11.0592MHz#include<reg52.h>#defineucharunsignedcharsbit du-P2^6;sbit we=P2^7;sbit S2=P3^0;sbit S3=P3^1;/halt表示是否暂停,pp是50毫秒计时,m是1秒计时unsigned char halt,j,k,pp,m;I数码管段选表ucharcodeleddata[]=1"0"0x3F,/"1"0x06,1"2"0x5B,1"3"0x4F,1"4"0x66,1"5"0x6D,0x7D,1/"6"1"7"0x07,1"8"0x7F,I"9"0x6F,II"A"0x77,0x7C,"B"I"C"0x39,I"'D"0x5E,I"E"0x79,I"F"0x71,I"H"0x76,0x38,II"L"I/"n"0x37,0x3E,I"u"I"P"0x73,I"0"0x5C,/"_"0x40,1/熄灭0x00,1"."0x803;3
3 四、 实验参考程序 //按下键盘中的 S2 键,暂停计时;按下 S3 键,继续计时 //晶振为 11.0592MHz #include<reg52.h> #define uchar unsigned char sbit du=P2^6; sbit we=P2^7; sbit S2=P3^0; sbit S3=P3^1; //halt 表示是否暂停,pp 是 50 毫秒计时,m 是 1 秒计时 unsigned char halt,j,k,pp,m; //数码管段选表 uchar code leddata[]= { 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F, //"9" 0x77, //"A" 0x7C, //"B" 0x39, //"C" 0x5E, //"D" 0x79, //"E" 0x71, //"F" 0x76, //"H" 0x38, //"L" 0x37, //"n" 0x3E, //"u" 0x73, //"P" 0x5C, //"o" 0x40, //"-" 0x00, //熄灭 0x80 //"." };
void Delay_Ms(unsigned char i)for(j-ij>0;j--)for(k=125;k>0;k--);1void display(uchar Value)du= 1,1/显示百位PO = leddata[Value/10];du = 0;PO = 0xff,1/清除段码we=1;II第一位数码管PO = Oxfe;we = 0,Delay_Ms(5);du= 1;/显示十位PO = leddata[Value%10];du= 0;PO = Oxff,1/清除段码we = 1;P0 = 0xfd;I/第二位数码管we=0;Delay_Ms(5);voidkeyscan()tif(S2==0)Delay_Ms(10);if(S2==0)1/暂停键按下1halt=1;3if(S3-0)halt=0;14
4 void Delay_Ms(unsigned char i) { for(j=i;j>0;j-) for(k=125;k>0;k-); } void display(uchar Value) { du = 1; P0 = leddata[Value/10]; //显示百位 du = 0; P0 = 0xff; //清除段码 we = 1; P0 = 0xfe; //第一位数码管 we = 0; Delay_Ms(5); du = 1; P0 = leddata[Value%10]; //显示十位 du = 0; P0 = 0xff; //清除段码 we = 1; P0 = 0xfd; //第二位数码管 we = 0; Delay_Ms(5); } void keyscan() { if(S2==0) Delay_Ms(10); if(S2==0) //暂停键按下 { halt=1; } if(S3==0) halt=0; }
void main()TMOD=0x01;TH0=(65536-46080)/256;TL0-(65536-46080)%256;ET0=1;TR0=1,EA=1;pp =0;m= 0;while(1)1keyscan();if(halt==0)1如果没有暂停1TRO=1;if(pp==20)//1s时间到pp=0;1//m是秒计时m++;if(m>99)1m=0,13display(m);3/如果暂停了elseTRO=0;display(m);31/50ms计时void time00 interrupt1TH0=(65536-46080)/256;TL0-(65536-46080)%256pp++;5
5 void main() { TMOD=0x01; TH0=(65536-46080)/256; TL0=(65536-46080)%256; ET0=1; TR0=1; EA=1; pp = 0; m = 0; while(1) { keyscan(); if(halt==0) //如果没有暂停 { TR0=1; if(pp==20) //1s 时间到 { pp=0; m++; //m 是秒计时 if(m>99) { m=0; } } display(m); } else //如果暂停了 TR0=0; display(m); } } void time0() interrupt 1 //50ms 计时 { TH0=(65536-46080)/256; TL0=(65536-46080)%256; pp++; }