|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 我是天才 于 2016-12-4 21:15 编辑
萝莉大神给大家分享了数码管的原理即驱动,前人栽树,后人乘凉,那么楼主就发表一个时钟教程吧
数码管时钟主要分为三部分,第一部分是数码管的轮流显示,以显示时间;第二部分是按键设置时间;第三部分是如何精准走时
萝莉大神已经教大家按键选择和数码管显示了,所以前两部分就比较容易了,现在只需解决如何精准走时,楼主选择的是利用单片机自带的定时计数器,它的大致原理类似与一边洗衣服一边烧水,等到水开了,水壶就会响,提醒你该灌水了,同样,定时计数器每到一定的时间会提醒单片机时间到了,单片机会先放下手中的工作处理中断事件,处理后继续执行以前的工作。这只是粗略的说说,由于高三时间紧张,就暂时不在此具体解释原理了,希望萝莉大神在以后的教程中会提到,在此先谢过了,哈哈
成品展示: // 在帖子后面奉上开源程序文件//
插件测试版,显得比较乱
精简版,体积小了许多
改装版,钟表笔筒,瞬间逼格大升
升级版,高三时间紧,所以做卷子一定要速战速决,于是有了升级版,带倒计时,让你的做题变得更高效
//下面奉上精简版程序// /*楼主也是单片机小白,有点自恋地发了教程,由于高三时间紧,教程讲解的也不太详细,如有错误,欢迎大家指出,
- #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; // 小时的十位
- uint time; // 每次中断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[a];
- }
- 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[c];
- }
- if(turn==4)
- {
- L1=0;L2=0;L4=0;L5=1;
- P0=led[d];
- }
- }
- }
- 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加一
- }
- }
|
| |