1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析
使用同款开发板可直接上板测试 文档说明: 实现功能 : 一分钟闹钟 , 调时 ,调闹钟时间 , 年月日与日期切换 ,闹钟年月日与日期切换 , 停止计时 , 调时闪烁:调哪位低位闪烁 实现功能的学习板: 巫妖王 2.0 (不同的开发板,外围电路连接不同)(对应的显示模块等都有不同) 巫妖王 2.0 : p0.0~p0.7,对应七段译码的a,b,c… p2.2,p2.3,p2.4 对应3-8译码器,结果对应位选 Key1 = P3^3; 计时停止(可停止时间调时,可不停止时间,直接调时) Key2 = P3^2; 调位 Key3 = P3^1; 加一 Key4 = P3^0; 切换(按一下日期的年月日,按两下闹钟的时间,按三下闹钟的年月日,按4下,日期; 4次一循环) flag = P1^5; 蜂鸣器 显示格式 : 时-分-秒 年(后两位)-月-日 闪烁 : XX-XX-XX (当调节相应位时,相应位闪烁) 程序框图: 将定时器工作方式改为方式1,定时10ms 蜂鸣器:判断年,月,日,时,分相同时闹:则闹钟调秒无用,闹钟时间为1分钟 (到下次分钟数不一样) 代码: #include #define uchar unsigned char #define uint unsigned int uchar a []={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f}; //0~9译码 uchar second=00,minute=41,hour=13,year=19,month=5,day=31,count; uchar nsecond=00,nminute=21,nhour=14,nyear=19,nmonth=5,nday=31,ns; uchar flag2,flag3,flag4,flag1; #define SEG_CS P0 ///连接数码管 //3-8译码位选,单片机动态显示,不同单片机显示各有不同,**需读者自己针对开发板更改显示代码** ***it ga = P2^2; ***it gb = P2^3; ***it gc = P2^4; // ///功能键 ***it Key1 = P3^3; //计时停止 ***it Key2 = P3^2; //调位 ***it Key3 = P3^1; //加一 ***it Key4 = P3^0; //切换 /// ***it flag = P1^5; //蜂鸣器 高电平有效 ***it LED1 = P1^0; //是否停止计时指示灯 /一毫秒的延迟函数 void Delayms(uint t) { uint i,j; for(i=0;i } / void Dispaly1(uchar second,uchar minute,uchar hour)//时分秒 格式xx(时)-xx(分)-xx(秒) { //位选一 ga=1;gb=1;gc=1; SEG_CS = a[hour/10]; //第1位数码管 Delayms(1); SEG_CS = 0x00; //位选二 ga=0;gb=1;gc=1; if(flag1==3) 对其调时时闪烁 { if(count>50) { SEG_CS = a[hour%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[hour%10];//第2位数码管 Delayms(1); SEG_CS = 0x00; } //位选三 ga=1;gb=0;gc=1; SEG_CS = 0x40; //第3位数码管 横线 Delayms(1); SEG_CS = 0x00; //位选四 ga=0;gb=0;gc=1; SEG_CS = a[minute/10]; //第4位数码管 Delayms(1); SEG_CS = 0x00; //位选五 ga=1;gb=1;gc=0; //第5位数码管 if(flag1==2) { if(count>50) { SEG_CS = a[minute%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[minute%10]; Delayms(1); SEG_CS = 0x00; } //位选六 ga=0;gb=1;gc=0; SEG_CS = 0x40; //第6位数码管 横线 Delayms(1); SEG_CS = 0x00; //位选七 ga=1;gb=0;gc=0; SEG_CS = a[second/10];//第7位数码管 Delayms(1); SEG_CS = 0x00; //位选八 ga=0;gb=0;gc=0; if(flag1==1) { if(count>50) { SEG_CS = a[second%10]; Delayms(1); } //第8位数码管 else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[second%10]; Delayms(1); SEG_CS = 0x00; } } void Dispaly2(uchar day,uchar month,uchar year) //同理时分秒 { ga=1;gb=1;gc=1; SEG_CS = a[day/10]; Delayms(1); SEG_CS = 0x00; ga=0;gb=1;gc=1; if(flag2==3) { if(count>50) { SEG_CS = a[day%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1);} } else { SEG_CS = a[day%10]; Delayms(1); SEG_CS = 0x00; } ga=1;gb=0;gc=1; SEG_CS = 0x40; Delayms(1); SEG_CS = 0x00; ga=0;gb=0;gc=1; SEG_CS = a[month/10]; Delayms(1); SEG_CS = 0x00; ga=1;gb=1;gc=0; if(flag2==2) { if(count>50) { SEG_CS = a[month%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[month%10]; Delayms(1); SEG_CS = 0x00; } ga=0;gb=1;gc=0; SEG_CS = 0x40; Delayms(1); SEG_CS = 0x00; ga=1;gb=0;gc=0; SEG_CS = a[year/10]; Delayms(1); SEG_CS = 0x00; ga=0;gb=0;gc=0; if(flag2==1) { if(count>50) { SEG_CS = a[year%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[year%10]; Delayms(1); SEG_CS = 0x00; } } void Dispaly3(uchar nsecond,uchar nminute,uchar nhour)//时分秒 格式xx-xx-xx { //位选一 ga=1;gb=1;gc=1; SEG_CS = a[nhour/10]; //第1位数码管 Delayms(1); SEG_CS = 0x00; //位选二 ga=0;gb=1;gc=1;//第2位数码管 if(flag3==3) { if(count>50) { SEG_CS = a[nhour%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[nhour%10]; Delayms(1); SEG_CS = 0x00; } //位选三 ga=1;gb=0;gc=1; SEG_CS = 0x40; //第3位数码管 横线 Delayms(1); SEG_CS = 0x00; //位选四 ga=0;gb=0;gc=1; SEG_CS = a[nminute/10]; //第4位数码管 Delayms(1); SEG_CS = 0x00; //位选五 ga=1;gb=1;gc=0;//第5位数码管 if(flag3==2) { if(count>50) { SEG_CS = a[nminute%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else{ SEG_CS = a[nminute%10]; Delayms(1); SEG_CS = 0x00; } //位选六 ga=0;gb=1;gc=0; SEG_CS = 0x40; //第6位数码管 横线 Delayms(1); SEG_CS = 0x00; //位选七 ga=1;gb=0;gc=0; SEG_CS = a[nsecond/10];//第7位数码管 Delayms(1); SEG_CS = 0x00; //位选八 ga=0;gb=0;gc=0; if(flag3==1) { if(count>50) { SEG_CS = a[nsecond%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[nsecond%10]; //第8位数码管 Delayms(1); SEG_CS = 0x00; } } void Dispaly4(uchar nday,uchar nmonth,uchar nyear) //同理时分秒 { ga=1;gb=1;gc=1; SEG_CS = a[nday/10]; Delayms(1); SEG_CS = 0x00; ga=0;gb=1;gc=1; if(flag4==3) { if(count>50) { SEG_CS = a[nday%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[nday%10]; Delayms(1); SEG_CS = 0x00; } ga=1;gb=0;gc=1; SEG_CS = 0x40; Delayms(1); SEG_CS = 0x00; ga=0;gb=0;gc=1; SEG_CS = a[nmonth/10]; Delayms(1); SEG_CS = 0x00; ga=1;gb=1;gc=0; if(flag4==2) { if(count>50) { SEG_CS = a[nmonth%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { SEG_CS = a[nmonth%10]; Delayms(1); SEG_CS = 0x00; } ga=0;gb=1;gc=0; SEG_CS = 0x40; Delayms(1); SEG_CS = 0x00; ga=1;gb=0;gc=0; SEG_CS = a[nyear/10]; Delayms(1); SEG_CS = 0x00; if(flag4==1) { if(count>50) { SEG_CS = a[nyear%10]; Delayms(1); } else { SEG_CS = 0x00; Delayms(1); } } else { ga=0;gb=0;gc=0; SEG_CS = a[nyear%10]; Delayms(1); SEG_CS = 0x00; } } void Keyscan1() { static uchar i=0,j=0; if(Key1==0) { Delayms(10); if(Key1==0) while(!Key1); //key按下并释放后 停止计时(关定时器 TR0=0) i++; } if(i%2==1) { LED1=0; TR0=0; } if(i%2==0) { LED1=1; TR0=1; } if(Key2==0) { Delayms(10); if(Key2==0) while(!Key2); j++; } if(j%4==0) { flag1=0 ; ///调位标志(等于0 调秒,等于1 调分。。。。。。) } if(j%4==1) { flag1=1 ; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); key3按下后 对应位加一 second++; if(second==60) second=0; } } if(j%4==2) { flag1=2; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); minute++; if(minute==60) minute=0; } } if(j%4==3) { flag1=3; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); hour++; if(hour==24) hour=0; } } } void Keyscan2() { static uchar m=0,n=0; if(Key1==0) { Delayms(10); if(Key1==0) while(!Key1); m++; } if(m%2==1) { LED1=0; TR0=0; } if(m%2==0) { LED1=1; TR0=1; } if(Key2==0) { Delayms(10); if(Key2==0) while(!Key2); n++; } if(n%4==0) { flag2=0 ; } if(n%4==1) { flag2=1; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); day++; if(day==30) day=0; } } if(n%4==2) { flag2=2; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); month++; if(month==12) month=0; } } if(n%4==3) { flag2=3; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); year++; if(year==99) year=0; } } //闹钟 }void Keyscan3() { static uchar i=0,j=0; if(Key1==0) { Delayms(10); if(Key1==0) while(!Key1); i++; } if(i%2==1) { LED1=0; TR0=0; } if(i%2==0) { LED1=1; TR0=1; } if(Key2==0) { Delayms(10); if(Key2==0) while(!Key2); j++; } if(j%4==0) { flag3=0 ; } if(j%4==1) { flag3=1; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); nsecond++; if(second==60) nsecond=0; } } if(j%4==2) { flag3=2; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); nminute++; if(minute==60) nminute=0; } } if(j%4==3) { flag3=3; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); nhour++; if(hour==24) nhour=0; } } } void Keyscan4() { static uchar m=0,n=0; if(Key1==0) { Delayms(10); if(Key1==0) while(!Key1); m++; } if(m%2==1) { LED1=0; TR0=0; } if(m%2==0) { LED1=1; TR0=1; } if(Key2==0) { Delayms(10); if(Key2==0) while(!Key2); n++; } if(n%4==0) { flag4=0 ; } if(n%4==1) { flag4=1; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); nday++; if(day==30) nday=0; } } if(n%4==2) { flag4=2; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); nmonth++; if(month==12) nmonth=0; } } if(n%4==3) { flag4=3; if(Key3==0) { Delayms(10); if(Key3==0) while(!Key3); nyear++; if(year==99) nyear=0; } } } // void main() { TMOD=0x01;///利用方式一 //TMOD=0x02;///利用T0方式二 TH0=(65536-10000)/256; TL0=(65536-10000)%256; //TH0=0x00;//赋初值 //TL0=0x06; EA=1; ///开总中断 ET0=1; TR0=1; while(1) { static uchar h=0; if (nyear==year) if(nmonth==month) if(nday==day) if(nhour==hour) if(nminute==minute) 当年月日时分(不含秒)相等时,蜂鸣器响,这样做是为了闹钟持续闹一分钟 { flag=1;/蜂鸣器 放首歌 啦啦啦nn Delayms(1); flag=0; Delayms(1); } if(Key4==0) ///key4 切换(切换顺序 年月日--闹钟时间--闹钟年月日--时间) { Delayms(10); if(Key4==0) while(!Key4); h++; } if(h%4==1) { Dispaly2(year,month,day); Keyscan2(); } if(h%4==2) { Dispaly3(nsecond,nminute,nhour); Keyscan3(); } if(h%4==3) { Dispaly4(nyear,nmonth,nday); Keyscan4(); } if(h%4==0) { Dispaly1(second,minute,hour); Keyscan1(); } } } void int(void) interrupt 1 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; //TH0=0x00; //TL0=0x06; //ns++; // if(ns==40){ //ns=0; count++; if(count==100) { count=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; day++; if(day==30) { day=0; month++; if(month==12) { month=0; year++; if(year==99) { year=0; } } } } } } } //} } |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9055 浏览 16 评论
4086 浏览 18 评论
1174浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 18:09 , Processed in 1.000499 second(s), Total 48, Slave 39 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号