功能:计时器相当于秒表,有四个按键分别是开始,存储,回显和复位。
器件:at89c51、两个74H573、排阻、数码管、led、电阻等。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- #define duan P0
- #define wei P2
- /*******端口定义*******/
- sbit deng=P1^0;
- sbit seg_sel=P1^4;
- sbit bit_sel=P1^5;
- sbit start=P3^2;
- sbit store=P3^3;
- sbit diskey=P3^4;
- sbit reset=P3^5;
- /*******变量定义*******/
- u16 tem_ms;
- u8 temp_buf[5][3];
- u8 arr_pt;
- u8 run_flag;//为1开始计数
- u8 n_ten_ms,n_sec,n_min;
- u8 code seg_table[]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; //段选
- u8 code bit_table[]={0x01,0x02,0x04,0x08,
- 0x10,0x20,0x40,0x80 //位选 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xbf}
- };
- void delay(u16 num)
- {
- u16 x,y;
- for(x=num;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display_led(u8 which_bit,u8 which_number)
- {
- bit_sel=1;
- wei=bit_table[which_bit];
- bit_sel=0;
- seg_sel=1;
- duan=seg_table[which_number];
- seg_sel=0;
- }
- void display(u8 which_bit,u8 which_number)
- {
- u8 x,y;
- x=which_number/10;//分离十位
- y=which_number%10;//分离个位
- display_led(5,16);
- delay(2);
- display_led(2,16);
- delay(2);
- if(which_bit==1)
- {
- display_led(6,y);
- delay(2);
- display_led(7,x);
- delay(2);
-
- }
- if(which_bit==2)
- {
- display_led(4,y);
- delay(2);
- display_led(3,x);
- delay(2);
-
- }
- if(which_bit==3)
- {
- display_led(1,y);
- delay(2);
- display_led(0,x);
- delay(2);
-
- }
- }
- void reflash(void)
- {
- display(1,n_ten_ms);
- display(2,n_sec);
- display(3,n_min);
- }
- int main(void)
- {
- TMOD=0x01;
- TH0=(65535-10000)/256;
- TL0=(65535-10000)%256;
- EA=1;
- ET0=1;//开放定时器0的溢出中断
- //TR0=1;
- while(1)
- {
- if(start==0)//开始程序
- {
- deng=0;
- delay(5);
- if(start==0)
- {
- run_flag=~run_flag;
- }while(!start);
- }
- if(reset==0)//复位程序
- {
- deng=1;
- delay(5);
- if(reset==0)
- {
- n_ten_ms = 0;
- n_sec = 0;
- n_min = 0;
- }while(!reset);
-
- }
- if(store==0)//存储程序
- {
- delay(5);
- if(store==0)
- {
- if((arr_pt>=0)&&(arr_pt<5))
- temp_buf[arr_pt][0]=n_ten_ms;
- temp_buf[arr_pt][1]=n_sec;
- temp_buf[arr_pt][2]=n_min;
- arr_pt++;
- }while(!store);
- }
- if(run_flag)//运行模式标志位
- {
- TR0=1;//开始计数
- }
-
- else if(!run_flag)
- {
- TR0=0;
- if(diskey==0)//回显程序
- {
- delay(5);
- if(diskey==0)
- {
- arr_pt--;
- n_ten_ms= temp_buf[arr_pt][0];
- n_sec= temp_buf[arr_pt][1];
- n_min= temp_buf[arr_pt][2];
- }while(!diskey);
- }
- }
- reflash();
- }
- }
- void t0_server(void) interrupt 1//中断服务函数
- {
- TH0=(65535-10000)/256;
- TL0=(65535-10000)%256;
- n_ten_ms++;
- if(n_ten_ms>=80)
- {
- n_ten_ms=0;
- n_sec++;
- if(n_sec>=60)
- {
- n_sec=0;
- n_min++;
- if(n_min>=60)
- n_min=0;
- }
- }
- }
复制代码
所有资料51hei提供下载:
计时器.rar
(75.4 KB, 下载次数: 192)
|