用做比赛用的秒表计数器,可以发出滴答声
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
附件
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <string.h>
- #define u16 unsigned int
- #define u8 unsigned char
- sbit DX=P2^0;
- sbit WX=P2^1;
- sbit FM=P2^3;
- sbit K1=P3^2;
- sbit K2=P3^3;
- int n,k,x;
- void delay_ms(u16 x)//毫秒延时函数
- {u16 i,j;
- for(i=0;i<x;i++)
- for(j=0;j<115;j++);
- }
- u8 code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x00}; //共阴数码管编码
- void print_u16_LED(u16 n)//输出16位无符号整数(0-65535)到6位数码管
- {u8 t=0xdf,i=0,j;
- if(n<100)
- {
- for(j=0;j<3;j++)
- {
- P0=0xff; //消影
- WX=1;//允许更新位码
- P0=t; //送位码
- WX=0;//锁存位码
-
- P0=0x00; //消影
- DX=1;//允许更新段码
- //P0=table[n%10]; //送段码
- if(i==3) P0=table[n%10]|0x80;
- else P0=table[n%10];
- DX=0;
- n=n/10;
- t=_cror_(t,1);
- delay_ms(3);
- }
- }
- else
- while(n)
- {
- P0=0xff; //消影
- WX=1;//允许更新位码
- P0=t; //送位码
- WX=0;//锁存位码
-
- P0=0x00; //消影
- DX=1;//允许更新段码
- //P0=table[n%10]; //送段码
- if(i==3) P0=table[n%10]|0x80;
- else P0=table[n%10];
- DX=0;
- n=n/10;
- t=_cror_(t,1);
- i++;
- delay_ms(3);
- }
- }
- void print_float_LED(float n,u8 x)
- {u8 temp;
- int i;
- char str[7];
- switch(x)
- {case 1:sprintf(str,"%.1f",n);break;
- case 2:sprintf(str,"%.2f",n);break;
- case 3:sprintf(str,"%.3f",n);break;
- case 4:sprintf(str,"%.4f",n);break;
- case 5:sprintf(str,"%.5f",n);break;
- }
- i=strlen(str)-1; //从最低位开始输出
- temp=0xdf;
- while(i>=0)
- {
- P0=0XFF; /*消除P0的值*/
- WX=1; /*位选输入有效*/
- P0=temp; /*输出位选码*/
- WX=0; /*位选锁存*/
- P0=0; /*消除P0的值*/
- DX=1; /*段选输入有效*/
- if(str[i]=='-') P0=0x40; //显示‘-’
- else P0=table[str[i]-'0']; //显示数字
- DX=0; /*段码锁存*/
- temp=_cror_(temp,1);
- i--;
- delay_ms(1);
- }
- }
- void main()
- {u8 i,t;
- FM=1;
- TMOD=0x00;
- TL0=(8192-1000)%32;
- TH0=(8192-1000)/32;
- TL1=(8192-1000)%32;
- TH1=(8192-1000)/32;
- IT0=1;
- IT1=0;
- EX0=1;
- EX1=1;
- EA=1;
- ET0=1;
- ET1=1;
- TR1=1;
- while(1)
- print_u16_LED(n);
- }
- void intr0() interrupt 0
- {
- TR1=~TR1;
- }
- void intr1() interrupt 2
- {
- TR1=0;
- n=0;
- }
- void time0() interrupt 1
- {
- TL0=(8192-1000)%32;
- TH0=(8192-1000)/32;
- FM=~FM;
- k++;
- if(k==100) {k=0;TR0=0;}
- }
- void time1() interrupt 3
- {
- TL1=(8192-1000)%32;
- TH1=(8192-1000)/32;
- n++;
- if(n%1000==0) TR0=1;
- }
复制代码
所有资料51hei提供下载:
秒表.zip
(22.46 KB, 下载次数: 35)
|