标题: 定时器的问题 [打印本页]
作者: hejiajian 时间: 2008-9-9 20:23
标题: 定时器的问题
要求定时器可以实现三个时间的显示,而且每个时间的初始值可以改变,完成硬件电路设计和软件程序设计,需要完成硬件仿真。(依据见习时间来决定,实物可以暂时不做)
设计指标参数:
(1) 定时时间1。1s-99s,可调。
(2) 定时时间2。1s-99s,可调。
(3) 定时时间3。1min-99min,可调。
(4) 所有时间数字均可调。
(5) 用数码管显示剩余时间。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit p1=P2^3;
void keyscan(uchar z);
void delay(uchar k);
void display(uchar i);
void shezhi();
void playon();
uchar nummiaoge,nummiaoshi,numfenge,numfenshi,numshige,numshishi,tt,num;
uchar code table1[]={0x3f,
0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77};
ding1h=keyscan(0);
ding1l=keyscan(1);
ding2h=keyscan(2);
ding2l=keyscan(3);
ding3h=keyscan(4);
ding3l=keyscan(5);
ding4h=keyscan(6);
ding4l=keyscan(7);
ding5h=keyscan(8);
ding5l=keyscan(9);
ding6h=keyscan(10);
ding6l=keyscan(11);
play=keyscan(12);
zanting=keyscan(13);
close=keyscan(14);
res=keyscan(15);
nummiaoge=P2^0;
nummiaoshi=P2^1;
numfenge=P2^2;
numfenshi=P2^3;
numshige=P2^4;
numshishi=P2^5;
void main()
{
tt=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
shezhi();
playon();
}
}
void keyscan(uchar z)
{
uchar n;
P1=0xfe;
n=P1;
n&=0xf0;
if(n!=0xf0)
{
delay();
P1=0xfe;
n=P1;
n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0xe0):display(0);break;
case(0xd0):display(1);break;
case(0xb0):display(2);break;
case(0x70):display(3);break;
}
}
}
P1=0xfd;
n=P1;
n&=0xf0;
if(n!=0xf0)
{
delay();
P1=0xfd;
n=P1;
n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0xe0):display(4);break;
case(0xd0):display(5);break;
case(0xb0):display(6);break;
case(0x70):display(7);break;
}
}
}
P1=0xfb;
n=P1;
n&=0xf0;
if(n!=0xf0)
{
delay();
P1=0xfb;
n=P1;
n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0xe0):display(8);break;
case(0xd0):display(9);break;
case(0xb0):display(10);break;
case(0x70):display(11);break;
}
}
}
P1=0xf7;
n=P1;
n&=0xf0;
if(n!=0xf0)
{
delay();
P1=0xf7;
n=P1;
n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0xe0):display(12);break;
case(0xd0):display(13);break;
case(0xb0):display(14);break;
case(0x70):display(15);break;
}
}
}
}
void display(uchar i)
{
uchar table2[]={
0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E};
P2=0xfe;
P0=table;
}
void delay(uchar k)
{
uint x,y;
for(x=100;x>0;x--)
for(y=k;y>0;y--);
}
void shezhi()
{
if(ding1h==0)
{
nummiaoge++;
if(nummiaoge==10)
{
nummaioge=0;
}
}
if(ding1l==0)
{
nummiaoge--;
if(nummiaoshi==-1)
{
nummaioshi=9;
}
}
if(ding2h==0)
{
nummiaoshi++;
if(nummiaoshi==10)
{
nummiaoshi=0;
}
}
if(ding2l==0)
{
nummiaoshi--;
if(nummiaoshi==-1)
{
nummiaoshi=9;
}
}
if(ding3h==0)
{
numfensge++;
if(numfenge==10)
{
numfenge=0;
}
}
if(ding3l==0)
{
numfenge--;
if(numfenge==-1)
{
numfenge=9;
}
}
if(ding4h==0)
{
numfenshi++;
if(numfenshi==10)
{
numfenshi=0;
}
}
if(ding4l==0)
{
numfenshi--;
if(numfenshi==-1)
{
numfenshi=9;
}
}
if(ding5h==0)
{
numshige++;
if(numshige==10)
{
numshige=0;
}
}
if(ding5l==0)
{
numshige--;
if(numshige=-1)
{
numshige=9;
}
}
if(ding6h==0)
{
numshishi++;
if(numshishi==10)
{
numshishi=0;
}
}
if(ding6l==0)
{
numshishi--;
if(numshishi==-1)
{
numshishi=9;
}
}
}
void playon()
{
while(1)
{
nummiaoge--;
if(nummiaoge==0)
{
nummiaoshi=nummiaoshi-1;
nummiaoge=9;
if(nummiaoshi==0)
{
numfenge=numfenge-1;
nummiaoshi=9;
if(numfenge==0)
{
numfenshi=numfenshi-1;
numfenge=9;
if(numfenshi==0)
{
numshige=numshige-1;
numfenshi=9;
if(numshige=0)
{
numshishi=numshishi-1;
numshige=9;
}
}
}
}
}
if(numshishi,numshige,numfenshi,numfenge,nummiaoshi,nummiaoge==0)
{
p1=1;
}
}
}
void exter0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}
我有些东西还是不大懂,我不知道怎么样去把键盘的16个键如何去控制6歌数码管的加减!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |