标题:
单片机跑表设计(计时时间存放于结构体变量中)实验
[打印本页]
作者:
liuda
时间:
2015-1-21 23:13
标题:
单片机跑表设计(计时时间存放于结构体变量中)实验
是用51hei单片机开发板 电路图详见:
http://www.51hei.com/f/51hei-5.pdf
的数码管部分, 用2个74hc573 锁存,p0口作为数据口 ,p3.6和p3.7分别是段和位的锁存端口.P2口上面是按键
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//======================
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit D=P3^6;
sbit V=P3^7;
uchar status;
sbit OUT=P1^0;
void delay(uint k);
//================
struct time
{
uchar sec;
uchar msec;
};
struct time run_time,set_time;
struct time *pt1,*pt2;
//===============
void initial(void)
{
TMOD=0x11;
TH0=-(10000/256);
TL0=-(10000%256);
TH1=-(1000/256);
TL1=-(1000%256);
ET0=1;ET1=1;TR1=1;
EA=1;
}
//=================
void time0(void) interrupt 1
{
TH0=-(10000/256);
TL0=-(10000%256);
run_time.msec++;
if(run_time.msec>99){run_time.sec++;run_time.msec=0;}
if(run_time.sec>99){run_time.msec=0;run_time.sec=0;}
if((pt2->msec>0)||(pt2->sec>0))
{
if((pt1->msec==pt2->msec)&&(pt1->sec==pt2->sec)){TR0=0;OUT=0;}
}
}
//==================
void display(uchar cnt)
{
switch(cnt)
{
case 0:D=1;P0=SEG7[run_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[7];V=0;break;
case 1:D=1;P0=SEG7[run_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[6];V=0;break;
case 2:D=1;P0=SEG7[run_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[5];V=0;break;
case 3:D=1;P0=SEG7[run_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[4];V=0;;break;
case 4:D=1;P0=SEG7[set_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[3];V=0;break;
case 5:D=1;P0=SEG7[set_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[2];V=0;break;
case 6:D=1;P0=SEG7[set_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[1];V=0;break;
case 7:D=1;P0=SEG7[set_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[0];V=0;break;
default:break;
}
}
//=======
void set_ms_display(uchar cnt)
{
switch(cnt)
{
case 0:D=1;P0=SEG7[run_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[7];V=0;break;
case 1:D=1;P0=SEG7[run_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[6];V=0;break;
case 2:D=1;P0=SEG7[run_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[5];V=0;break;
case 3:D=1;P0=SEG7[run_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[4];V=0;break;
case 4:D=1;P0=SEG7[set_time.msec%10]|0x80;D=0;P0=0xff;V=1;P0=ACT[3];V=0;break;
case 5:D=1;P0=SEG7[set_time.msec/10]|0x80;D=0;P0=0xff;V=1;P0=ACT[2];V=0;break;
case 6:D=1;P0=SEG7[set_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[1];V=0;break;
case 7:D=1;P0=SEG7[set_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[0];V=0;break;
default:break;
}
}
//==============
void set_s_display(uchar cnt)
{
switch(cnt)
{
case 0:D=1;P0=SEG7[run_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[7];V=0;break;
case 1:D=1;P0=SEG7[run_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[6];V=0;break;
case 2:D=1;P0=SEG7[run_time.sec%10];D=0;P0=0xff;V=1;P0=ACT[5];V=0;break;
case 3:D=1;P0=SEG7[run_time.sec/10];D=0;P0=0xff;V=1;P0=ACT[4];V=0;break;
case 4:D=1;P0=SEG7[run_time.msec%10];D=0;P0=0xff;V=1;P0=ACT[3];V=0;break;
case 5:D=1;P0=SEG7[set_time.msec/10];D=0;P0=0xff;V=1;P0=ACT[2];V=0;break;
case 6:D=1;P0=SEG7[set_time.sec%10]|0x80;D=0;P0=0xff;V=1;P0=ACT[1];V=0;break;
case 7:D=1;P0=SEG7[set_time.sec/10]|0x80;D=0;P0=0xff;V=1;P0=ACT[0];V=0;break;
default:break;
}
}
//================
void time1(void) interrupt 3
{
static uchar cnt;
TH1=-(1000/256);
TL1=-(1000%256);
cnt++;
if(cnt>7)cnt=0;
switch(status)
{
case 5:display(cnt);break;
case 0:display(cnt);break;
case 1:set_ms_display(cnt);break;
case 2:set_s_display(cnt);break;
default:break;
}
}
//==========
void key_s1(void)
{
P2=0xff;
if(P2==0xbf)
{
switch(status)
{
case 1:if(set_time.msec==99)set_time.msec=99;
else set_time.msec++;break;
case 2:if(set_time.sec==99)set_time.sec=99;
else set_time.sec++;break;
default:break;
}
}
}
//===========
void key_s2(void)
{
P2=0xff;
if(P2==0xdf)
{
switch(status)
{
case 1:if(set_time.msec==0)set_time.msec=0;
else set_time.msec--;break;
case 2:if(set_time.sec==0)set_time.sec=0;
else set_time.sec--;break;
default:break;
}
}
}
//===============
void key_s4(void)
{
P2=0xff;
if(P2==0xef){status++;}
if(status==3)status=1;
if(status==6)
{run_time.msec=0;
run_time.sec=0;
status=0;}
}
//============
void key_s3(void)
{
P2=0xff;
if(P2==0x7f){status=5;TR0=1;}
}
//===============
void main(void)
{
pt1=&run_time;pt2=&set_time;
initial();
for(;;)
{
key_s1();
key_s2();
key_s3();
key_s4();
delay(300);
}
}
//================
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1