最简单的数码管应用——数码管时钟
本帖最后由 我是天才 于 2016-12-4 21:15 编辑萝莉大神给大家分享了数码管的原理即驱动,前人栽树,后人乘凉,那么楼主就发表一个时钟教程吧
数码管时钟主要分为三部分,第一部分是数码管的轮流显示,以显示时间;第二部分是按键设置时间;第三部分是如何精准走时
萝莉大神已经教大家按键选择和数码管显示了,所以前两部分就比较容易了,现在只需解决如何精准走时,楼主选择的是利用单片机自带的定时计数器,它的大致原理类似与一边洗衣服一边烧水,等到水开了,水壶就会响,提醒你该灌水了,同样,定时计数器每到一定的时间会提醒单片机时间到了,单片机会先放下手中的工作处理中断事件,处理后继续执行以前的工作。这只是粗略的说说,由于高三时间紧张,就暂时不在此具体解释原理了,希望萝莉大神在以后的教程中会提到,在此先谢过了,哈哈
成品展示: //在帖子后面奉上开源程序文件//
http://www.moz8.com/data/attachment/album/201612/04/184800l1rae9r6gg46eg7a.png插件测试版,显得比较乱
http://www.moz8.com/data/attachment/album/201612/04/184805scoboj2jm0mm4mhz.png精简版,体积小了许多
http://www.moz8.com/data/attachment/album/201612/04/184927kcww0k2t2wtnjmqw.png改装版,钟表笔筒,瞬间逼格大升
http://www.moz8.com/data/attachment/album/201612/04/184732svmhvdhjgdohdjom.png升级版,高三时间紧,所以做卷子一定要速战速决,于是有了升级版,带倒计时,让你的做题变得更高效
//下面奉上精简版程序// /*楼主也是单片机小白,有点自恋地发了教程,由于高三时间紧,教程讲解的也不太详细,如有错误,欢迎大家指出,
[*]
[*]#include<reg51.h>
[*]#define uchar unsigned char
[*]#define uint unsigned int
[*]sbit Key1=P3^7; //按键1
[*]sbit Key2=P3^6; //按键2
[*]sbit Key3=P3^5; //按键3
[*]
[*]sbit L1=P2^7; //小时的十位 数码管的段选接在P0口
[*]sbit L2=P2^6; //小时的个位
[*]sbit L3=P2^5; //闪灯,每秒闪一次
[*]sbit L4=P2^4; //分钟的十位
[*]sbit L5=P2^3; //分钟的个位
[*]
[*]uchar non; // 计时,每到60秒清零,表示1分钟时间到
[*]uchar a; // 分钟的个位
[*]uchar b; // 分钟的十位
[*]uchar c; // 小时的个位
[*]uchar d; // 小时的十位
[*]uinttime; // 每次中断1ms,time+1,time到1000清零,表示1秒时间到
[*]uchar turn; // 数码管轮流显示
[*]uchar Key1_old; // 记录按键1数据
[*]uchar Key2_old; // 记录按键2数据
[*]uchar Key3_old; // 记录按键3数据
[*]uchar set; // 设置时间
[*]uchar action1; // 按键1动作
[*]uchar action2; // 按键2动作
[*]uchar action3; // 按键3动作
[*]uchar select; // 每过10ms进行一次按键选择
[*]
[*]
[*]void Delay1ms() //@12.000MHz
[*]{
[*] unsigned char i, j;
[*]
[*] i = 12;
[*] j = 169;
[*] do
[*] {
[*] while (--j);
[*] } while (--i);
[*]}
[*]
[*]void delay_n_ms(uint n) //定义n毫秒延时
[*]{
[*] while(n)
[*] {
[*] Delay1ms();
[*] n=n-1;
[*] }
[*]}
[*]
[*]uchar code led[]={0xC0,0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,}; //数组
[*] //数组序号 0 1 2 3 4 5 6 7 8 9 10
[*] //实际显示 0 0 1 2 3 4 5 6 7 8 9
[*]
[*]
[*]main()
[*]{
[*]a=1;
[*]b=1; //初始化
[*]c=1;
[*]d=1;
[*]turn=0;
[*]time=0;
[*]set=0;
[*]select=0;
[*]non=1;
[*]Key1_old=1;
[*]Key2_old=1;
[*]Key3_old=1;
[*]
[*] TMOD=0x11; //开启中断0
[*] TH0=(65536-1000)/256; //赋初值
[*] TL0=(65536-1000)%256; //赋初值
[*] EA=1;
[*] ET0=1;
[*] TR0=1;
[*]
[*]while(1)
[*]{
[*]delay_n_ms(1); //系统周期1ms
[*]select=select+1;
[*]turn=turn+1;
[*] if(turn>4)
[*] {
[*] turn=1;
[*] }
[*]
[*]
[*]
[*]
[*]if(set==0) //如果set=0,进行走时
[*]{
[*]
[*]
[*] if(non>59)
[*] {
[*] non=0;
[*] a=a+1;
[*] }
[*] if(a>10)
[*] {
[*] a=1;
[*] b=b+1;
[*] }
[*] if(b>6)
[*] {
[*] b=1;
[*] c=c+1;
[*] }
[*] if(d<3)
[*] {
[*] if(c>10)
[*] {
[*] d=d+1;
[*] c=1;
[*] }
[*] }
[*] if(d==3)
[*] {
[*] if(c>4)
[*] {
[*] c=1;
[*] d=1;
[*] }
[*] }
[*]
[*] if(time<400) //闪灯
[*] {
[*] L3=0;
[*] }
[*] else{L3=1;}
[*]}
[*]
[*]if(select>10) //每10ms进行一次按键选择
[*]{
[*]select=0;
[*]
[*] if(Key1==1) //按键1按下
[*]{
[*]if(Key1_old==0)
[*]{action1=1;}}
[*]Key1_old=Key1;
[*]
[*]if(Key2==1) //按键2按下
[*]{
[*]if(Key2_old==0)
[*]{action2=1;}}
[*]Key2_old=Key2;
[*]
[*]if(Key3==1) //按键3按下
[*]{
[*]if(Key3_old==0)
[*]{action3=1;}}
[*]Key3_old=Key3;
[*]
[*] if(action1==1)
[*]{
[*]action1=0;
[*]set=set+1;
[*]if(set>2)
[*] {
[*] set=0;
[*] }
[*]}
[*]
[*] if(set==1) //设置分钟
[*] {
[*] L3=1;non=1;
[*] if(action2==1) //加
[*] {
[*] action2=0;
[*] a=a+1;
[*] if(a>10)
[*] {
[*] a=1;b=b+1;
[*] }
[*] if(b>6)
[*] {
[*] b=1;
[*] }
[*] }
[*]
[*] if(action3==1) //减
[*] {
[*] action3=0;
[*] a=a-1;
[*] if(a<1)
[*] {
[*] b=b-1;a=10;
[*] if(b<1)
[*] {
[*] b=6;
[*] }
[*] }
[*] }
[*] }
[*]
[*]if(set==2) //设置小时
[*]{
[*] L3=1;non=1;
[*]if(action2==1) //加
[*] { action2=0;
[*] c=c+1;
[*] if(d<3)
[*] {
[*] if(c>10)
[*] {
[*] d=d+1;
[*] c=1;
[*] }
[*] }
[*] if(d==3)
[*] {
[*] if(c>4)
[*] {
[*] c=1;
[*] d=1;
[*] }
[*] }
[*] }
[*]
[*] if(action3==1) //减
[*] { action3=0;
[*] c=c-1;
[*] if(d==1)
[*] {
[*] if(c<1)
[*] {
[*] d=3;
[*] c=4;
[*] } }
[*] if(d==3)
[*] {
[*] if(c<1)
[*] {
[*] d=2;
[*] c=10;
[*] }
[*] }
[*] if(d==2)
[*] {
[*] if(c<1)
[*] {
[*] d=1;
[*] c=10;
[*] }
[*] }
[*] }
[*]}
[*]
[*]}
[*]
[*]if(turn==1) //轮流显示
[*] {
[*] L1=1;L2=0;L4=0;L5=0;
[*] P0=led;
[*] }
[*]
[*]if(turn==2)
[*] {
[*] L1=0;L2=1;L4=0;L5=0;
[*] P0=led;
[*] }
[*]
[*]if(turn==3)
[*] {
[*] L1=0;L2=0;L4=1;L5=0;
[*] P0=led;
[*] }
[*]
[*]if(turn==4)
[*] {
[*] L1=0;L2=0;L4=0;L5=1;
[*] P0=led;
[*] }
[*]}
[*]}
[*]
[*]void T0_time() interrupt 1 //计时器中断,每次中断1ms
[*]{
[*] TH0=(65536-1000)/256; //赋初值
[*] TL0=(65536-1000)%256; //赋初值
[*] time=time+1;
[*]
[*] if(time>998)
[*] {
[*] time=1;
[*] non=non+1; //non加一
[*] }
[*]}
[*]
路过,666666
感谢楼主分享 厉害了
感谢楼主分享 顶!!!
拿分走人,感谢楼主的奉献~
这个厉害了,可惜小白不会弄
不错,做的挺好的。
楼主利害!!!!!!!!!!!!!!!!!!!!
感谢楼主分享 高三的学生!真了不起! 好好好,学习了。
有升级版的程序么?
顶贴是一种美德
同样是学生,,为什么楼主这么吊http://www.moz8.com//mobcent//app/data/phiz/default/23.pnghttp://www.moz8.com//mobcent//app/data/phiz/default/23.pnghttp://www.moz8.com//mobcent//app/data/phiz/default/23.png
aiicsu 发表于 2016-12-6 07:52
有升级版的程序么?
有,改天发上来,那个注释比较少 感谢楼主分享 高三学生有时间搞单片机不易,加油!
q2MxeW4fg6 发表于 2016-12-8 21:45
高三学生有时间搞单片机不易,加油!
谢谢,哈哈 拿分走人,感谢楼主的奉献~
页:
[1]
2