数码管时钟显示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]填充相应的代码。
- 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为蜂鸣器}}。