利用单片机设计电子时钟,求助程序
利用单片机设计一个有16个按键输入,6位数字输出显示的电子时钟。1.能用6位数码管实时显示时间,格式为XX.XX.XX,初始显示为12.00.00,即12时0分0秒,计时周期为24小时;
2.按下“设置”键进入时、分、秒预调试状态;
3.按下“时、分、秒”键可进行相应的初始值设置;
4.设置完成后,按“启动”键即可启动时钟;
5.按下“清除”键可清除已输入的初始值,重新进行设置。
具体情况下面图片介绍的有。
急用,有会的单片机大神,帮帮忙,在这里先谢谢了。
答案:#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
void delayms(uchar);
uint shi=12,fen=0,miao=0,num,key,y,flag2,flag3;
bit flag,flag1;
uchar code tb1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar tb2;
uchar mm;
void keyscan()
{
uchar temp,temph,templ,k;
P3=0xf0;
temp=P3;
temph=temp&0xf0;
if(temph!=0xf0)
{
delayms(10);
temp=P3;
temph=temp&0xf0;
if(temph!=0xf0)
{
P3=0x0f;
temp=P3;
templ=temp&0x0f;
k=temph^templ;
switch(k)
{
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break;
case 0x7e:key=3;break;
case 0xed:key=4;break;
case 0xdd:key=5;break;
case 0xbd:key=6;break;
case 0x7d:key=7;break;
case 0xeb:key=8;break;
case 0xdb:key=9;break;
case 0xbb:key=10;flag3=1;TR1=0;break; //设置键
case 0x7b:key=11;shi=fen=miao=0;TR1=0;break; //清零键
case 0xe7:key=12;flag2=3;break; //设置时
case 0xd7:key=13;flag2=2;break; //设置分
case 0xb7:key=14;flag2=1;break; //设置秒
case 0x77:key=15;TR1=1;flag2=0;mm=0;break;//启动
}
if(flag2>=1)
{
mm=key;
}
while(temph!=0xf0)
{
P3=0xf0;
temp=P3;
temph=temp&0xf0;
}
}
}
}
void display() //显示
{
uchar k,t=0x01;
tb2=shi/10;
tb2=shi%10;
tb2=fen/10;
tb2=fen%10;
tb2=miao/10;
tb2=miao%10;
for(k=0;k<6;k++)
{
dula=1;
if(k==1|k==3)
P0=tb1]|0x80;
else P0=tb1];
dula=0;
P0=0xff;
wela=1;
P0=~t;
wela=0;
delayms(10);
t=t<<1;
}
}
void shezhi() //设置
{
if(flag2==1&&flag3==1)
{
miao=mm+mm*10;
}
if(flag2==2&&flag3==1)
{
fen=mm+mm*10;
}
if(flag2==3&&flag3==1)
{
shi=mm+mm*10;
}
}
void delayms(uchar xms) //延时
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
TMOD=0x20;//定时器T1工作方式2
TH1=(256-250);
TL1=(256-250);//周期为250us
EA=1;
ET1=1;
TR1=0;
while(1)
{
display();
if(flag2>=1)
shezhi();
keyscan();
}
}
void t1_time() interrupt 3 //定时器中断
{
num++;
if(num==4000)//4000*250us=1s
{
num=0;
if(flag==0)//正计时
{
miao++;
if(miao>=60)
{
miao=0;
fen++;
}
if(fen>=60)
{
fen=0;
shi++;
}
if(shi>=24)
{
shi=0;
P0=0x00;
}
}
if(flag==1) //倒计时
{
miao--;
if(miao==0)
{
if(fen!=0)
{
fen--;
miao=60;
miao--;
}
else
if(shi!=0)
{
shi--;
fen=60;
fen--;
miao=60;
miao--;
}
else
if(miao==0&&fen==0&&shi==0)
TR1=0;
}
}
}
}
在这里也谢谢大家对我的帮助。谢谢大家 首先规划设计比如I/O口的分配,键盘列阵方式,数码管扫描方式。
假设最简单的16位键盘就是4x4 矩阵键盘 用到8个I/O口 如下(记得接10K上拉电阻):
然后写出对应的扫描程序。扫描程序会写吧? 高4位分别置一,然后读取低四位的值,或者反过来也行根据实际硬件编写就行了。 就可以得出当前所按下的按键了。
然后就是数码管了。 数码管6位,纯粹I/O口驱动的话 需要 6+8个I/O即段选8位位选6位(位选需要接三极管驱动,具体哪个三极管方便看你用共阴共阳了。记得加限流电阻)
如果是用单体数码管 用6只的话可以用6个锁存器用静态显示方式。程序设计会方便很多。
然后根据要求编写程序就行了。
主要是要注意键盘扫描以及如果是动态显示的话数码管的扫描,合理分配机器时间。计时采用定时器去做,千万不要用延迟去做哈,main里面扫描和显示即可,定时器计时。
自己动手做吧,这个算是单片机入门的一个小进步,就像易语言你刚开始学会了做hello world后突然学会做个钓鱼软件一个道理。
网上有很多类似的代码,自己去百度 课程设计?还是毕业设计? 多用度娘~~~~~~~~~~~~~~~ 不难的,你可以在设计中学到很多东西。 你这不会是微机原理的实验作业吧 认真设计一个,进步才大 我有电子时钟程序,目前唯一缺一个全部清零的功能,不过可以加上去 发错论坛了,应该去电子论坛 自己写 做自己坚强的后盾!上大学都成年了 不会就去思考,查资料
页:
[1]
2