新人发帖:
实验六、实验内容
1. 连线并编制程序。使用定时器1中断,按方式1工作,得到1S的定时;按方式2工作,得到4ms的定时。
2.初始化程序
包括定时器初始化和中断系统初始化。主要对IP,IE,TCON,TMOD 的相应位进行正确的设置,并将时间常数送入定时器中。由于只有定时器中断,IP不必设置。
3.设计中断服务程序和主程序
中断服务程序除了要完成计时工作外,还要实现动态显示。
软件设计:扩展单个按键,使其具有“开启/停止/清除”的功能,开启:可以实现0—99S的计时,停止:能显示记录的时间,清除:具有清除当前记录重新记录数据。
仿真原理图如下
单片机源程序如下:
#include
#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];
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』