新人发帖: 实验六、实验内容 1. 连线并编制程序。使用定时器1中断,按方式1工作,得到1S的定时;按方式2工作,得到4ms的定时。 2.初始化程序 包括定时器初始化和中断系统初始化。主要对IP,IE,TCON,TMOD 的相应位进行正确的设置,并将时间常数送入定时器中。由于只有定时器中断,IP不必设置。 3.设计中断服务程序和主程序 中断服务程序除了要完成计时工作外,还要实现动态显示。
软件设计:扩展单个按键,使其具有“开启/停止/清除”的功能,开启:可以实现0—99S的计时,停止:能显示记录的时间,清除:具有清除当前记录重新记录数据。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
电路设计参考图
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint usigned int
- #define SEG P2
- uchar key_idx,key_state;
- #define SCANP P1;
- sbit LED=P0^7;
- sbit K1=P1^7;
- char code TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x83,0xf8,0x80,0x98};
- char disp[2]={0xc0,0xc0};
- char seconds=0; //秒数
- char scan=0; //扫描信号
- int count_T0=0; //中断次数
- int count_T1=0;
- void delay(int x)
- {
- uchar i;
- while(x--)
- for(i=0;i<100;i++);
- }
- void key_envent()
- {
- if(key_state==0)
- {
- key_idx=(key_idx+1)%3;
- switch(key_idx)
- {
- case 1:EA=1;TR0=1;break;
- case 2:TR0=0;break ;
- case 0:TR0=1;seconds=0;
- }
- }
- }
- main()
- { key_idx=0; //按键次数(0,1,2,3)
- key_state=1;//按键状态
- IE=0x8a;
- TMOD=0x21;
- TH0=(65636-50000)/256;
- TL0=(65636-50000)%256;
- TR0=1;
- TH1=256-250;
- TL1=256-250;
- TR1=1;
- LED=1;
- while(1)
- {
- if(key_state!=K1)
- {
- delay(10);
- key_state=K1;
- key_envent();
- }
- }
- }
- //T0中断子程序,计算显示秒数
- void T0_1s(void) interrupt 1
- { TH0=(65636-50000)/256;
- TL0=(65636-50000)%256;
-
- if(++count_T0==20) //20*0.05=1s
- {
- count_T0=0;
- if(key_idx==1) seconds++;
- if(seconds==100)
- { seconds=0;
- LED=~LED;}
-
- }
- disp[1]=TAB[seconds/10];
- disp[0]=TAB[seconds%10]; //个位
- }
- void T1_8ms(void) interrupt 3
- {
- if(++count_T1==32) //0.25*32=8ms
- { count_T1=0;
- if(++scan==3) scan=1;
- SEG=0xff;
- P1=~scan;
- SEG=disp[scan-1];
- }
- }
复制代码
所有资料51hei提供下载:
实验六.zip
(49.42 KB, 下载次数: 46)
|