标题: 为什么数字钟数码管显示不出时间 [打印本页]
作者: shuili 时间: 2017-12-3 11:38
标题: 为什么数字钟数码管显示不出时间
不知道怎不知道要怎么调 了 要交作业了 谢谢大家
//****************************头文件********************************
#include<reg51.h>
#include<intrins.h>
//****************************宏定义********************************
#define uchar unsigned char
#define uint unsigned int
//****************************位声明********************************
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit fmq=P2^1;
//************************数码管显示的数值**************************
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
// 0 1 2 3 4 5
0x82,0xf8,0x80,0x90,0xbf,0x0ff};
// 6 7 8 9 - 灭
//****************************函数声明******************************
void jia();
void jian();
//********************数组定义,数组内含有8个数值******************
uchar table1[8],table2[8],table3[8],table4[8];
//**************************时间显示初始值**************************
uchar shi=12,fen=0,miao=0;
//**************************定义全局变量****************************
uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;
uchar shi4,fen4,miao4;
uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3;
// 1秒 等时 位闪 次数 校时 闹1 闹2 闹3
uint flag2;
// 蜂鸣
//*********************延时函数,用于动态扫描数码管*****************
void delay(uchar i)
{ uchar x,y;
for(x=i;x>0;x--)
for(y=120;y>0;y--);
}
//*******************************初始化函数*************************
void init()
{ TMOD=0x01; //工作方式1
TH0=0x3c; //定时时间为:50ms (65536-50000)/256
TL0=0x0b0; //(65536-50000)%256
ET0=1; //打开定时器
EA=1; //开总中断
TR0=1; //启动定时器
}
//********************显示子函数,用于显示时间数值*****************
void display()
{ uchar i,j;
if(cnt!=10||wss==0)
{ table1[0]=miao; //分离秒的个位与十位
table1[1]=miao/10;
}
else
{ table1[0]=table1[1]=11;}
if(cnt!=11||wss==0)
{ table1[3]=fen; //分离分的个位与十位
table1[4]=fen/10;
}
else
{ table1[3]=table1[4]=11;}
if(cnt!=12||wss==0)
{ table1[6]=shi; //分离时的个位与十位
table1[7]=shi/10;
}
else
{ table1[6]=table1[7]=11;}
table1[2]=table1[5]=10;
j=0xbf;
for(i=0;i<=7;i++) //从秒到时的扫描
{ P3=j;
P0=table[table1[i]]; //显示数值
delay(10);
j=_cror_(j,1); //循环右移
}
}
//*******************显示子函数,用于显示定时1时间*****************
void display1()
{ uchar i,j;
if(alm1==0)
{ if(cnt!=1||wss==0)
{ table2[0]=miao1; //以下含义同上
table2[1]=miao1/10;
}
else
{ table2[0]=table2[1]=11;}
if(cnt!=2||wss==0)
{ table2[3]=fen1;
table2[4]=fen1/10;
}
else
{ table2[3]=table2[4]=11;}
if(cnt!=3||wss==0)
{ table2[6]=shi1;
table2[7]=shi1/10;
}
else
{ table2[6]=table2[7]=11;}
}
else
table2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;
table2[2]= table2[5]=10;
j=0xbf;
for(i=0;i<=7;i++)
{ P3=j;
P0=table[table2[i]];
delay(10);
j=_cror_(j,1);
}
}
//********************显示子函数,用于显示定时2时间******************
void display2()
{ uchar i,j;
if(alm2==0)
{ if(cnt!=4||wss==0)
{ table3[0]=miao2; //以下含义同上
table3[1]=miao2/10;
}
else
{ table3[0]=table3[1]=11;}
if(cnt!=5||wss==0)
{ table3[3]=fen2;
table3[4]=fen2/10;
}
else
{ table3[3]=table3[4]=11;}
if(cnt!=6||wss==0)
{ table3[6]=shi2;
table3[7]=shi2/10;
}
else
{ table3[6]=table3[7]=11;}
}
else
table3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;
table3[2]= table3[5]=10;
j=0xbf;
for(i=0;i<=7;i++)
{ P3=j;
P0=table[table3[i]];
delay(10);
j=_cror_(j,1);
}
}
//***************显示子函数,用于显示定时3时间数值****************//
void display3()
{ uchar i,j;
if(alm3==0)
{ if(cnt!=7||wss==0)
{ table4[0]=miao3; //分离秒的个位与十位
table4[1]=miao3/10;
}
else
{ table4[0]=table4[1]=11;}
if(cnt!=8||wss==0)
{ table4[3]=fen3; //分离分的个位与十位
table4[4]=fen3/10;
}
else
{ table4[3]=table4[4]=11;}
if(cnt!=9||wss==0)
{ table4[6]=shi3; //分离时的个位与十位
table4[7]=shi3/10;
}
else
{ table4[6]=table4[7]=11;}
}
else
table4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;
table4[2]= table4[5]=10;
j=0xbf; //从秒到时的扫描
for(i=0;i<=7;i++)
{ P3=j;
P0=table[table4[i]]; //显示数值
delay(10);
j=_cror_(j,1); //循环右移
}
}
//***********************时间子函数 *****************************//
void shijian()
{ if(flag>=20) //判断是否到一秒
{ wss=~wss;
flag=0; //到了,则标志位清零
if(cnt1!=0)
{ miao4++; //秒加1
if( miao4>59) //判断秒是否到60s
{ miao4=0; //到了,则清零
fen4++; //分加1
if(fen4>59) //以下含义同上
{ fen4=0;
shi4++;
if(shi4>23)
shi4=0;
}
}
}
else
{ miao++; //秒加1
if( miao>59) //判断秒是否到60s
{ miao=0; //到了,则清零
fen++; //分加1
if(fen>59) //以下含义同上
{ fen=0;
shi++;
if(shi>23)
shi=0;
}
}
}
}
}
//**************************键盘扫描子函数************************//
void key_scan()
{ if(key1==0)
{ while(!key1) //防止掉显
{ if(cnt==1||cnt==2||cnt==3)
{ display1(); }
if(cnt==4||cnt==5||cnt==6)
{ display2(); }
if(cnt==7||cnt==8||cnt==9)
{ display3(); }
if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
{ display(); }
}
cnt++; //记下按键key1按下的次数
if(cnt==10&&cnt1==0)
{ miao4=miao;
fen4=fen;
shi4=shi;
cnt1++;
}
if(cnt==13)
{ cnt=0;
if(cnt1==1)
{ miao=miao4;
fen=fen4;
shi=shi4;
}
cnt1=0;
}
}
if(key2==0) //判断key2是否按下
{ while(!key2) //防止掉显
{ if(cnt==1||cnt==2||cnt==3)
{ display1(); }
if(cnt==4||cnt==5||cnt==6)
{ display2(); }
if(cnt==7||cnt==8||cnt==9)
{ display3(); }
if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
{ display(); }
}
jia();
}
if(key3==0) //判断key3是否按下
{ while(!key3) //防止掉显
{ if(cnt==1||cnt==2||cnt==3)
{ display1(); }
if(cnt==4||cnt==5||cnt==6)
{ display2(); }
if(cnt==7||cnt==8||cnt==9)
{ display3(); }
if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
{ display(); }
}
jian(); //调用减1子函数
}
if(key4==0) //判断key4是否按下
{while(!key4) //防止掉
{ if(cnt==1||cnt==2||cnt==3)
{ alm1=~alm1;
display1();
}
if(cnt==4||cnt==5||cnt==6)
{ alm2=~alm2;
display2();
}
if(cnt==7||cnt==8||cnt==9)
{ alm3=~alm3;
display3();
}
if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
display();
}
}
}
//****************************加1子函数***************************
void jia()
{ if(cnt==1) //判断key1按下的次数是否为1
{ miao1++; //是,则秒加1
if(miao1>59) //判断秒是否大于60,是,则秒清零
miao1=0;
}
if(cnt==2) //以下含意同上
{ fen1++;
if(fen1>59)
fen1=0;
}
if(cnt==3)
{ shi1++;
if(shi1>23)
shi1=0;
}
if(cnt==4)
{ miao2++;
if(miao2>59)
miao2=0;
}
if(cnt==5)
{ fen2++;
if(fen2>59)
fen2=0;
}
if(cnt==6)
{ shi2++;
if(shi2>23)
shi2=0;
}
if(cnt==7)
{ miao3++;
if(miao3>59)
miao3=0;
}
if(cnt==8)
{ fen3++;
if(fen3>59)
fen3=0;
}
if(cnt==9)
{ shi3++;
if(shi3>23)
shi3=0;
}
if(cnt==10)
{ miao++;
if(miao>59)
miao=0;
cnt1++;
}
if(cnt==11)
{ fen++;
if(fen>59)
fen=0;
cnt1++;
}
if(cnt==12)
{ shi++;
if(shi>23)
shi=0;
cnt1++;
}
}
//***************************减1子函数**************************//
void jian()
{ if(cnt==1) //判断key1按下的次数是否为1,是则秒减1
{ miao1--;
if(miao1==255) //判断秒是否减到255,是,则秒置59
miao1=59;
}
if(cnt==2) //以下含意同上
{ fen1--;
if(fen1==255)
fen1=59;
}
if(cnt==3)
{ shi1--;
if(shi1==255)
shi1=23;
}
if(cnt==4)
{ miao2--;
if(miao2==255)
miao2=59;
}
if(cnt==5)
{ fen2--;
if(fen2==255)
fen2=59;
}
if(cnt==6)
{ shi2--;
if(shi2==255)
shi2=23;
}
if(cnt==7)
{ miao3--;
if(miao3==255)
miao3=59;
}
if(cnt==8)
{ fen3--;
if(fen3==255)
fen3=59;
}
if(cnt==9)
{ shi3--;
if(shi3==255)
shi3=23;
}
if(cnt==10)
{ miao--;
if(miao==255)
miao=59;
cnt1++;
}
if(cnt==11)
{ fen--;
if(fen==255)
fen=59;
cnt1++;
}
if(cnt==12)
{ shi--;
if(shi==255)
shi=23;
cnt1++;
}
}
//***************************闹铃子函数***************************//
void clock()
//判断秒的数值是否相等
{ if(miao==miao1&&alm1==0||miao==miao2&&alm2==0||miao==miao3&&alm3==0)
//是,在判断分是否相等
if(fen==fen1&&alm1==0||fen==fen2&&alm2==0||fen==fen3&&alm3==0)
//是,再判断时是否相等
if(shi==shi1&&alm1==0||shi==shi2&&alm2==0||shi==shi3&&alm3==0)
{ flag2=0; //是,则标志位,flag2清零
while(!(flag2==1200)&&(cnt==0)) //判断flag2是否到1200且不
// 为调时状态
{if(key4==0) //没有,则继续驱动蜂鸣器响
{while(!key4)
flag2=1200;
}
if(flag1>1) //等时方波驱动蜂鸣器
{ fmq=~fmq;
flag1=0;
}
shijian(); //调用时间子函数
display(); //调用显示子函数
}
fmq=1; //关闭蜂鸣器
}
}
//**************************主函数********************************//
void main()
{
init(); //调用初始化子函数
while(1)
{
clock(); //闹钟子函数
if(cnt==1||cnt==2||cnt==3) //显示子函数
{ display1(); }
if(cnt==4||cnt==5||cnt==6)
{ display2(); }
if(cnt==7||cnt==8||cnt==9)
{ display3(); }
if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
{ display(); }
shijian(); //调用时间子函数
key_scan(); //调用键盘扫描子函数
}
}
//**************************定时中断******************************//
void time0() interrupt 1
{ TH0=0x3c; //初值50ms (65536-50000)/256
TL0=0x0b0; // (65536-50000)%256
flag++; //标志位
flag1++;
flag2++;
}
-
U
(43.24 KB, 下载次数: 47)
作者: lhg154 时间: 2017-12-3 13:49
分离时,分,秒那里是个位是%10,
作者: 999333 时间: 2017-12-3 15:05
- #include <reg51.h>
- unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//áDêyÑ¡ÔñÂë
- unsigned char code digittab[3][8]=
- {
- {0x40,0x40,0x44,0x44,0x44,0x44,0x40,0x00},//
- {0x00,0x3c,0x42,0x81,0x81,0x81,0x42,0x3c},//
- {0x00,0x18,0x24,0x42,0x81,0x42,0x24,0x18},//·Åoo×ÖμÄμØ·½
- };
- unsigned int timecount;//¶¨òåê±¼ä¼Æêy′Îêy±äá¿
- unsigned char cnta;//¶¨òåáD
- unsigned char cntb;//¶¨òåDD
- void main(void)
- {
- TMOD=0x01;//ê1óö¨ê±Æ÷T0μÄ·½ê½1
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;//5msÖD¶Ïò»′Î
- EA=1;//ÖD¶Ï×üÔêDí
- TR0=1;//Æô¶ˉ¶¨ê±Æ÷¿aê¼1¤×÷
- ET0=1;//ÔêDí¶¨ê±Æ÷T0ÖD¶Ï
- while(1);//μè′yÖD¶Ï2úéú
- }
- void t0(void) interrupt 1 using 0//ÖD¶Ï·tÎñ3ìDò
- {
- TH0=(65536-5000)/256;//ÖØD¸33õÖμ
- TL0=(65536-5000)%256;
- P2=tab[cnta];
- P1=digittab[cntb][cnta];//DDêy±£3Ö2»±ä£¬áDÿÖD¶Ïò»′μó1
- cnta++;
- if(cnta==8) cnta=0;//ò»DDÖ»óD8¸öêyÂ룬áD¼óμ½8Ö®oó»Øáã
- timecount++;
- if(timecount==200)//200*5=1000msoóDD¼ó1£¬¿ØÖÆÃ¿¸öí¼DÎÏÔê¾μÄê±¼äÎa1000ms£¬¼′Îa1s
- {
- timecount=0;
- cntb++;
- if(cntb==3) cntb=0;//Ö»óDèyDDêyÂ룬DD¼óμ½3Ö®oó»Øáã
- }
- }
复制代码
包含有仿真图和取模软件.docx
(893.88 KB, 下载次数: 15)
-
-
Doc1.docx
34.08 KB, 下载次数: 6
作者: shuili 时间: 2017-12-3 15:07
lhg154 发表于 2017-12-3 13:49
分离时,分,秒那里是个位是%10,
谢谢 但是我改了以后还是那样不应该显示00-00-00格式的么
作者: changle11 时间: 2017-12-3 17:59
uchar code table[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,~0xbf,~0x0ff}; //包行
作者: shuili 时间: 2017-12-3 19:54
changle11 发表于 2017-12-3 17:59
uchar code table[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,~0xbf,~0x0ff}; //包 ...
解决了 谢谢!
作者: showtime 时间: 2017-12-3 20:21
写程序。代码能短就短,这样太多重复的代码,不好查错误
作者: zzzzhhhhaaaaz 时间: 2017-12-3 22:24
数码管显示取反就解决了,这是什么问题/
作者: 哒哒哒阿达 时间: 2018-7-6 15:43
我也做了这个,也是这个程序,但是显示的位置有问题,应该在程序哪里改。
作者: zl2168 时间: 2018-7-7 15:41
实例94 模拟电子钟(由80C51定时器产生秒时基)
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2018-7-7 15:45
实例93 具有校正功能的时钟1302(LED数码管显示)
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
作者: jdddd 时间: 2018-7-7 15:59
数码管是共阴还是共阳
作者: 51DPJxiaobai 时间: 2018-7-7 16:03
电压取反
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |