数码管时钟显示C程
测速显示C程序
#include <REG52.H>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar a,b,c,d;#define LED_DAT P0sbit pin_SpeedSenser = P3^5; //速度传感器脉冲信号输出端接在T1上#define TIME_CYLC 100 //12M晶振,定时器10ms 中断一次我们1秒计算一次转速,1000ms/10ms = 100#define PLUS_PER 2 //码盘的齿数,这里假定码盘上有2个齿,即传感器检测到2个脉冲,认为1圈#define K 1.0 //校准系数sbit zhen1=P1^0;sbit fan1=P1^1;sbit en1=P1^2;uchar code loops[] = {0x7f,0xbf,0xdf,0xef}; //定义显示位控制驱动码uchar code table[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05}; // 0,1,2,3,4,5,6,7,8,9uint Tcounter = 0; //时间计数器bit Flag_Fresh = 0; // 刷新标志bit Flag_clac = 0; //计算转速标志bit Flag_Err = 0; //超量程标志//在数码管上显示一个四位数void DisplayFresh();//计算转速,并把结果放入数码管缓冲区void ClacSpeed();//初始化定时器void init_timer();//延时函数void Delay(uint ms);void it_timer0() interrupt 1 //定时器0中断的响应函数{TF0 = 0; //定时器T0用于数码管的动态刷新TH0 = 0xD8; //初始化TL0 = 0xF0;Flag_Fresh = 1;Tcounter++;if(Tcounter>TIME_CYLC){Flag_clac = 1;//周期到,该重新计算转速了}}void it_timer1() interrupt 3 //中断地址是0x001b{TF1 = 0; //定时器T1用于单位时间内收到的脉冲数,要速度不是很快,T1永远不会益处Flag_Err = 1; //如果速度很高,我们应考虑另外一种测速方法:脉冲宽度算转速}void main(void){init_timer();while(1){zhen1=1;fan1=0;en1=1;Delay(31);en1=0;Delay(169);if(Flag_Fresh){Flag_Fresh = 0;DisplayFresh(); // 定时刷新数码管显示}if(Flag_clac){Flag_clac = 0;ClacSpeed(); //计算转速,并把结果放入数码管缓冲区Tcounter = 0;//周期定时清零TH1=TL1 = 0x00;//脉冲计数清零}if(Flag_Err) //超量程处理{//数码管显示字母'EEEE',开机时初始化为0000a = 0x2c;b = 0x2c;c = 0x2c;d = 0x2c;while(1){DisplayFresh();//不再测速等待复位i}}}}//在数码管上显示一个四位数void DisplayFresh(){P2 =loops[0] ;LED_DAT = table[a];Delay(20);P2 =loops[1] ;LED_DAT = table[b];Delay(20);P2 =loops[2] ;LED_DAT = table[c];Delay(20);P2 =loops[3] ;LED_DAT = table[d];Delay(20);}//计算转速,并把结果放入数码管缓冲区void ClacSpeed(){uint speed ;ulong PlusCounter;PlusCounter = TH1*256 + TL1;speed = K*(PlusCounter/PLUS_PER);//K是校准系数,如速度不准,调节K的大小a = (speed/1000)%10;b = (speed/100)%10;c = (speed/10)%10;d = speed%10;}void init_timer() //初始化{TMOD = 0x51; //定时10毫秒,TOT1选择软件门方式1,T0定时,T1计数,96页可查TH0 = 0xD8; //T0初始化TL0 = 0xF0;ET0=1; //T0中断允许EA=1; //T0中断TR0=1; //TO运行TH1 = 0x00; //T1初始化TL1 = 0x00;ET1=1; //T1中断允许TR1=1; //T1运行zhen1=1;fan1=0;}void Delay(uint ms) //延时0.1ms函数{uchar x,y;for(x=ms;x>0;x--)for(y=11;y>0;y--);}。
74LS595驱动数码管C程序
sbit sh_cp=P1^1;// 74HC595串行时钟
sbit AN1=P3^7; //按键口
sbit AN2=P1^0; //按键口
sbit AN3=P1^4; //按键口
//延时毫秒函数:
void Delayms(unsigned int t)
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=120;y>0;y--);//延时大约1毫秒
}
//任意位数码管显示一个字符函数:
{
DTDisplayChar(duan[j]);
Delayms(5);
}
stБайду номын сангаасcp=1; st_cp=0;
while(1){};
}
}
/**************************************************************************
*程序名称:74HC595驱动数码管
*程序功能:数码管显示字符
**************************************************************************/
{
in=(dat&0x80)?1:0; //判断最高位,为真取1,为假取0
sh_cp=1; //上升沿送数据
sh_cp=0;
dat<<=1; //左移取下一位
void DTDisplayChar(unsigned char duan)//数码管段码和数码管位码
数字时钟_89C52_单片机C语言程序
uchar MON[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
uchar A;
uchar BIN=0; /* 【BIN】作为倒计时开始的标志 */
TH0 = (65536 - 10000) / 256; /*给定计时器高位赋予 初值=15536/256*/
TL0 = (65536 - 10000) % 256; /*给定计时器低位赋予 初值=15536%256 */
ET0 = 1; /*打开定时器外部终断0允许 ET1是中断器1的开关*/
P2 = C[4];
Delay(1);
P0 = Code[Msec%10]; /*第五位的数字显示【分】的【个】位 */
P2 = C[5];
Delay(1);
Delay(1);
P0 = 0x40; /*第六位符号【-】的显示 */
P2 = C[6];
Delay(1);
P2 = C[2];
Delay(1);
if(x/50==0)
P0 = 0x40; /*第三位符号【-】的显示 */
else
P0 = 0x00;
P2 = C[3];
Delay(1);
P0 = Code[min/10]; /*第四位的数字的显示【分】的【十】位 */
uchar month=7;
uchar month2;
uchar day=19;
uchar set1 = 1; /* set1=1 是调节 时分秒 set1=2时时调节 年月日 set=3时事调节闹钟 */
数码管原理及显示单片机C编程
数码管显示程序编写
数码管显示原理:通过单片机控制数码管的亮灭状态,实现数字或字符的显示。
数码管显示编程语言:C语言,常用的开发环境有Keil、IAR等。
数码管显示程序的基本结构:包括初始化、显示数据的编码与解码、数码管显示驱动函 数等部分。
数码管显示程序的实现步骤:编写代码、编译链接、下载调试等。
七段数码管
十四段数码管
八段数码管 十六段数码管
数码管的驱动方式
静态驱动:每个数码管需要一个独 立的位选信号,通过位选信号来控 制哪个数码管亮
动态扫描速度:数码管显示的速度 取决于扫描速度,速度越快,人眼 看起来就越连续
添加标题
添加标题
添加标题
添加标题
动态驱动:多个数码管共用一个位 选信号,通过扫描方式逐个点亮数 码管,实显示单片机 C编程实例
数码管静态显示程序
数码管静态显示原理 单片机C编程实例代码 数码管静态显示程序流程图 数码管静态显示程序实现步骤
数码管动态显示程序
数码管动态显示原理 单片机C编程实例 数码管动态显示程序流程 数码管动态显示程序代码
数码管多位显示程序
数码管显示原理
单片机C编程技巧:使用PWM(脉冲宽度调制)技术,通过调节占空比来控制数码管亮 度。
硬件电路设计:需要设计一个适当的硬件电路,以支持数码管亮度控制。
软件编程实现:在单片机C编程中,需要编写相应的程序来实现数码管亮度的控制。
数码管显示速度调节
数码管显示速度调 节的原理
数码管显示速度调 节的方法
数码管显示速度调 节的优缺点
数码管显示速度调 节的实例代码
数码管显示效果优化技巧
数码管显示亮度调整:通过调整单片机的PWM输出,控制数码管的亮度,使其在合适的光线 下更加清晰可见。
基于C51单片机的数字时钟课程设计(C语言带闹钟)
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
第3章 数码管显示输出
第3章数码管显示输出3.1 概述3.1.1 数码管简介数码管是一种广泛应用在仪表、时钟、车站、家电等场合的半导体发光器件,它由多个发光二极管封装在一起,组成“8”字型的器件,颜色有红、绿、蓝、黄等。
图3-1是1位、2位、3位和4位数码管的实物图。
可以看到,每1位数码管都由7个线段型和1个小数点型发光二极管组成,这8个发光二极管在数码管中称之为“段”,平常所说的7段或8段(小数点也算1段)数码管,就指这个意思。
图3-2是从正面观察(数码管正面面对读者,小数点位于右下角)1位数码管时,数码管8个段的名称及引脚图,其中,引脚3和引脚8是公共端com。
图3-1 数码管实物图图3-2 1位数码管各段名及引脚图3.1.2 数字和字符的数码管显示图样从数码管的结构可知,只要有序地组织,让数码管的7段(或者8段)中部分或全部点亮,就可以显示数字或者字符等信息。
图3-3是数字0~9和字母A~F在数码管上显示时对应的图样,其中的字母b和d是小写字母。
图3-3 数字0~9、字母A 、b 、C 、d 、E 、F 在数码管上显示的图样3.1.3 共阳和共阴数码管数码管按照极性可分为共阳数码管和共阴数码管两类。
所谓共阳数码管,从字面理解,就是数码管8个发光二极管的阳极并联在一起,是公共的,称为公共端com ,而各个阴极彼此独立,如图3-4所示;相反,共阴数码管的8个发光二极管的阴极并联在一起,是公共端com ,而各个阳极彼此独立;如图3-5所示。
实际工作中,怎样判别拿在手里的这个数码管是共阳还是共阴呢?一个简便方法就是使用万用表的二极管档去测量。
选择万用表的二极管档,用万用表的红表笔搭接数码管的公共端com(引脚3或引脚8),而黑表笔依次搭接其它引脚,如果此时数码管各段发光,说明该数码管是共阳的;如果数码管的各段都不发光,则交换红黑表笔,用黑表笔搭接公共端com ,用红表笔依次搭接其它引脚,若数码管各段发光,说明该数码管就是共阴的。
单片机实验报告,数码管显示
单片机实验报告,数码管显示实验目的1、掌握数码管动态扫描显示的原理和编程实现方法;2、掌握软件延时程序的使用。
实验任务利用数码管动态显示,设计一个两位秒表,计时0-59,时间到了显示“FF”,使用软件延时实现。
实验原理数码管动态显示的连接方式是将所有数码管的段码a、b、c、d、e、f、g、dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制。
所谓动态扫描显示,即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
具体过程是:当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以只要将需要显示的数码管的位选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中每位数码管的点亮时间为2ms左右,由于人的视觉暂留现象及发光极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
实现延时通常有两种方法:一种是硬件延时,这需要用到单片机的定— 1 —时器,这种方法可以提高CPU的工作效率,也能做到精确控制时间,此方法将在实验四中再学习;另一种方法是软件延时,这种方法主要采用循环体进行。
可以采用for循环以及for循环嵌套的方式达到粗略的长时间延时,利用Keil软件可以调试和观察for语句的延时时间。
实验结果:总结:本次实验我很好的复习了有关C语言的相关语句知识点,合理的运用到了单片机的程序编码中去,但实验过程中,也出现了很多问题。
比如在运行过程中,数码管会乱码,检查后发现是扫描信号端口错误,将扫描信号端口顺序调换,重新运行则解决了乱码问题。
共阴数码管电路0到15的显示参数代码表要记清楚。
8位数码管显示电子时钟c51单片机程序
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]填充相应的代码。
基于C51单片机的数字时钟课程设计(C语言,带闹钟).
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录一、数字电子钟设计任务、功能要求说明及方案介绍 (4)1.1 设计课题设计任务 (4)1.2 设计课题的功能要求说明 (4)1.3 设计课的设计总体方案介绍及工作原理说明 (4)二、设计课题的硬件系统的设计 (5)2.1硬件系统各模块功能简要介绍 (5)2.1.1 AT89C52简介 (5)2.1.2 按键电路 (6)三、设计课题的软件系统的设计 (6)3.1 使用单片机资源的情况 (6)3.2 软件系统个模块功能简要介绍 (7)3.3 软件系统程序流程框图 (7)3.4 软件系统程序清单 (7)四、设计课题的设计结论、仿真结果、误差分析 (9)4.1 设计结论及使用说明 (9)4.2 仿真结果 (10)结束语 (12)参考文献 (12)附录 (13)附录A:程序清单 (13)一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
单片机C语言程序(数码管动态静态显示)
0123动态显示:#inclu de<re g52.h>#de fineuchar unsi gnedchar#defi ne ui nt un signe d intuint num,numdu,numw e;uc har c ode t abled u[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucha r cod e tab lewe[]={0xfe,0xfd,0xfb,0xf7};sbit dula=P2^6;sbi t wel a=P2^7;vo id di splay();v oid m ain(){E A=1;ET1=1;T MOD=0x10;TH1=(65536-500)/256;TH0=(65536-500)%256;TR1=1;nu m=0;whil e(1){if(nu m==20){n um=0;i f(num du==4)numdu=0;if(numwe==4)nu mwe=0;displ ay();n umdu++;numw e++;}}}v oid t ime1() int errup t 3{TH1=(65536-500)/256;T H0=(65536-500)%256;num++;}voiddispl ay(){P0=0xff;we la=1;wel a=0;P0=t abled u[num du];dula=1;dula=0;P0=tab lewe[numwe];w ela=1;we la=0;}0123静态显示:#inclu de<re g52.h>#de fineuchar unsi gnedchar#defi ne ui nt un signe d intuint num,numdu,numw e;uc har c ode t abled u[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucha r cod e tab lewe[]={0xfe,0xfd,0xfb,0xf7};sbit dula=P2^6;sbi t wel a=P2^7;vo id de lay(u char);voi d mai n(){EA=1;E T1=1;TMO D=0x10;T H1=(65536-50000)/256;TH0=(65536-50000)%256;TR1=1;while(1){P0=0xf f;wela=1;wela=0;P0=t abled u[0];du la=1;du la=0;P0=tabl ewe[0];wela=1;wela=0;P0=0x ff;wela=1; wel a=0;P0=table du[1];d ula=1;d ula=0;P0=tab lewe[1];wela=1;wela=0;P0=0xff;wel a=1;we la=0;P0=tabl edu[2];dula=1;dula=0;P0=ta blewe[2];wel a=1;wel a=0;P0=0xff;we la=1;w ela=0;P0=tab ledu[3];dula=1;dula=0;P0=t ablew e[3];we la=1;we la=0;} }0-999循环跳变#in clude<reg52.h>#defi ne uc har u nsign ed ch ar#d efine uint unsi gnedintu int a,b,co unt,n um,nu mdu,n umwe; ucha r cod e tab ledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};u charcodetable we[]={0xf e,0xf d,0xf b,0xf7};s bit d ula=P2^6;sbitwela=P2^7;void dela y(uch ar);voiddispl ay(uc har,u char,uchar); vo id ma in(){EA=1;ET1=1;TM OD=0x10;TH1=(65536-50000)/256;T H0=(65536-50000)%256;TR1=1;coun t=0;whil e(1){if(nu m==20){nu m=0;if(count==1000)count=0;c ount++;}d ispla y(cou nt/100,cou nt%100/10,count%10);}}void time1() i nterr upt 3{T H1=(65536-50000)/256;TH0=(65536-50000)%256;num++;}void disp lay(u charbai,u charshi,u charge){P0=0xff;wel a=1;wela=0;P0=ta bledu[bai];du la=1;dul a=0;P0=t ablew e[1];wel a=1;wela=0;delay(1);P0=0xff;wela=1;wela=0;P0=tab ledu[shi];dul a=1;dula=0;P0=ta blewe[2];wela=1;wela=0;d elay(1); P0=0xff;wela=1;wela=0;P0=tab ledu[ge];dula=1;dula=0;P0=tab lewe[3];wela=1;w ela=0;de lay(1);}voiddelay(ucha r x){uc har a,b;for(a=x;a>0;a--)f or(b=200;b>0;b--); }。
十五位数码管电子钟万年历设计 c编写
十五位数码管电子钟万年历设计c编写后带原理设计图供参考(本人已验证可正常工作)我们以一个实际的时钟电路来说明定时器的软件编程方法,时钟就是我们最为常见的显示时、分、秒为单位的计时工具,它是典型的应用代表。
时钟的最小计时单位是秒,但使用单片机定时器来进行计时,若使用 6.0MHz的晶振,即使按工作方式1工作,最大的计时时间也只能到131ms,所以我们可把每个定时时间取125ms,这样定时器溢出8次(125ms╳8=1000ms)就得到最小的计时单位秒。
而要实现8次计数用软件方法实现是轻而易举的。
我们使用定时器1,以工作方式1工作,定时器进行125ms定时。
采用中断方法进行溢出次数的累计,当计满8次即得到1秒的计时。
一个时钟的计时累加,要实现分、时的进位,要用到多种进制,秒、分、时中的进位是十进制,秒向分进位和分想时进位却是六十进制,而每天又有十二小时制或二十四小时制,它们分别又是十二进制和二十四进制。
从秒到分和从分到小时可以通过软件累加和数值比较方法实现。
在单片机的内部RAM中,需要设置显示缓冲区,显示的时、分、秒值是从显示缓冲区中取出的,在RAM中设置四个单元作为显示缓冲区,分别是7AH、7BH、7CH。
为使电路和原理叙述方便,我们这里不显示秒值,秒的进位我们通过闪烁分值实现。
这样我们一共有四位LED分别显示时和分值。
同时时钟都需要校准的。
在程序中还需设置显示码表,要显示的数值通过查表指令将显示用的真正码值送到LED上。
我们用单片机AT89C2051的PP3.4和P3.5两个I/O口外接微动开关来实现时和分的校正,每按一次小时或分值加1,连续按下数值累计下去,实现时钟的校准。
在电路中我们还设置了一个蜂鸣器,用作简单报时用,如可设早上7:30分起床,中午1点30分再有起床报时,每次响时1分钟,响1秒,停2秒的方式,而不是连续响铃。
这个程序我们采用12小时制,为此,要在程序中设置相应的标志,以利于主程序识别。
C52单片机6位数码管时钟
case 9: P0=duan[num2]; dula=1; dula=0; delayms(2); break;
}
}
/*数码管显示子函数--带小数点*/
void display2 (int a,int b) // a为显示的位置,b为要显示的数字0.-9.
display (5,W5) ;
display2 (6,W6) ;
}
}
P0=wei[num1-1];
wela=1;
wela=0;
switch(num2)
{
case 0: P0=duan[num2]; dula=1; dula=0; delayms(2); break;
case 1: P0=duan[num2]; dula=1; dula=0; delayms(2); break;
case 3: P0=duan[b]; dula=1; dula=0; delayms(2); break;
case 4: P0=duan[b]; dula=1; dula=0; delayms(2); break;
case 5: P0=duan[b]; dula=1; dula=0; delayms(2); break;
/*延时子函数*/
void delayms(uint time)
{
uint i;
for(;time>0;time--)
{
for(i=0;i<124;i++)
{;}
}
}
/*数码管显示子函数--不带小数点*/
void display (int num1,int num2) // num1为显示的位置,num2为要显示的数字0-9
74HC595驱动数码管C程序
/*************************************
用途:
注意:内部8M晶振
************************************************/
#include "config.h"
volatile unsigned int countnum=0;
extern void HC_595_OUT(unsigned char data);
extern void Seg7_Led_Update(void);
extern void Seg7_Led_display(unsigned int data);
extern void Seg7_Led_float(float data);
文件:spi.h
用途:
注意:内部8M晶振
************************************************/
#ifndef __spi_H__
#define __spi_H__
#define SS 0
#define SCK 1
#define MOSI 2
#define Seg7_Bitselect_DDR DDRB
#define Seg7_Bit0 4
#define Seg7_Bit1 5
#define Seg7_Bit2 6
#define Seg7_Bit3 7
#define dp 7
#define Seg7_Bit0_En() {Seg7_Bitselect_DDR|=(1<<Seg7_Bit0);Seg7_Bitselect_PORT|=(1<<Seg7_Bit0);}
单片机c 语言编程时钟及闹钟程序
一·功能1、计时功能,数码管显示数值从00:00:00--23:59:59循环替换,且周期时间与实际时间吻合。
2、定时闹钟功能,按下“定时”键后,可以设定所需要的任意时间,定时完成后,当到达设定时间后,蜂鸣器发声。
3、调整时间功能,根据此项功能可将时钟调至正确的时间。
4、查看定时功能,当设定完成后可以查看上次定时的时间,且能在此基础上进行重新定时。
二·按键说明设定键:按一次开始设定时间,并将设定过程显示在数码管上。
若未按此键,则其他按键无效。
设定过程中,再按一次此键,定时结束,数码管显示返回时钟。
当第一次按下设定键时,显示值为00:00:00,在此基础上调节定时时间。
第一次设定完成后,以后再按设定键,显示初值则为上次定时的时间。
确定键:在定时过程中按下此键,则保留当前设定的时间为定时时间。
若定时过程未按此键,定时无效。
向上键:按下此键,使得当前设定值在现有数值上加一,当加至满位时,当前值变为零。
向下键:按下此键,使得当前设定值在现有数值上减一,当减至零时,当前值变为满位减一。
向左键:按下此键,使得设定值移向左边一位,若已经在最左边,则移至最右边。
向右键:按下此键,使得设定值移向右边一位,若已经在最右边,则移至最左边。
三·具体操作演示(一)·定时及查看定时演示1.仿真开始。
如图:2、按键如图:3、按下设定键,开始设定时间,如图:4、如图所示,当前设定时位。
按向上键,使数值加一。
5、按下向右键,设定位移至分位。
6、按下向下键,使数字减一。
7、按确定键,确定当前设定的时间。
再按设定键,退出定时,开始时钟显示。
8、设定完成后按设定键,显示前次设定值,可在此基础上重新设定,也可直接再按设定键推出。
9、当时钟运行到设定时间时,蜂鸣器发声。
(二)·调整时间演示1、计时开始。
2、按照定时的方法开始设定时间,使其显示20:10:09。
3、调整到正确时间后,按下确定键不放,同时再按一下设定键,将目前设定值送入时钟,使其开始从设定值计时。
51单片机电子时钟(C语言)
#include <reg51.h>#include <intrins.h>#define uchar unsigned char //宏定义#define uint unsigned intuchar sec,min,hour,sec50,jishu,dtp2; //sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元uchar sec1,min1,hour1; //时间中介单元uchar nzmin,nzhour,nzjishu=0,dispjishu=0; //闹钟分、时定义uchar data nzbit=0; //闹钟标志位,闹钟默认为开启uchar data dispbit=0; //显示标志位,默认显示当前时间uchar data disp[8]; //秒、分、时个位与十位存放数组及‘—’uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0-9sbit KEYmin=P3^2; //分加1按钮sbit KEYhour=P3^3; //时加1按钮sbit LABA=P1^0; //闹钟输出I/O口sbit NZdisplay=P3^4; //闹钟显示按钮,按住不放显示闹钟时间,放开则显示当前时间sbit KEYnzmin=P3^5; //闹钟分加1按钮sbit KEYnzhour=P3^6; //闹钟时加1按钮sbit KEYoff=P3^7; //关闭闹钟按钮,按第一次为关闭,第二次为开启void display(); //显示函数声明void keyscan(); //按键扫描函数声明void naozhong(); //闹钟判别函数声明void keynz(); //闹钟按键函数声明void main(){sec=0; //时间初始化为00—00—00min=0;hour=0;sec1=0; //显示单元初始化为00—00—00min1=0;hour1=0;nzmin=01; //闹钟初始时间为01:01nzhour=01;jishu=0;dtp2=0xfe;P0=0xff;TMOD=0x11; //设T0、T1为模式1IE=0x8a;TH0=0xb8; //T0定时20msTL0=0x0;TH1=0xfc; //T1定时1msTL1=0x66;TR0=1;TR1=1;while(1){display(); //调用显示子程序keyscan(); //调用按键子程序keynz(); //调用闹钟按键子程序}}void t0int() interrupt 1 //T0定时中断程序{TH0=0xb8;TL0=0x0;sec50++;if(sec50==50) //对20ms计数50次即1s{sec50=0; //清秒计数器,为下次做准备naozhong(); //调用闹钟判别子程序sec1++; //秒加1}if(sec1==60) //对秒计数60次即1min{sec1=0;min1++; //分加1}if(min1==60) //对分计数60次即1hour{min1=0;hour1++; //时加1}if(hour1==24){hour1=0;}if(dispbit==0) //判断显示标志位是否为0,为0显示当前时间{sec=sec1;min=min1;hour=hour1;}else //显示标志位为1,显示闹钟时间{min=nzmin; //将闹钟时间给显示单元hour=nzhour;}}void t1int() interrupt 3 //T1中断程序{TH1=0xfc;TL1=0x66;P2=0xff; //关闭所有数码管P2=dtp2;dtp2=_crol_(dtp2,1);P0=disp[jishu];jishu++;if(jishu==8) //扫描完8位数码管清0,重新从第一位开始扫描{jishu=0;}}void delay(uint x) //延时函数uchar i;while(x--){for(i=0;i<120;i++);}}void display() //显示子程序{disp[7]=table[sec%10]; //秒个位显示disp[6]=table[sec/10]; //秒十位显示disp[4]=table[min%10]; //分个位显示disp[3]=table[min/10]; //分十位显示disp[1]=table[hour%10]; //时个位显示disp[0]=table[hour/10]; //时十位显示disp[2]=0xbf; //显示‘_’disp[5]=0xbf;}void keyscan() //按键子程序{delay(20); //延时消抖if(KEYmin==0)//时间分加1按钮{min1++; //时间分加1if(min1==60){min1=0;hour1++; //分加到60对时加1}if(hour1==24){hour1=0;}while(!KEYmin); //等待按键放开}delay(20); //延时消抖if(KEYhour==0) //时间时加1按钮{hour1++; //时间时加1if(hour1==24){hour1=0;}while(!KEYhour); //等待按键放开}void naozhong() //闹钟判断{if(nzbit==0) //判断闹钟标志位,0为开启闹钟判断,1为关闭闹钟{if(min1==nzmin) //闹钟与时间分的判别if(hour1==nzhour) //闹钟与时间时的判别LABA=0; //时间分、时与闹钟分、时相等就打开蜂鸣器}elseLABA=1;}void keynz() //闹钟加、减及闹钟关闭、开启按键处理子程序{delay(20); //延时消抖if(KEYnzmin==0) //判别闹钟分加1按键{nzmin++; //闹钟分加1if(nzmin==60){nzmin=0;nzhour++; //闹钟分加到60对闹钟时加1if(nzhour==24)nzhour=0;}while(!KEYnzmin); //等待按键放开}delay(20); //延时消抖if(KEYnzhour==0) //判别闹钟时加1按键{nzhour++; //闹钟时加1if(nzhour==24)nzhour=0;while(!KEYnzhour); //等待按键放开}if(KEYoff==0)//判断关闭闹钟按键是否按下{delay(20); // 延时消抖nzjishu++;if(nzjishu==1) //判断是否为第一次按下{nzbit=1; //第一次按下关闭闹钟if(nzjishu==2) //判断是否为第二次按下{nzjishu=0; //第二次按下清计数单元nzbit=0; // 第二次按下开启闹钟判别}while(!KEYoff); //等待按键放开}if(NZdisplay==0) //判别显示切换闹钟按键是否按下{dispjishu++;if(dispjishu==1) //第一次按下显示闹钟时间{dispbit=1; //第一次按下,把标志位置1,显示切换为闹钟时间}if(dispjishu==2) //第二次按下显示为当前时间{dispjishu=0; //清零,重新计数dispbit=0; //第二次按下清零显示标志位,显示切换为当前时间}while(!NZdisplay); //等待按键放开}}。
51单片机数码管电子时钟C程序
//**单片机stc89c52, 8位共阴数码管12M晶振//*******P0 位选,P2 段选❖******//#include 〃reg52・ h〃#define uchar unsigned char#define uint unsigned intuchar code tab[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, Oxff}; uchar n;uchar hh, mm, ss;uchar nhh, nmm, nss;uint year;uchar day, mon, week;uchar hhs, hhg, mms, mmg, sss, ssg;uchar days,dayg, mons, mong;uchar nhhs, nhhg, nmms, nmmg, nsss, nssg;uchar setl=l, set2=l;sbit dula=P3 3;sbit fm=P3 2;sbit kl二P3"4;sbit k2二P3"5;sbit k3二P3飞;sbit k4二P3"7;uchar tablel[] = {31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 〃闰年uchar table2[] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //非闰年void jishi ();void baoshi ();void alarm();void set_time();void set_alarm();void set_mdw();void key_change():void key_set ();void delay (int m) 〃延时程序,延时m*0. 5msuint i;uint j;for (i=0;i<m;i++){for(j=0;j<500;j++){}}}void timerO() interrupt 1 {TMOD二0x01;TH0=0x3c;TLO=Oxbl;n++;JishiO;}main()TMOD二0x01;TH0=0x3c;TLO二Oxbl;TRO二1;EA二1;ETO二1;hh=12;mm=00;ss=00;nhh二7;nmm=30;nss=0;year=2012;mon=01;day=01;week=7; while(1){hhs=hh/10%10; // 时分秒hhg=hh%10;mms=mm/10%10;mmg=mm%10;sss=ss/10%10;ssg=ss%10;nhhs=nhh/10%10; 〃闹钟nhhg=nhh%10; nmms=nmm/10%10;nmmg=nmm%10; nsss=nss/10%10;nssg=nss%10; days=day/10%10;//月Hday萨day%10; mons=mon/10%10;mong=mon%10;key_change () ; //kl 按键扫描key_set (); //k2 按键扫描set_time() ; //设置时间set.mdwO ; //设置月日星期set_alarm() ; //设置闹钟辻(setl-1) //正常走时显示dula=l: P2=tab [hhs] ; dula=O: P2=0xff; PO=Oxef; delay (1) ;P0二Oxff; //时十位dula二1;P2二tab[hhg]; dula=0;P2=0xff;PO=Oxdf;delay(1) ; PO二Oxff;//时个位dula=l;P2=tab[10]:dula=0;P2=0xff; PO=Oxbf;delay(1); PO二Oxffdula=l: P2=tab [mms] : dula=0: P2 二Oxff ;P0 二0x7f; delay (1) ;P0 二Oxff; //分十位dula=l; P2=tab [mmg] ; dula=0; P2=0xf f; P0=0xfe; delay (1) ; PO 二Oxff;//分个位dula=l;P2=tab[10]; dula=0:P2=0xff;PO=Oxfd:delay(1); PO二Oxffdula二1;P2二tab[sss]; dula=0;P2=0xff;PO=Oxfb:delay(1) ; PO二Oxff;//秒十位dula二1;P2二tablssg]; dula=0:P2=0xff;P0=0xf7; delay(1) ;P0二Oxff; //秒个位}辻(set 1=2) //设置时间dula=l; P2=tab [hhs] ; dula=0; P2=Oxff; PO=Oxef; delay (1) ;P0二Oxff; //时十位dula二1;P2二tablhhg]; dula=0:P2=0xff;PO=Oxdf;delay(1) ; PO二Oxff;//时个位dula=l:P2=tab[10]:dula=0;P2=0xff; PO=Oxbf;delay(1); PO二Oxffdula=l: P2=tab [mms] : dula=0: P2 二Oxff ;P0 二0x7f; delay (1) ;P0 二Oxff; //分十位dula=l; P2=tab [mmg] ; dula=0: P2=0xf f: P0=0xfe; delay (1) ; PO 二Oxff;//分个位dula=l;P2=tab[10]; dula=0:P2=0xff;PO=Oxfd:delay(1); PO二Oxffdula二1;P2二tab[sss]; dula=0;P2=0xff;PO=Oxfb:delay(1) ; PO二Oxff;//秒十位dula二1;P2二tablssg]; dula=0:P2=0xff;P0=0xf7; delay(1) ;P0二Oxff; //秒个位}辻(set 1-3) //正常显示月日-星期(肆匕诂S )M心T P 鏗\m x o u o 匕(DAPWZJXOUOddxouzdoudnp 二席*〕qpf Zd二 H d n p 创+忌、、d x o u o d - (I )A p w q J x o u o d d x o u z d o H £n p =s 〕q p f z d =%-n p 、、—、、、、QJXOUOd - (I)xp^p&Jxouod2Jxouzdo%w 〔OI 〕qeTzd=%-np 心T p g 'm x o u o d - u)APW*xouoddxouzd oUPTnp 二"App 〕qpfzd二%-np^+、、dxouocr(DAP^PQZXOUOmxouzdou d n p 二 SAPP 〕qpfzd 二%-np 、、—、、、、QJXOUOdJI) A32P cu q x o u o d 世o %I n p 二2〕q e F CN d 二%H T P 鏗\m x o u o 匕(DAPWZJXOUOddxouzdoudnp 二席*〕qpf Zd二 H d n p 创+忌、、d x o u o d - (I )A p w q J x o u o d d x o u z d o H £n p =s 〕q p f z d =%-n p 、、—、、、、心 J x o u o d - (I)xp^p&Jxouod2Jxouzdo%w 〔OI 〕qeTzd=%-np 心T p g 'm x o u o d - u)APW*xouoddxouzd oUPTnp 二"App 〕qpfzd 二%-np ^+0、、d x ouocr(DAP^PQZXOUOmxouzdoudnp二SAPP〕qpfzd二%-np 、、—、、、、QJXOUOd J I ) A32Pcu q x o u o d £0 世dula=l; P2=tab [nhhs]; dula=O; P2二Oxff; PO二Oxef; delay (1) ; PO二Oxff; 〃时十位dula=l;P2=tab[nhhg]; dula=0;P2=0xff;PO=Oxdf; delay (1) ; PO二Oxff;//时个位dula=l;P2=tab[10];dula=0;P2=0xff; PO=Oxbf;delay(1); PO二Oxff dula=l:P2=tab [nmms] : dula=0; P2=0xff ;P0=0x7f; delay (1) ;PO=Oxff; //分十位dula=l;P2=tab[nmmg] :dula=0;P2=0xff;PO=Oxfe; delay (1) ; PO=Oxff;//分个位dula=l;P2=tab[10]; dula=0:P2=0xff;PO=Oxfd:delay(1) ; PO二Oxffdula=l ;P2=tab[nsss] : dula=0;P2=0xff ;PO=Oxfb; delay (1) ; PO二Oxff;//秒十位dula=l;P2=tab[nssg] ; dula=0: P2=0xff; PO=Oxf7; delay (1) ;PO=Oxff; //秒个位} if(setl—6) //设置闹钟定时dula=l; P2=tab [nhhs] ; dula=0; P2二Oxff; PO二Oxef; delay (1) ; PO二Oxff; 〃时十位dula=l;P2=tab[nhhg]; dula=0;P2=0xff;PO=Oxdf; delay (1) ; PO二Oxff;//时个位dula=l;P2=tab[10];dula=0;P2=0xff; PO=Oxbf;delay(1); PO二Oxff dula=l:P2=tab [nmms] : dula=0; P2=0xff ;P0=0x7f; delay (1) ;PO=Oxff; //分十位dula=l;P2=tab[nmmg] :dula=0;P2=0xff;PO=Oxfe;delay(1) ; PO二Oxff;//分个位dula=l;P2=tab[10]; dula=0;P2=0xff;PO=Oxfd:delay(1); PO二Oxff dula=l;P2=tab[nsss]; dula二0;P2二Oxff;P0二Oxfb;delay(l) ; PO二Oxff;//秒十位dula=l;P2=tab[nssg] ; dula=0: P2=0xff; PO=Oxf7; delay (1) ;P0二Oxff; //秒个位}baoshi () : //整点报时alarm () ; //闹钟}}void JishiO 〃计时函数辻(n二二20){n=0;ss++;辻(ss=60){ss二0;mm++;if(mm二二60){mm^O;hh++;辻(hh=24){hh二0;day++;week++;if(week==8){week二0;}if (year%4==0&&year%100! =0 year%400==0) //闰年if(day=二tablel[mon]+l){day=0;mon++;if(mon==13){mon二0;year++;}}else //非闰年{辻(day—table2 [mon]+l){day=0;mon++;辻(mon—13){mon二0;year++;}}}}}}}}uchar incone (uchar n) //加 1 函数{辻(k3=0){delay(20);if(k3==0){n++;while(!k3);}}return(n);}uchar decone(uchar m) //减 1 函数{ if (k4==0){delay(20);if(k4==0)辻(m<0){m 二0;}}}}void key_change() //kl 按键扫描{ if(kl==0){delay(20);if(kl==0){setl++;while(!kl);if(setl==7){setl二1;}}void key_set() //k2 按键扫描{if(k2==0){delay(20);{set2++;while(!k2);辻(set2=4){set2=l;}}}}void baoshi () //整点报时函数{ fm=O;}if(ss==l){fm=l;}}void alarm() //闹钟函数{uchar x;if(nhh==0){goto end;}if(hh==nhh&&mm二二nmm&&ss==nss)fm=O; delay(30); fm=l; delay(20); fm=0; delay(30); fm=l; delay(20); fm=0; delay(30); fm=l; delay(20); fm=0; delay(30); fm=l; delay (180);end:;}void set_time() //设置时间函数{辻(setl==2){辻(set2==l){hh=incone(hh);if(hh==24){hh=0;}if(hh==-l){hh二23;}hh二decone(hh);}mm=incone(mm); if(mm==60) {mm 二0;}if(mm==-l) {mm=59;}mm=decone(mm); }辻(set2=3){ss=incone(ss);辻(ss=60){ss=O;}if (ss—-1){ss=59;}ss二decone (ss);}void set_mdw() //设置月日星期函数{ 辻(setl==4) {辻(set2==l){mon=incone(mon);if(mon二二13){mon=l;}mon=decone(mon);if(mon==0){mon二12;}}if(set2==2)day=incone(day);if(day==32){day=l;} day=decone(day);if (day—0){day=31;}}辻(set2=3){week=incone(week);if(week==8){week二1;}week二decone(week);if(week==0){week=7;}}}void set_alarm() //设置闹钟函数{ if(setl二二6){辻(set2=l){nhh二incone(nhh);辻(nhh二二24) {nhh二0;}辻(nhh—-1){nhh二23;}nhh二decone(nhh); }if(set2==2){nmm二incone(nmm); if (nmm—60) {nmm二0;}nmm二decone(nmm); if (nmm 二二 T){nmm=59;}}辻(set2二二3) {nss=incone (nss); if (nss=60){nss=0;}nss二decone(nss); if(nss==-l){nss二59;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* 数码管时钟显示led移动C 程序使用共阳极数码管*/#include<>#include<>#define uint unsigned int#define uchar unsigned charsbit wela1 = P2^0; 果要显示1~8数值,最好多加前后两位数0跟9, 因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/uchar code tablew[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 如果要显示,也会因为++而在第二轮中显示出*/duan=1; //开启段显端P0=tabled[numd];//附段显P0值对应段显值对码表duan=0; //锁存wei=1; //开启位显端P0=tablew[numw];//附位显P0值对应位显值对码表wei=0; //锁存numw++; //相当于位显移位if(numw==8) //如果位显值到对应位显对码表第八位则转下执行numw=0; //重新附值位显值对应对码表第0位起/*下面是简单的单个数码管显示例证第一骤, 修改后在第三步骤内#include""#include""sbit duan=P2^6; //段显端口sbit wei=P2^7; //位显端口void main(){//P0=0xff; 数码管不显示任何信号,默认情况下通电本身就不显示,可以不写duan=1; //开启段显端口P0=0x06; //附值段显数值为1,可以查阅数码管电路图相对应显示的对码表duan=0; //锁存,保持上一步段显状态,硬件说明请查阅74HC573功能wei=1; //开启位显端口P0=0xfe; //附值位显位置,01111111,左边第一位,为0的显示wei=0; //锁存,保持上一步位显状态,硬件说明请查阅74HC573功能}*/}}}void timer0() interrupt 1 /*第四步骤,中断时间函数这个相当于移位数显的速度,速度够快,人眼就会有余辉效应,感觉8位数显一直在亮着,相当于正在播放的电影胶卷*/{TH0=(65536-50000)/256;TL0=(65536-50000)%256;a++;}/*以上有什么地方还需要改进的还请老师明示*///**作者:胡甲如需转载请注明出处**////**湖北工业大学工程技术学院通信专业**////**单片机SST89E58RD 8位共阳数码管12M晶振**// //*******P0段选,P2位选*******////********2008年12月1号********//#include ""#define uchar unsigned char#define uint unsigned intuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; uchar n;uchar hh,mm,ss;uchar nhh,nmm,nss;uint year;uchar day,mon,week;uchar hhs,hhg,mms,mmg,sss,ssg;uchar days,dayg,mons,mong;uchar nhhs,nhhg,nmms,nmmg,nsss,nssg;uchar set1=1,set2=1;sbit fm=P3^2;sbit k1=P3^4;sbit k2=P3^5;sbit k3=P3^6;sbit k4=P3^7;uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年void jishi();void baoshi();void alarm();void set_time();void set_alarm();void set_mdw();void key_change();void key_set();void delay(int m) //延时程序,延时m*{uint i;uint j;for (i=0;i<m;i++){for(j=0;j<500;j++){}}}void timer0() interrupt 1{TMOD=0x01;TH0=0x3c;TL0=0xb1;n++;jishi();}main(){TMOD=0x01;TH0=0x3c;TL0=0xb1;TR0=1;EA=1;ET0=1;hh=12;mm=00;ss=00;nhh=7;nmm=30;nss=0;year=2008;mon=12;day=1;week=1;while(1){hhs=hh/10%10;//时分秒hhg=hh%10;mms=mm/10%10;mmg=mm%10;sss=ss/10%10;ssg=ss%10;nhhs=nhh/10%10;//闹钟nhhg=nhh%10;nmms=nmm/10%10;nmmg=nmm%10;nsss=nss/10%10;nssg=nss%10;days=day/10%10;//月日dayg=day%10;mons=mon/10%10;mong=mon%10;key_change(); //k1按键扫描key_set(); //k2按键扫描set_time(); //设置时间set_mdw(); //设置月日星期set_alarm(); //设置闹钟if(set1==1) //正常走时显示{P0=tab[hhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[hhg];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[mms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[mmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[sss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==2) //设置时间{P0=tab[hhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[hhg];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[mms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[mmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[sss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==3) //正常显示月日-星期{P0=tab[mons];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[mong];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[days];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[dayg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[11];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[11];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[week];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==4) //设置月日-星期{P0=tab[mons];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[mong];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[days];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[dayg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[11];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[11];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[week];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==5) //正常显示定时{P0=tab[nhhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[nhhg];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[nmms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[nmmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[nsss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[nssg];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==6) //设置闹钟定时{P0=tab[nhhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[nhhg];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[nmms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[nmmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[nsss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[nssg];P2_0=0;delay(1);P2_0=1;//秒个位}baoshi(); //整点报时alarm(); //闹钟}}void jishi() //计时函数{if(n==20){n=0;ss++;if(ss==60){ss=0;mm++;if(mm==60){mm=0;hh++;if(hh==24){hh=0;day++;week++;if(week==8){week=0;}if(year%4==0&&year%100!=0||year%400==0) //闰年{if(day==table1[mon]+1){day=0;mon++;if(mon==13){mon=0;year++;}}}else //非闰年{if(day==table2[mon]+1){day=0;mon++;if(mon==13){mon=0;year++;}}}}}}}}uchar incone(uchar n) //加1函数{if(k3==0){delay(20);if(k3==0){n++;while(!k3);}}return(n);}uchar decone(uchar m) //减1函数{if(k4==0){delay(20);if(k4==0){m--;while(!k4);if(m<0){m=0;}}}return(m);}void key_change() // k1 按键扫描{if(k1==0){delay(20);if(k1==0){set1++;while(!k1);if(set1==7){set1=1;}}}}void key_set() //k2按键扫描{if(k2==0){delay(20);if(k2==0){set2++;while(!k2);if(set2==4){set2=1;}}}}void baoshi() //整点报时函数{if(mm==00&&ss==00){fm=0;}if(ss==1){fm=1;}}void alarm() //闹钟函数{uchar x;if(nhh==0){goto end;}if(hh==nhh&&mm==nmm&&ss==nss) {for(x=0;x<6;x++){fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(180);}}end:;}void set_time() //设置时间函数{if(set1==2){if(set2==1){hh=incone(hh);if(hh==24){hh=0;}if(hh==-1){hh=23;}hh=decone(hh);}if(set2==2){mm=incone(mm);if(mm==60){mm=0;}if(mm==-1){mm=59;}mm=decone(mm);}if(set2==3){ss=incone(ss);if(ss==60){ss=0;}if(ss==-1){ss=59;}ss=decone(ss);}}}void set_mdw() //设置月日星期函数{if(set1==4){if(set2==1){mon=incone(mon);if(mon==13){mon=1;}mon=decone(mon);if(mon==0){mon=12;}}if(set2==2){day=incone(day);if(day==32){day=1;}day=decone(day);if(day==0){day=31;}}if(set2==3){week=incone(week);if(week==8){week=1;}week=decone(week);if(week==0){week=7;}}}}void set_alarm() //设置闹钟函数{if(set1==6){if(set2==1){nhh=incone(nhh);if(nhh==24){nhh=0;}if(nhh==-1){nhh=23;}nhh=de cone(nhh);}if(set2==2){nmm=incone(nmm);if(nmm==60){nmm=0;}nmm=decone(nmm);if(nmm==-1){nmm=59;}}if(set2==3){nss=incone(nss);if(nss==60){nss=0;}nss=decone(nss);if(nss==-1){nss=59;}}}}#include<>unsigned char seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90};unsigned char flash,mode=0;char min=50,hour=12,hour_rom,min_rom,sec=25;unsigned char j,k;unsigned int i;unsigned char key_set_s,key_up_s,key_down_s,key_reset_s; sbit P0_7=P0^7;sbit key_set=P3^4;sbit key_up=P3^5;sbit key_down=P3^6;sbit key_reset=P3^7;sbit buzzer=P1^0;bit dop,bb; //声明void delay(unsigned int x) //延时{while(x--);}void timer0_isr(void) interrupt 1 //中断服务函数{TH0=0xf8; //为65535-2000=63535转化为16进制取高八位TL0=0x2f; //取低八位i++;bb=!bb;if(i>=250) //半秒,五百一秒{i=0;k++;flash=~flash;dop=!dop;}if(k>=2) //大于二归零{k=0;sec++;}if(sec>=60) //秒{sec=0;min++;}if(min>=60) //分{min=0;hour++;}if(hour>=24) //小时hour=0;P0=0xff; //P0初始化为全1if(mode==0) //正常显示{switch(j) //控制语句{case 0:P0=seven_seg[sec%10];P2=0xfe;break; //秒个位case 1:P0=seven_seg[sec/10];P2=0xfd;break; //秒十位case 2:P0=seven_seg[min%10];P0_7=dop;P2=0xfb;break;case 3:P0=seven_seg[min/10];P2=0xf7;break;case 4:P0=seven_seg[hour%10];P0_7=dop;P2=0xef;break; //dop为小数点case 5:P0=seven_seg[hour/10];P2=0xdf;break;}}////////////////////if(mode==1) //模式一C1状态{switch(j){case 0:P0=seven_seg[min%10];P2=0xfe;break;case 1:P0=seven_seg[min/10];P2=0xfd;break;case 2:P0=seven_seg[hour%10]| flash;P2=0xfb;break; //flash为闪烁case 3:P0=seven_seg[hour/10]| flash;P2=0xf7;break;case 4:P0=seven_seg[1];P2=0xef;break; //1为C1状态case 5:P0=0xc6;P2=0xdf;break; //0xc6为显示C}}////////////////////if(mode==2) //模式二C1状态{switch(j){case 0:P0=seven_seg[min%10]| flash;P2=0xfe;break;case 1:P0=seven_seg[min/10]| flash;P2=0xfd;break;case 2:P0=seven_seg[hour%10];P2=0xfb;break;case 3:P0=seven_seg[hour/10];P2=0xf7;break;case 4:P0=seven_seg[1];P2=0xef;break;case 5:P0=0xc6;P2=0xdf;break;}}////////////////////if(mode==3) //模式三C2状态switch(j){case 0:P0=seven_seg[min_rom%10];P2=0xfe;break;case 1:P0=seven_seg[min_rom/10];P2=0xfd;break;case 2:P0=seven_seg[hour_rom%10]| flash;P2=0xfb;break; case 3:P0=seven_seg[hour_rom/10]| flash;P2=0xf7;break; case 4:P0=seven_seg[2];P2=0xef;break;case 5:P0=0xc6;P2=0xdf;break;}}////////////////////if(mode==4) //模式四C2状态{switch(j){case 0:P0=seven_seg[min_rom%10]| flash;P2=0xfe;break; case 1:P0=seven_seg[min_rom/10]| flash;P2=0xfd;break; case 2:P0=seven_seg[hour_rom%10];P2=0xfb;break;case 3:P0=seven_seg[hour_rom/10];P2=0xf7;break;case 4:P0=seven_seg[2];P2=0xef;break;case 5:P0=0xc6;P2=0xdf;break;}}j++;if(j>=6)j=0;void key(void) //调用开关函数{////////////////if(key_set==0) //设置{delay(300);if(key_set==0)key_set_s=1;}if(key_set==1&&key_set_s==1) {mode++;if(mode>=5)mode=1;key_set_s=0;}////// ///if(key_up==0) //上调{delay(300);if(key_up==0)key_up_s=1;}if(key_up==1&&key_up_s==1) {if(mode==1)hour++;if(mode==2)min++;if(mode==3)hour_rom++;if(hour_rom>=24)hour_rom=0;if(mode==4)min_rom++;if(min_rom>=60)min_rom=0;key_up_s=0;}/////////////////if(key_down==0) //下调{delay(300);if(key_down==0)key_down_s=1;}if(key_down==1&&key_down_s==1){if(mode==1)hour--;if(hour<0)hour=23;if(mode==2)min--; if(min<0)min=59;if(mode==3)hour_rom--;if(hour_rom<0)hour_rom=23;if(mode==4)min_rom--;if(min_rom<0)min_rom=59;key_down_s=0;}/////////////////if(key_reset==0) //复位{delay(300);if(key_reset==0)key_reset_s=1;}if(key_reset==1&&key_reset_s==1){key_reset_s=0;mode=0;}}void timer0_init(void) //timero初始化函数{TMOD=0x01; //方式1TH0=0xf8;TL0=0x2f;EA=1; //中断开关ET0=1; //中断小开关TR0=1; //开始计数}void main(void) //主函数{timer0_init();while(1)key();{if(hour==hour_rom&&min==min_rom) buzzer=bb; //buzzer为蜂鸣器}}。