八个数码管显示当前日期
- 格式:doc
- 大小:161.50 KB
- 文档页数:4
8位时间格式
8位时间格式是一种用于表示时间的格式,由8个数字字符组成,通常用于精确表示时间,包括小时、分钟和秒。
这种格式常见于计算机系统中,特别是在程序设计和数据存储中。
在8位时间格式中,前两位数字表示小时数(24小时制),中间两位数字表示分钟数,最后两位数字表示秒数。
例如,“12345678”可以解读为12时34分56秒78毫秒。
常见的8位时间格式有24小时制和12小时制。
24小时制使用00-23来表示小时,例如“14:00:00”表示下午2点。
12小时制使用1-12来表示小时,并且可以使用AM 或PM来表示上午或下午,例如“04:00 PM”。
此外,还有其他的时间格式,例如军事时间格式,它使用00-24来表示小时,但很少用于普通时间表示。
使用8位时间格式的优点包括:
1)标准化:为不同系统和程序提供统一的方式来表示时间,有助于数据交换和
处理。
2)精确度:提供毫秒级别的精确度,适用于需要高精度计时或记录事件发生顺
序的场景。
3)易于比较:所有时间信息均编码为数字,方便进行比较操作。
在具体使用时,需要注意输入验证、转换与解析、存储与传输等方面。
同时,由于其精确性和便利性,8位时间格式广泛应用于计算机编程、数据存储和传输等领域。
8位数码管显示电子时钟c51单片机程序时间:2012-09-10 13:52:26 来源:作者:/*8位数码管显示时间格式 05—50—00 标示05点50分00秒S1 用于小时加1操作S2 用于小时减1操作S3 用于分钟加1操作S4 用于分钟减1操作*/#include<reg52.h>sbit KEY1=P3^0; //定义端口参数sbit KEY2=P3^1;sbit KEY3=P3^2;sbit KEY4=P3^3;sbit LED=P1^2; //定义指示灯参数code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0—9unsigned char StrTab[8]; //定义缓冲区unsigned char minute=19,hour=23,second; //定义并初始化为 12:30:00void delay(unsigned int cnt){while(--cnt);}/******************************************************************//* 显示处理函数*//******************************************************************/void Displaypro(void){StrTab[0]=tab[hour/10]; //显示小时StrTab[1]=tab[hour%10];StrTab[2]=0x40; //显示"-"StrTab[3]=tab[minute/10]; //显示分钟StrTab[4]=tab[minute%10];StrTab[5]=0x40; //显示"-"StrTab[6]=tab[second/10]; //显示秒StrTab[7]=tab[second%10];}main(){TMOD |=0x01; //定时器0 10ms inM crystal 用于计时TH0=0xd8; //初值TL0=0xf0;ET0=1;TR0=1;TMOD |=0x10; //定时器1用于动态扫描TH1=0xF8; //初值TL1=0xf0;ET1=1;TR1=1;EA =1;Displaypro(); //调用显示处理函数while(1){if(!KEY1) //按键1去抖以及动作{delay(10000);if(!KEY1){hour++;if(hour==24)hour=0; //正常时间小时加1 Displaypro();}}if(!KEY2) //按键2去抖以及动作{delay(10000);if(!KEY2){hour--;if(hour==255)hour=23; //正常时间小时减1 Displaypro();}}if(!KEY3) //按键去抖以及动作{delay(10000);if(!KEY3){minute++;if(minute==60)minute=0; //分加1Displaypro();}}if(!KEY4) //按键去抖以及动作{delay(10000);if(!KEY4){minute--;if(minute==255)minute=59; //分减1Displaypro();}}}}/******************************************************************//* 定时器1中断 */ /******************************************************************/void time1_isr(void) interrupt 3 using 0 //定时器1用来动态扫描{static unsigned char num;TH1=0xF8; //重入初值TL1=0xf0;switch (num){case 0:P2=0;P0=StrTab[num];break; //分别调用缓冲区的值进行扫描 case 1:P2=1;P0=StrTab[num];break;case 2:P2=2;P0=StrTab[num];break;case 3:P2=3;P0=StrTab[num];break;case 4:P2=4;P0=StrTab[num];break;case 5:P2=5;P0=StrTab[num];break;case 6:P2=6;P0=StrTab[num];break;case 7:P2=7;P0=StrTab[num];break;default:break;}num++; //扫描8次,使用8个数码管if(num==8)num=0;}/******************************************************************//* 定时器0中断 */ /******************************************************************/void tim(void) interrupt 1 using 1{static unsigned char count; //定义内部局部变量TH0=0xd8; //重新赋值TL0=0xf0;count++;switch (count){case 0:case 20:case 40:case 60:case 80:Displaypro();break; //隔一定时间调用显示处理case 50:P1=~P1;break; //半秒 LED 闪烁default:break;}if (count==100){count=0;second++; //秒加1if(second==60){second=0;minute++; //分加1if(minute==60){minute=0;hour++; //时加1if(hour==24)hour=0;}}}}基于单片机的LCD1602控制总线模式时间:2012-09-10 13:50:39 来源:作者:第一行显示"Welcome";第二行显示="Happy day";若要显示其他字符,请直接往数组LCMLineOne[16]和LCMLineTwo[16]填充相应的代码。
用数码管(8位)显示的数字时钟程序用数码管(8位)显示的数字时钟,由于是在开发板上写的程序,所以51单片机的一些I/O口设定并不完全一样,以下程序仅供参考#include<reg52.h>sbit dula=P2^6; //段选锁存器sbit wela=P2^7; //位选锁存器sbit key1=P3^2; //INT0 选择键sbit key2=P3^4; //T0 时间增加sbit key3=P3^6; //S4 时间减少char a=0,hour=0,minute=0,seconed=0;char h1,h2,m1,m2,s1,s2;char num=0;char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(char z){char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display_hour(char h) //显示小时{h1=h/10;h2=h%10;wela=1;P0=0xfe; //1111 1110wela=0;P0=0xff;dula=1;P0=table[h1];dula=0;delay(5);wela=1;P0=0xfd; //1111 1101wela=0;P0=0xff;dula=1;P0=table[h2];delay(5);}void display_minute(char m) //显示分钟{m1=m/10;m2=m%10;wela=1;P0=0xf7; //1111 0111wela=0;P0=0xff;dula=1;P0=table[m1];dula=0;delay(5);wela=1;P0=0xef; //1110 1111wela=0;P0=0xff;dula=1;P0=table[m2];dula=0;delay(5);}void display_seconed(char s) //显示秒{s1=s/10;s2=s%10;wela=1;P0=0xbf; //1011 1111wela=0;P0=0xff;dula=1;P0=table[s1];dula=0;delay(5);wela=1;P0=0x7f; //0111 1111P0=0xff;dula=1;P0=table[s2];dula=0;delay(5);}void init() //初始化函数{TMOD=0x01; //定时器0工作方式1TH0=(65536-45872)/256; //装初值晶振11.0592 50ms为45872 TL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //开启定时器0}void key() //按键函数,功能为对时间进行调整{if(key1==0) //key1键按下进入选择并停止定时器{delay(10);while(!key1); //松手检测TR0=0;num++; //没按一次key1 num自加1}if(num==1) //key1按一次进行“小时”调整{if(key2==0) //key2按下时间增加{delay(10);while(!key2);hour++;if(hour==24)hour=0;}if(key3==0) //key3按下时间减少{delay(10);hour--;if(hour<0)hour=23;}}if(num==2) //按下key1两次进行“分钟调整”{if(key2==0){delay(10);while(!key2);minute++;if(minute==60)minute=0;}if(key3==0){delay(10);while(!key3);minute--;if(minute<0)minute=59;}}if(num==3) //key1按下三次对“秒”进行调节{if(key2==0){delay(10);while(!key2);seconed++;if(seconed==60)seconed=0;}if(key3==0){delay(10);seconed--;if(seconed<0)seconed=59;}}if(num==4) //key1按下四次认为调节完毕开启定时器并将num清0 {num=0;TR0=1;}}void main(){init();while(1){display_seconed(seconed); //显示“秒,分,时”display_minute(minute);display_hour(hour);if(a==20) //判断定时器是否到1s{a=0;seconed++;if(seconed>59){seconed=0;minute++;if(minute>59){minute=0;hour++;if(hour>23){hour=0;}}}}key();}}void time() interrupt 1 {TH0=(65536-45872)/256; TL0=(65536-45872)%256; a++;}。
八段数码管的字型代码
八段数码管是一种电子显示设备,它通常由8个LED组成,用于显示数字、字母和符号等信息。
八段数码管的字型代码是一组二进制数字,用于控制数码管中各个LED的亮灭,以形成不同的字符。
八段数码管的字型代码通常以共阳极和共阴极两种形式表示。
在共阳极形式中,公共阳极接高电平,当二极管导通时,对应的笔划段发亮,由发亮的笔划段组合而显示各种字符。
在共阴极形式中,公共阴极接地(为零电平),当二极管导通时,对应的笔划段发亮,由发亮的笔划段组合而显示各种字符。
例如,对于共阴极八段数码管,当公共阴极接地,阳极hgfedcba各段为0111011时,数码管显示器显示“P”字符,即对于共阴极八段数码管,“P”字符的字形码是73H。
不同的八段数码管可能具有不同的字型代码,因此在使用八段数码管之前,需要查阅相关的规格说明书或技术文档,以确定其字型代码的编码方式和使用方法。
用数码管(8位)显示的数字时钟程序
一、程序概述
本程序使用单片机AT89S52,通过数码管(8位)显示当前时间,支持12小时制和24小时制切换,精度为秒。
二、程序实现
程序首先定义了数码管的连接方式和每个数字的位图数据,然后定义了时间变量和函数,包括:
1.初始化函数:设置数码管端口和时钟计数器的计数方式。
2.读时钟函数:读取时钟计数器及寄存器,返回当前时间的小时、分钟和秒数。
3.显示函数:将当前时间转化为8个数码管显示的位图数据,用数字和符号映射表将数字和符号的位图数据与数码管连接方式对应起来,输出到数码管上。
在主函数中,程序初始化后循环执行读时钟函数和显示函数,实现时钟的实时显示。
三、程序特点
1.采用8位数码管显示,时间更加直观。
2.支持12小时制和24小时制切换,适用于不同场景。
3.实现精度为秒的实时显示,更加准确。
四、程序优化
1.增加闹钟功能,提醒用户打卡或者起床。
2.加入温度传感器模块,实现显示温度的功能。
3.优化显示效果,增加字体和颜色等选项。
五、程序应用
本程序可应用于家庭、办公室、学校等场合,用于显示时间,提醒用户合理安排时间和时间管理,也可作为DIY电子制作的教学和实验材料,提高学生的动手实践能力和电子信息技术水平。
长沙学院《单片机原理及应用》课程设计说明书题目 LED数码管显示电子秒表设计系(部) **系专业(班级) *************姓名邹部长9931学号******指导教师***起止日期 2016.12.19—2016.12.24《单片机原理及应用》课程设计任务书1系(部):**系专业:******长沙学院课程设计鉴定表目录摘要 (5)第一章概述 (6)1.1电子秒表的设计要求 (6)1.2电子秒表的电路图 (6)1.3电子秒表的设计原理及方案 (7)第二章电子秒表的程序设计 (8)2.1 程序设计流程图 (8)2.2程序设计源代码 (10)第三章程序的调试 (16)第四章设计总结 (17)参考文献 (18)摘要随着经济与社会的发展对智能化和信息化技术要求的不断提高,单片机作为智能控制的核心,逐渐渗透到社会生产和生活的各个方面。
而本文则主要阐述基于单片机设计的数码管秒表,这次设计所采用的的单片机为stc89c52单片机,数码管则是使用2个4位共阴LED数码管组成的8位。
为减少I/O口,而使用了SM74HC138 和74HCT573这2片芯片实现数码管显示8位数据。
利用单片机内部定时器实现计时功能,分别显示为:分—秒—0.01秒。
控制则是使用一键控制,可实现计时开始,计时暂停,计时清零3个功能的循环。
本次的程序设计采用C语言编写,包括显示程序,定时中断服务程序,延时程序。
最后在单片机电路板来观察工作状态。
第一章概述1.1电子秒表的设计要求○1显示要求在初始状态显示的是00—00—00,最左边的2位显示分钟,中间2位显示秒,左边2位显示十分之一秒和百分之一秒,还有个2个LED数码管只显示中间那一段,用作间隔符。
○2然后还的有一个键用来控制秒表,要求按第一下开始计时,按第二下暂停计时,按第三下清零,以此往复循环控制。
○3使用单片机T0方式实现计时0.01秒。
1.2电子秒表的电路图1.3电子秒表的设计原理及方案设计原理根据单片机本身的定时计数器实现1秒的计时。
八位共阴极数码管编码
八位共阴极数码管是一种常见的数码显示器件,它由八个LED
数码管组成,每个数码管可以显示数字0-9。
编码是指将数字转换
为对应的LED亮灭模式,以下是八位共阴极数码管的常见编码方式:
1. 共阴极数码管的编码方式是通过控制各个LED的阳极或阴极
来实现数字的显示。
在八位共阴极数码管中,每个数码管有七个段(a-g)和一个小数点(dp)。
2. 数字0的编码方式是abcdef,即a、b、c、d、e、f段同时
点亮,dp段熄灭。
3. 数字1的编码方式是bc段同时点亮,其余段熄灭。
4. 数字2的编码方式是abged段同时点亮,c和f段熄灭。
5. 数字3的编码方式是abcdg段同时点亮,e和f段熄灭。
6. 数字4的编码方式是bcfg段同时点亮,a、d、e段熄灭。
7. 数字5的编码方式是acdfg段同时点亮,b和e段熄灭。
8. 数字6的编码方式是acdefg段同时点亮,b段熄灭。
9. 数字7的编码方式是abc段同时点亮,d、e、f、g段熄灭。
10. 数字8的编码方式是abcdefg段同时点亮。
11. 数字9的编码方式是abcdfg段同时点亮,e段熄灭。
以上是八位共阴极数码管常见的数字编码方式。
通过控制各个
段的亮灭状态,可以显示不同的数字。
需要注意的是,具体的编码
方式可能会因不同的数码管厂商而有所差异,以上是一种常见的编
码方式,但并不代表所有八位共阴极数码管都是如此编码。
8位共阴极数码管动态显示时间,可调节,调节的数闪烁显示//本例程为共阴极数码管;//在普中单片机上通过实验;//8位数码管动态显示时间,可调节,//调节时间时,调节的数闪烁显示;//比较两种闪烁的方法;#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit tiaojie=P3^0;sbit jia=P3^1;sbit jian=P3^2;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};uchar a,b,num1,num2,flag100ms,flag1s,flagtj;uchar miao,fen,shi,flagjia,flagjian;bit flag_1s;uchar code wela[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar dula[8]={0,0,1,1,2,2,3,3};void delay(uint z);void intc();void keyscan();void disp();void main(){intc();while(1){keyscan();disp();}}//================void intc(){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1;EA=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;a++;if(a==10){flag100ms=1;}if(a==100){a=0,flag1s=1,miao++;flag_1s=~flag_1s;}if(miao==60){miao=0,fen++;}if(fen==60){fen=0,shi++;if(shi>12)shi=1;}}//====================void disp(){uchar i;dula[7]=miao%10;dula[6]=miao/10;dula[5]=10;dula[4]=fen%10;dula[3]=fen/10;dula[2]=10;dula[1]=shi%10;dula[0]=shi/10;/*switch(flagtj)//第一种方法实现闪烁显示{case 1: if(flag_1s==1){dula[7]=11;dula[6]=11;}else{dula[7]=miao%10;dula[6]=miao/10;}break;case 2: if(flag_1s==1){dula[4]=11;dula[3]=11;}else{dula[4]=fen%10;dula[3]=fen/10;}break;case 3: if(flag_1s==1){dula[1]=11;dula[0]=11;}else{dula[1]=shi%10;dula[0]=shi/10;}break;case 0:break;}for(i=0;i<8;i++){ P0=table[dula[i]];P2=wela[i];delay(10);P0=0;}*/for(i=0;i<8;i++)//第二种闪烁显示方法{switch(flagtj){case 1:if(i>5&&i<8){if(flag_1s==1)P0=0;elseP0=table[dula[i]];}elseP0=table[dula[i]];break;case 2:if(i>2&&i<5){if(flag_1s==1)P0=0;elseP0=table[dula[i]];}elseP0=table[dula[i]];break;case 3:if(i>=0&&i<2){if(flag_1s==1)P0=0;elseP0=table[dula[i]];}elseP0=table[dula[i]];break;case 0:P0=table[dula[i]];break;}P2=wela[i];delay(10);P0=0;}}//=====================void delay(uint z){uint x;uchar y;for(x=0;x<z;x++)for(y=0;y<112;y++);}//===========================void keyscan(){if(tiaojie==0)delay(100);if(tiaojie==0){while(!tiaojie);flagtj++;if(flagtj>3)flagtj=0;}if(jia==0)delay(100);if(jia==0){while(!jia);flagjia=1;}if(jian==0)delay(100);if(jian==0){while(!jian);flagjian=1;}if(flagtj!=0)switch(flagtj){ case 1: if(flagjia==1){flagjia=0;miao++;if(miao>60)miao=0;}if(flagjian==1) {flagjian=0;if(miao<1)miao=1;miao--;}break;case 2: if(flagjia==1) {flagjia=0;fen++;if(fen>60)fen=0;}if(flagjian==1) {flagjian=0;if(fen<1)fen=1;fen--;}break;case 3: if(flagjia==1) {flagjia=0;shi++;if(shi>12)shi=1;}if(flagjian==1) {flagjian=0;if(shi<1)shi=1;shi--;}break;}}//===============。
本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能!本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能!C程序:#include <reg51.h>unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一维数组定义-9、横杠、全灭unsigned char num[12]={2,0,0,9,3,5,0,7,0,1,2,0} ;unsigned char a[8];unsigned char second=0,minute=0,hour=0,year=0,mon=1,day=1,day1,hsec,sec_m,min_m,N,temp1;unsigned char minute1=0,hour1=0;unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描unsigned char k=0;unsigned int temp; // 记录毫秒为秒的变量unsigned char M,S_flag; //M是模式,更新时间的种模式加上正常模式 S_flag闪烁标志sbit K0=P3^7; //K0是闹钟起停标志位sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;sbit BEEP=P3^3;void delay(unsigned n) //0.2毫秒{int x,y;for(x=0;x<n;x++)for(y=0;y<24;y++);}void init1()S_flag=0; //闪烁标志位TMOD=0x10; //定时器以方式定时TH1=0xfc;TL1=0x18;EA=1; //打开总中断ET1=1; //允许定时器中断TR1=1; //开启定时器(开始定时计数)}void init0(){TMOD=0x01; //定时器以方式定时TH0=0xff;TL0=0xff;EA=1; //打开总中断ET0=1; //允许定时器中断TR0=0; //关闭定时器(关闭定时计数)}void display_led() //流动显示学号{int x;char l,a,m;for(a=0;a<21;a++){x=a-8;for(l=0;l<6;l++){for(m=0;m<8;m++){P2=b[m];if(x>=0&&x<12) P1=led[num[x]];else P1=led[11];delay(10);x++;}x-=8;}}}void display() //显示时钟及显示调节位{switch(M){case 0:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 1:{if(S_flag==1){a[0]=led[hour/10];a[1]=led[hour%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 2:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];if(S_flag==1)a[3]=led[minute/10];a[4]=led[minute%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 3:{if(S_flag==1){a[0]=led[year/10];a[1]=led[year%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}break;case 4:{a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];if(S_flag==1){a[3]=led[mon/10];a[4]=led[mon%10];}elsea[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}break;case 5:{a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];if(S_flag==1){a[6]=led[day/10];a[7]=led[day%10];}else{a[6]=led[11];a[7]=led[11];}}break;case 6:{if(S_flag==1){a[0]=led[hour1/10];a[1]=led[hour1%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute1/10];a[4]=led[minute1%10];a[5]=led[10];a[6]=led[11];a[7]=led[11];}break;case 7:{a[0]=led[hour1/10];a[1]=led[hour1%10];a[2]=led[10];if(S_flag==1){a[3]=led[minute1/10];a[4]=led[minute1%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[11];a[7]=led[11];}}}void key_prc() //时钟和闹钟调节{if(K1==0){delay(10); //延时去抖if(K1==0) //按K1进行模式切换{ M++;if(M==8)M=0;}while(!K1);//等待按键释放}if(M!=0){switch(M){case 1: //模式--调时{if(K2==0){delay(10); //延时去抖if(K2==0) //加键按下{if(hour<23) hour++;else hour=0;}while(!K2); //等待按键释放}if(K3==0){delay(10);if(K3==0){if(hour> 0) hour--;else hour=23;}while(!K3);}} break;case 2: //模式--调分{if(K2==0){delay(10);if(K2==0){if(minute<59) minute++;else minute=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(minute>0) minute--;else minute=59;}while(!K3);}} break;case 3: //模式--调年{if(K2==0){delay(10);if(K2==0){if(year<99) year++;else year=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(year>0) year--;else year=99;}while(!K3);}} break;case 4: //模式--调月{if(K2==0){delay(10);if(K2==0){if(mon<12) mon++;else mon=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(mon>1) mon--;else mon=12;}while(!K3);}if(year%4==0&&mon==2)day1=29;//闰年2月为29天if(year%4!=0&&mon==2)day1=28;//非闰年2月为28天if(mon==4|mon==6|mon==9|mon==11)day1=30;if(mon==1|mon==3|mon==5|mon==7|mon==8|mon==10|mon==12)day1=31;} break;case 5: //模式--调日{if(K2==0){delay(10);if(K2==0){if(day<day1) day++;else{day=1;}}while(!K2);}if(K3==0){delay(10);if(K3==0){if(day>1) day--;else{day=day1;}}while(!K3);}} break;case 6: //模式--闹钟调时{if(K2==0){delay(10);if(K2==0){if(hour1<23)hour1++;else hour1=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){ if(hour1>0)hour1--;else hour1=23;}while(!K3);}} break;case 7: //模式--闹钟调分{if(K2==0){delay(10);if(K2==0){if(minute1<59)minute1++;else minute1=0;}while(!K2);}if(K3==0){delay(10); //延时去抖if(K3==0) //减键按下{ if(minute1>0)minute1--;else minute1=59;}while(!K3);}} break;}}}void display_rq() //年月日显示{if(K2==0){delay(10);if(K2==0){a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}while(!K2); //等待按键释放}void key_prc2() //秒表模式转换{if(M==0){if(K3==0){delay(10); //延时去抖if(K3==0) //按K3进行模式切换{ N++;if(N==2)N=0;}while(!K3);//等待按键释放}}}void display_sec() //秒表显示{if(N==1){a[0]=led[min_m/10];a[1]=led[min_m%10];a[2]=led[10];a[3]=led[sec_m/10];a[4]=led[sec_m%10];a[5]=led[10];a[6]=led[hsec/10];a[7]=led[hsec%10];if(K2==0){delay(10); //延时去抖if(K2==0) //加键按下{TR0=!TR0;}while(!K2); //等待按键释放}}void res_sec() //秒表复位{if(K1==0){delay(10);if(K1==0){min_m=0;sec_m=0;hsec=0;M=0;}while(!K1) ;}}void main() //主程序{display_led();init0();init1();while(1){key_prc();key_prc2();if(N==1){display_sec();res_sec();}else{display_rq();display();}}}void time1() interrupt 3 //定时器中断函数{if(year%4==0&&mon==2)day1=29;//闰年2月为29天if(year%4!=0&&mon==2)day1=28;//非闰年2月为28天if(mon==4|mon==6|mon==9|mon==11)day1=30;if(mon==1|mon==3|mon==5|mon==7|mon==8|mon==10|mon==12)day1=31; TH1=0xfc; //定时msTL1=0x18;temp++;if(temp==1000) //配合定时器定时s{ temp=0;second++;}if(second==60){ second=0;if(minute<59)minute++;else { minute=0;hour++;if(hour==24){hour=0;day++;if(day>day1){day=1;mon++;if(mon>12){mon=1;year++;if(year==99){year=0;}}}}}}if(hour1==hour&&minute1==minute&&K0==0) //闹钟时间到{BEEP=!BEEP;}if(temp%250==0) //每msS_flag=!S_flag; //闪烁标志位取反if(k==8) k=0;P1=a[k];P2=b[k++];delay(1);P2=0xff;}void sec_clo() interrupt 1 //秒表程序中断{TH0=0xff;TL0=0xff;temp1++;if(temp1==150){temp1=0;hsec++;if(hsec==100){hsec=0;sec_m++;if(sec_m==60){sec_m=0;min_m++;if(min_m==100){min_m=0;}}}}}仿真电路图:。
8位数码管显示电子时钟c51单片机程序欧阳引擎(2021.01.01)时间:2012-09-10 13:52:26 来源:作者:/*8位数码管显示时间格式 05—50—00 标示05点50分00秒S1 用于小时加1操作S2 用于小时减1操作S3 用于分钟加1操作S4 用于分钟减1操作*/#include<reg52.h>sbit KEY1=P3^0; //定义端口参数sbit KEY2=P3^1;sbit KEY3=P3^2;sbit KEY4=P3^3;sbit LED=P1^2; //定义指示灯参数code unsigned chartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0—9unsigned char StrTab[8]; //定义缓冲区unsigned char minute=19,hour=23,second; //定义并初始化为12:30:00void delay(unsigned int cnt){ while(--cnt);}/**************************************************** **************//* 显示处理函数*//***************************************************** *************/void Displaypro(void){StrTab[0]=tab[hour/10]; //显示小时StrTab[1]=tab[hour%10]; StrTab[2]=0x40; //显示"-"StrTab[3]=tab[minute/10]; //显示分钟StrTab[4]=tab[minute%10]; StrTab[5]=0x40; //显示"-" StrTab[6]=tab[second/10]; //显示秒StrTab[7]=tab[second%10];}main(){ TMOD |=0x01; //定时器0 10ms inM crystal用于计时 TH0=0xd8; //初值 TL0=0xf0; ET0=1;TR0=1;TMOD |=0x10; //定时器1用于动态扫描TH1=0xF8; //初值 TL1=0xf0; ET1=1; TR1=1;EA =1; Displaypro(); //调用显示处理函数while(1) { if(!KEY1) //按键1去抖以及动作 { delay(10000); if(!KEY1) { hour++;if(hour==24)hour=0; //正常时间小时加1 Displaypro(); } }if(!KEY2) //按键2去抖以及动作{ delay(10000); if(!KEY2){ hour--;if(hour==255)hour=23; //正常时间小时减1Displaypro(); } } if(!KEY3) //按键去抖以及动作 { delay(10000);if(!KEY3) { minute++;if(minute==60)minute=0; //分加1 Displaypro(); } } if(!KEY4)//按键去抖以及动作 { delay(10000); if(!KEY4) { minute--;if(minute==255)minute=59; //分减1 Displaypro(); } } }}/******************************************************************//* 定时器1中断*//******************************************************************/void time1_isr(void) interrupt 3 using 0 //定时器1用来动态扫描{ static unsigned char num; TH1=0xF8;//重入初值 TL1=0xf0;switch (num){ case 0:P2=0;P0=StrTab[num];break; //分别调用缓冲区的值进行扫描 case 1:P2=1;P0=StrTab[num];break; case 2:P2=2;P0=StrTab[num];break; case3:P2=3;P0=StrTab[num];break; case4:P2=4;P0=StrTab[num];break; case5:P2=5;P0=StrTab[num];break; case6:P2=6;P0=StrTab[num];break; case7:P2=7;P0=StrTab[num];break; default:break; }num++; //扫描8次,使用8个数码管 if(num==8)num=0;}/******************************************************************//* 定时器0中断*//******************************************************************/void tim(void) interrupt 1 using 1{ staticunsigned char count; //定义内部局部变量TH0=0xd8; //重新赋值 TL0=0xf0; count++;switch (count) { case 0: case 20:case 40: case 60: case 80:Displaypro();break;//隔一定时间调用显示处理 case 50:P1=~P1;break; //半秒 LED 闪烁 default:break; }if (count==100) { count=0;second++; //秒加1 if(second==60){ second=0; minute++; //分加1 if(minute==60) { minute=0; hour++; //时加1 if(hour==24) hour=0; } } } }基于单片机的LCD1602控制总线模式时间:2012-09-10 13:50:39 来源:作者:第一行显示"Welcome";第二行显示="Happy day";若要显示其他字符,请直接往数组 LCMLineOne[16]和LCMLineTwo[16]填充相应的代码。
数码管动态显示时间(0-999秒倒计时)原理图:
控制部分
数码管时间显示,微动按键时间调整,工作手具转换,启动和复位程序。
1.待机:时间显示010秒.D6灯亮,此时ZHH,GZ无输出。
2.转换键:待机D5和D6状态可相互转换,开机常态体腔指示灯亮ZHH,GZ无输出。
按一下转换到D5状态,D5
指示灯亮ZHH输出,再按一下转换到D6状态,体腔指示灯亮ZHH无输出。
3.“加”“减”键:可调时间000-999秒,可快加和快减时间,每秒10个数变化。
慢加和慢减时间,每按一下变化1
个数。
4.复位键:工作和报警中可用,复位到设定状态。
5.手柄启动键:设定到D6状态时,按下启动键时间以设定时间倒计时工作,此时ZHH无输出GZ输出,治疗指
示灯D4亮时间减到000后,GZ断开报警5秒治疗指示灯闪烁,返回到设定状态。
设定到D5状态时,按下启动键时间以设定时间倒计时工作,此时ZHH,GZ输出,治疗指示灯亮时间减到000后,GZ断开报警5秒治疗指示灯闪烁。
工作中除复位键外其他键不能动作。
报警中可重复启动(设定状态)。
8位数码管显示电子时钟c51单片机程序时间:2012-09-10 13:52:26 來源: 作者:S1用于小时加1操作 S2用于小时减1操作 S3用于分钟加1操作 S4用于分钟减1操作*/#include<reg52・ h> sbit KEY1 二P3"0; //泄义端口参数sbit KEY2二P3°l sbit KEY3=P3"2 sbit KEY4二P3“3sbit LEXP12 code unsigned char tab[] = {0x3f, 0x06,0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //共阴极数码管0—9 unsigned char StrTab"8];//泄义缓冲区unsigned char minute=19, hour=23, second; //泄义并初始化为 12:30:00 voiddelay(unsigned int ent) {while (—ent);}/******************************************************************/ /* 显示处理函数 *//******************************************************************/ void Displaypro(void) {StrTab [0Z =tab [hour/10]; //显示小时StrTab[l]=tab[hour%10]; StrTab [2] =0x40;//显示StrTab [3] =tab [minute/10];//显示分钟StrTab [4] =tab [minute%10]; StrTab [51=0x40;// 显示StrTab[6] =tabLsecond/10];//显示秒StrTab [71 =tab [second%10];}mainO8位数码管显示 时间格式 05-50-00标示05点50分00秒〃立义指示灯参数TMOD =0x01; //左时器 0 10ms inM crystal TH0=0xd8; //初值TL0=0xf0; ET0=l; TR0=l;TMOD 二0x10; //定时器1用于动态扫描TH1 二 0xF8; //初值TL1二OxfO; ET1=1; TR1=1; EA =1; DisplayproO ;//调用显示处理函数while (1) {ifCKEYl) //按键1去抖以及动作{delay (10000); if(!KEYl)hour++;if(hour==24)hour 二0;DisplayproO ;delay (10000);if(!KEY2)hour —;if(hour==255)hour=23;DisplayproO ;}}if(!KEY3)delay (10000); 辻(!KEY3)if(!KEY2)//按键2去抖以及动作 用于计时//正常时间小时力【II〃正常时间小时减1//按键去抖以及动作minute++;if(minute==60)minute=O; //分加 1DisplayproO ;}}if(!KEY4) //按键去抖以及动作{delay (10000);if(!KEY4){minute―;if(minute==255) minute=59; //分减1DisplayproO ;}}}}/****************************************************************** /******************************************************************/ void timel_isr(void) interrupt 3 using 0static unsigned char num; TH1二0xF8; //重入初值TL1二OxfO;switch (num){case 0:P2=0case 1:P2=1case 2:P2=2case 3:P2=3case 4:P2=4case 5:P2=5case 6:P2=6case 7:P2=7 P0=StrTab[num]:break; P0=StrTab[num]:break; P0=StrTab[num]:break; PO^StrTabEnum]:break; P0=StrTab[num]:break; P0=StrTab[num]:break; P0=StrTab[num]:break; PO=StrTabEnum]:break;default:break; }左时器1中断*///泄时器1用来动态扫描//分别调用缓冲区的值进行扫描:%noq(佗二“noq)其IUO41//:++zoq :0二"nuw}(09^^UTUI )JT【聊岳〃 :++対nupn:0 二puogs }(09 二二 puogs”!【IW// :卄 puoxs:0=iunoo(OOimunoo)JT瀏M 03T 矽来//:^j q-T<=Id :09 旅厲士酉田朋回利来一囲//:平曲q :()0巾焦gs!a :08 :09 QSPOQSPOQSPO •O S :0QSPO QSPO/*} qojiMS :++Hunoo :OJ X O=O1I 即酗螺重//:8PX0二0H 丄再並咫日腥MX 帀//"uno 。
单片机的共阴共阳8段码的原理及显示代码
共阴极数码管
1.共阴极数码管的结构
共阴极数码管是把所有led的阴极连接到共同接点com,而每个led的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图所示。
图中的8个led分别与上面那个图中的a~dp各段相对应,通过控制各个led的亮灭来显示数字。
2.共阴极数码管的应用
共阴极数码管是一类数字形式的显示屏,通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字能够显示时间、日期、温度等所有可用数字表示的参数。
由于它的价格便宜、使用简单、在电器,特别是家电领域应用极为广泛,空调、热水器、冰箱等等。
绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。
3.共阴极数码管的判断方法。