始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再拨“开始”按键则又可重新开始计时。方框图图3.4所示 :
图3.4 数字秒表设计导向图
3.2.2.课程设计仪器
集成电路芯片8051,七段数码管,MCS-51系列单片机微机仿真课程系统中的软件(Keil uvision2),protues仿真软件。 3.3 程序流程及实验效果 3.3.1 程序流程图
开始
初始化 判断是否开启中断计时 N 等待中断发生 Y 调用显示子程序
调用开关子程序 图3.5 主程序流程图
选择按键 按键1 复位00.0 按键2 按键3 按键4 按一下,复位99.9 按一下,正计时开倒计时开始;再按始,再按一下,停下,停止。 止。 图3.6 按键流程图
计时数值入口 计时数值除以送显示到第一个数码管 100 显示秒十位 计时数值减去秒十位乘以100在送显示到第二个数除以10 码管 显示秒个位 计时数值减去秒十位、秒个位 送显示到第三个数码显示微秒 管
图3.7 显示流程图
计时开始
时1.0s计是否到
3.3.2 源程序及说明
#include
sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7;
uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7c,0x07, 0x7f,0x67};
N Y 秒位加 1 N 计时是否到 10s Y 十秒位加 1
图3.8 计时流程图
//52 系列单片机头文件 //宏定义 //申明四个按键的锁存端 //含有 0~9 的数字数组 uchar code table2[]={ //含有 0~9 的数字数组(带小数点) 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfc,0x87, 0xff,0xe7};
void delayms(uint); //声明延时函数 void display(uchar,uchar,uchar); //声明显示函数 void keyscan(); //声明按键函数 uchar num1,num2,bai,shi,ge; //变量声明 uint num;
void main() //主函数入口 {
TMOD=0x11; //设置 TO,T1 定时器
TH0=(65536-45872)/256; //装初值11.05992M晶振50ms数为45872 TL0=(65536-45872)%6; TH1=(65536-45872)/256; TL1=(65536-45872)%6;
EA=1; //开总中断
ET0=1; //开启定时器 T0 中断 ET1=1; //开启定时器 T1 中断
while(1) //程序停在这里等待中断的发生,这个大循环也是实现数据显示的主体 {
keyscan(); //三个数码管要选送的数据 bai=num/100; //百位 shi=(num-100*bai)/10; //十位 ge=num-100*bai-shi*10; //个位
display(bai,shi,ge); //数码管显示 } }
void display(uchar bai, uchar shi,uchar ge) {
P1=0xfe; //位选选中第一个数码管 P2=table[bai]; //送段选数据 delayms(10); //延时 P1=0xff; //关闭位选
P1=0xfd; //位选选中第二个数码管
P2=table2[shi]; //送段选数据 delayms(10); //延时
P1=0xff; //关闭位选
P1=0xfb; //位选选中第二个数码管 P2=table[ge]; //送段选数据 delayms(10); //延时
P1=0xff; //关闭位选
}
void delayms(uint xms) //延时子函数 {
uint i,j; for(i=xms;i>0;i--) //i=xms 即延时约 xms 毫秒 for(j=110;j>0;j--); }
void keyscan() {
if(key1==0) //清零 {
delayms(10); //延时去抖 if(key1==0)
{ while(!key1) //等待按下 {
TR0=0; //定时器 TR0 关闭