秒表计时器,仿真+程序已成功
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char //无符号字符型宏定义
- #define MS 2000
- uchar code led1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点数码管段码
- uchar code led2[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点数码管段码
- uchar n=0,m=0,j=0,k=0;//四位要显示数据
- uchar keyln=0; //按键值
- sbit key=P3^3; //按键接口
- sbit key2=P3^2;
- sbit key1=P3^1;
- sbit key4=P3^4;
- uchar bit_;
- uchar num;
- uchar z,x,c,v;
- uchar h;
- uchar flag=0;
- uchar val[5][5];
- char val_index;
- uchar bc[4];
- uchar bc2[4];
- void Display2(void) ;
- void Display3(void) ; //显示函数;
- void Delay_ms(uchar s);//延时函数声明
- void Display(void); //显示函数声明
- void disp_1();
- void disp_2();
- void disp_3();
- void disp_4();
- void main(void) // 主函数
- {
- TMOD=0X01; //定时器0方式1
- TH0=(65536-8000)/256; //预设初值高位
- TL0=(65536-8000)%256; //预设初值低位
- ET0=1; //开定时器0中断
- EA=1; //开总中断
- TR0=0; //定时器关
- z=x=c=v=0;
- while(1) //主函数循环
- {
-
- if(key==0) //判断按键是否按下
- {
- Delay_ms(50); //延时,软件消抖
- if(key==0) //再次判断按键是否一直被按下
- {
- TR0=!TR0;
- while(!key); //等待按键弹起
- }
- }
- if(key4==0) //判断按键是否按下
- {
- Delay_ms(50); //延时,软件消抖
- if(key4==0) //再次判断按键是否一直被按下
- {
- n=m=j=k=0;
- while(!key4); //等待按键弹起
- }
- }
- Display();//正常模式下数据
- }
- }
- void timer0(void) interrupt 1 //定时器0中断服务子程序
- {
- TH0=(65536-8000)/256; //重赋初值高位
- TL0=(65536-8000)%256; //重赋初值低位
- //num++;
-
- n++; //秒表最低位+1
- if(n==10) //如果最低位=10
- {
- n=0; //则最低位清0
- m++; //前一位+1
- if(m==10) //以下如此推理
- {
- m=0;
- j++;
- if(j==10)
- {
- j=0;
- k++;
- if(k==6) //当最高位为10时,全部清零
- {
- n=0;
- m=0;
- j=0;
- k=0;
- }
- }
- }
- }
- }
- void Delay_ms(uchar s) //延时函数
- {
- uchar i;
- for(i=0;i<s;i++);
- }
- void Display(void) //显示函数
- {
- P2=0XF7; //最低位
- P1=led1[n];
- Delay_ms(MS);
- P2=0XFF;
- P2=0XFB; //第三位
- P1=led1[m];
- Delay_ms(MS);
- P2=0XFF;
- P2=0XFD; //第二位
- P1=led2[j];
- Delay_ms(MS);
- P2=0XFF;
-
- P2=0XFE; //第一位
- P1=led1[k];
- Delay_ms(MS);
- P2=0XFF;
- }
- void Display2(void) //显示函数
- {
- P2=0XF7; //最低位
- P1=led1[bc[0]];
- Delay_ms(MS);
- P2=0XFF;
- P2=0XFB; //第三位
- P1=led1[bc[1]];
- Delay_ms(MS);
- P2=0XFF;
- P2=0XFD; //第二位
- P1=led2[bc[2]];
- Delay_ms(MS);
- P2=0XFF;
-
- P2=0XFE; //第一位
- P1=led1[bc[3]];
- Delay_ms(MS);
- P2=0XFF;
- }
- void Display3(void) //显示函数
- {
- P2=0XF7; //最低位
- P1=led1[bc2[0]];
- Delay_ms(MS);
- P2=0XFF;
- P2=0XFB; //第三位
- P1=led1[bc2[1]];
- Delay_ms(MS);
- P2=0XFF;
- P2=0XFD; //第二位
- P1=led2[bc2[2]];
- Delay_ms(MS);
- P2=0XFF;
-
- P2=0XFE; //第一位
- P1=led1[bc2[3]];
- Delay_ms(MS);
- P2=0XFF;
-
- }
复制代码
所有资料51hei提供下载(Proteus是7.5版本的工程,不要用高版本打开):
秒表基础版.rar
(73.07 KB, 下载次数: 130)
|