stc15串行数码管显示时钟程序
STC15F单片机流水灯程序设计说明

“流水灯”程序设计说明1程序设计思路流水灯是经典的测试发光二极管是否正常工作和学习使用发光二极管的案例。
流水灯电路连接示意图2关键代码设计说明本程序由三个函数组成:(1)void Init() 初始化函数{P0M1 = 0x00;//0000 0000P0M0 = 0xff;//1111 1111 将P0各位设置为推挽输出P2M1 = 0x00;//0000 0000P2M0 = 0xff;//1111 1111 将P2各位设置为推挽输出led_sel = 1;//为1时是led灯显示,为0时是数码管显示}(2)void delay(uint t):本过程目的是延时tms;但是延时的时间可能不是很准确。
单片机工作时,是在统一的时钟脉冲控制下有序进行的。
这个脉冲是由单片机控制器中的时钟电路产生的。
时钟电路由振荡器和分频器组成,振荡器产生基本的振荡信号,然后进行分频,得到相应的时钟。
振荡电路通常有内部振荡和外部振荡两种方式。
STC15F2K60S2单片机内部集成高精度R/C时钟,工作时钟可以使用内部振荡器或者外部晶体振荡器(简称晶振)产生的时钟。
外部振荡信号通过内部时钟电路,经过分频,得到相应的时钟信号。
图2外部振荡模式工作原理示意图说明:(1)振荡周期:晶体振荡器的周期。
(2)状态周期:振荡信号经二分频后形成的时钟脉冲信号,用S表示。
一个状态周期的两个振荡周期作为两个节拍分别称为节拍P1和节拍P2。
P1有效时,通常完成算术逻辑操作;P2有效时,一般进行内部寄存器之间的传输。
(3)机器周期:完成一个基本操作所需的时间称为机器周期。
一个机器周期包含6个状态周期,用S1、S2、….、S6表示;共12个节拍,依次可表示为S1P1、S1P2、S2P1、S2P2、……、S6P1、S6P2。
(4)指令周期:CPU执行一条指令所需要的时间。
CPU执行指令是在时钟脉冲控制下一步一步进行的,由于指令的功能和长短各不相同,因此,指令执行所需的时间也不一样。
数码管时钟显示C程序.doc

数码管时钟显示C程序/*数码管时钟显示led移动C程序使用共阳极数码管*/#include#include#defineuintunsignedint#defineucharunsignedchar sbitwela1=P2 ;//数码管wela管脚定义sbitwela2=P2 ;sbitwela3=P2 ;sbitwela4=P2 ;uchartime,d1,d2,d3, d4,temp,tem,aa;unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0 x99,0x92,0x82,0xF8,0x80,0x90};voiddispl(chara,charb,charc,chard) ;voiddelay(uintz)//延时程序{uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//主函数voidmain(){time=0;TMOD=0x01;//中断定时初始化TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1; TR0=1;aa=0;temp=0xfe;tem=0xff;d1=0;d2=0;d3=0;d4=0;while(1){i f(time==12月1号********//#include“at89x52.h“#defineucharunsignedchar#defineuin tunsignedintucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0xbf,0xff};ucharn;ucharhh,mm,ss;ucharnhh,nmm,ns s;uintyear;ucharday,mon,week;ucharhhs,hhg,mms,mmg,sss,ssg;ucha rdays,dayg,mons,mong;ucharnhhs,nhhg,nmms,nmmg,nsss,nssg;ucha rset1=1,set2=1;sbitfm=P3 ;sbitk1=P3 ;sbitk2=P3 ;sbitk3=P3 ;s bitk4=P3 ;uchartable1[]={31,31,29,31,30,31,30,31,31,30,31,30,31} ;//闰年uchartable2[]={31,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年voidjishi();voidbaoshi();voidalarm();voidset_time();voidset_alarm(); voidset_mdw();voidkey_change();voidkey_set();voiddelay(intm)//延时程序,延时m*0.5ms{uinti;uintj;for(i=0;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初始化为全111111111if(mode==0)//正常显示{switch(j)//控制语句{case0:P0=seven_seg[sec%10];P2=0xfe;break;//秒个位case1:P0=seven_seg[sec/10];P2=0xfd;break;//秒十位case2:P0=seven_seg[min%10];P0_7=dop;P2=0xfb;break;case3:P0= seven_seg[min/10];P2=0xf7;break;case4:P0=seven_seg[hour%10];P 0_7=dop;P2=0xef;break;//dop为小数点case5:P0=seven_seg[hour/10];P2=0xdf;break;}}////////////////////if(mo de==1)//模式一C1状态{switch(j){case0:P0=seven_seg[min%10];P2=0xfe;break;case1:P0= seven_seg[min/10];P2=0xfd;break;case2:P0=seven_seg[hour%10]|fl ash;P2=0xfb;break;//flash为闪烁case3:P0=seven_seg[hour/10]|flash;P2=0xf7;break;case4:P0=seven_ seg[1];P2=0xef;break;//1为C1状态case5:P0=0xc6;P2=0xdf;break;//0xc6为显示C}}////////////////////if(mode==2)//模式二C1状态{switch(j){case0:P0=seven_seg[min%10]|flash;P2=0xfe;break;case1:P0=seven_seg[min/10]|flash;P2=0xfd;break;case2:P0=seven_seg[h our%10];P2=0xfb;break;case3:P0=seven_seg[hour/10];P2=0xf7;bre ak;case4:P0=seven_seg[1];P2=0xef;break;case5:P0=0xc6;P2=0xdf;b reak;}}////////////////////if(mode==3)//模式三C2状态{switch(j){case0:P0=seven_seg[min_rom%10];P2=0xfe;break;case1 :P0=seven_seg[min_rom/10];P2=0xfd;break;case2:P0=seven_seg[h our_rom%10]|flash;P2=0xfb;break;case3:P0=seven_seg[hour_rom/1 0]|flash;P2=0xf7;break;case4:P0=seven_seg[2];P2=0xef;break;case5 :P0=0xc6;P2=0xdf;break;}}////////////////////if(mode==4)//模式四C2状态{switch(j){case0:P0=seven_seg[min_rom%10]|flash;P2=0xfe;break; case1:P0=seven_seg[min_rom/10]|flash;P2=0xfd;break;case2:P0=se ven_seg[hour_rom%10];P2=0xfb;break;case3:P0=seven_seg[hour_r om/10];P2=0xf7;break;case4:P0=seven_seg[2];P2=0xef;break;case5 :P0=0xc6;P2=0xdf;break;}}j++;if(j>=6)j=0;}voidkey(void)//调用开关函数{////////////////if(key_set==0)//设置{delay(300);if(key_set==0)key_set_s=1;}if(key_set==1if(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==1if(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==1if(h our<0)hour=23;if(mode==2)min--;if(min<0)min=59;if(mode==3)ho ur_rom--;if(hour_rom<0)hour_rom=23;if(mode==4)min_rom--;if(m in_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==1mode= 0;}}voidtimer0_init(void)//timero初始化函数{TMOD=0x01;//方式1TH0=0xf8;TL0=0x2f;EA=1;//中断开关ET0=1;//中断小开关TR0=1;//开始计数}voidmain(void)//主函数{timer0_init();while(1)key();{if(hour==hour_rom//buzzer为蜂鸣器}}。
STC15使用说明书 启光电子

朋友们大家好!感谢您购买启光电子STC15系列最小系统板耽误您几分钟请把以下的内容仔细阅读下谢谢首先强调下电子产品在运输过程中难免会出现点问题所以请收到板子的朋友不要着急去焊板子请先做下简单的烧录测试确定板子没有问题后在进行对板子的改动这样即使当板子出现问题我们也能更好的为您解决(包括退换)如果对板子进行焊接后测试出现问题我们只能提供帮助和技术支持但是此时就不能提供(退换)服务了希望朋友们能理解和支持!谢谢!如果着急使用请直接阅读下面的使用和下载方法开发板简介这款STC15F2K60S2 算是宏景(STC)在STC12的基础上的一个升级吧其实STC15早在两年前就一直说要出结果只是出了STC15F104E系列随后的STC12也将宏景的作品推向了高端不过管怎么说12比普通的8051要快12倍左右那STC15给我们又带来了什么呢这里我们只用它与STC12系列相比1 STC15虽然也是1T单片机但是它的速度要比STC12还要快20%左右2 STC15最闪亮的应该是它有内部晶振工作范围在5MHz—35MHz 这一点STC12是望尘莫及的3 PWM STC15位3通道而STC12为2路4 定时器/计数器STC156 STC12 45 串口方面均为双串口但是STC15可以通过切换使用分时复用的方法可以达到5个串口效果6RAM STC15 2K STC12 1K等等从以上这些不能看出STC15与STC12想比还是要胜出一筹最后希望它在你的手中能发挥的淋漓尽致!自动冷启动简介如果用我们板子的朋友一定知道我们板子有自动冷启动功能即不用重新开关只要保持板子供电状态就可以点击下载当然在STC15F2K60S2的板子上我们依然为它加了自动冷启动功能。
这里说一下自动冷气的开关问题如图在三极管M6的下面为自动冷启动设计了开关分别有左右两个框左边就一个字母K 右边能看到K G两个字母顾名思义K是开G 是关的意思也就是说在图上右边中间点和上边连焊并且左边也同时连焊就是开启自动冷启动功能中间点和下边连焊并且左边连点断开就是关闭自动冷启动功能为什么这样做呢因为如果要有一段时间调试程序开启自动冷启动会很方便如果调试完了要一直应用此程序就可以关闭冷启动降低总能量的消耗(虽然没用多少能量!)板子上的蓝灯和红灯简介红灯即靠近USB口的LED灯它为板子的电源指示灯也就是不管有没有开开关只要电源供电或者接好USB线板子上的红灯就会亮蓝灯为STC15运行指示灯它的所用IO为P5.5使用和下载方法1.要先给电脑安装驱动也就是PL-2303驱动这个要根据系统选择你的安装版本如果是W7系统建议直接用1.5.0驱动驱动安装好后应该还要进行重启按步骤执行即可2.安装KEIL编译软件这里我们给大家带的是KEIL4 版本也是目前最新的版本!安装后要用注册机注册一次然后就可以完全破解的3.当以上都弄好后就可以写一个自己想编译的程序并且生成HEX文件或者直接用我们资料的已经生成的HEX写入也可以4.得到HEX文件就可以下载到STC15中了这里要简单的说下打开下载软件在打开的对话框里选择好单片机的型号即STC15F2K60S2点击选择刚才编译好的HEX文件接下来将STC15系统板和电脑用USB连接如果驱动安装没有问题的话会在我的电脑设备管理器的端口上显示如图确定端口后在这里选择好已驱动成功的端口(我这里就是COM4)ps 其实这个不用查也没有关系新版的下载软件会自动搜索已经连接好的驱动接下来就是很重要的一点就是在最高和最低波特率选择里要尽量选择同样的波特率下载程序时才会比较稳定如图当一切准备好了以后看下板子的开关是不是处于开启的状态即波动开关拨到K位置头文件问题有的朋友可能还不太懂头文件(明白的朋友就不用浪费时间啦直接看头文件的安装方法)下面我就按我的理解简单给家解释一下说白了头文件就是驱动单片机的底层函数比如说P3口我们平时写程序时直接写P3=0xFF这样P3口的所有脚就都会拉高但这里面的P3就是在头文件里定义的!所以不管写什么样的单片机程序都要有它相应的头文件51单片机的头文件就是51.H我们在程序最上端只要加#include “reg51.h”就可以直接使用所以STC15F2K60S2也要有它的都文件当然了如果你要用51的头文件也能用必定STC15兼容51系列的所有功能但是STC15有自己的创新功能比如说AD通道的设置就要用到它自己的头文件头文件安装方法1首先要确定keil4 已经安装好2打开下载软件可以看到左边有一排对话框3 按动小箭头找到头文件选项这里就是stc15f2k60s2的整个头文件所在4选择选择上图然后点击确定这样整个的STC的头文件就安装到keil中了不妨我们可以去看一看这个STC文件夹就是刚安装的头文件里面的头文件有以上这些我们的板子是STC15F2K60S2所以我们选中它5然后复制然后返回INC文件夹并将刚才复制的STC15F2K60S2的头文件复制到INC文件夹的最下面里可以看出在INC文件夹里有很多.H文件也就是头文件把STC15F2K60S2复制到这里也方便了程序上的调用6这样做好后在程序上直接就可以了如果不把刚才的STC15头文件复制出来还要引用的话那就要这样不过都差不多看你喜欢哪一种方法若第一次在keil中创建项目在Keil中新建项目时选择芯片型号时,便会有“STC MCU Database”的选择项,如下图然后从列表中选择响应的MCU型号,所以我们在此选择“STC15F2K60S2”的型号,点击“确定”完成选择添加源代码文件到项目中,如下图:这里简单的介绍一下LCD1602 与 LCD12864的选择方式如图左上角 有三个焊点 中间点和左边连接 打开12864 和TFT功能 中间点和右边连接 打开1602功能并且这个STC15板子 多了可以加485芯片功能在对应的485焊盘上 焊好您要加的485 芯片 然后将图中485焊盘右边的 K 字母焊盘 和485芯片的第8脚 即对应K焊盘左边的焊盘连焊 就可以开起485芯片功能485所用单片机引脚 P3.0 P3.1 为串口P5.5为控制口这里的A B 就是485的输入输出口 如果接到485总线上 就可以进行485通讯了关于晶振和复位按键说明STC15F2K60S2有其内部R/C时钟及其复位功能但是它又同时支持外部晶振和外部复位其实相对而言外部晶振的稳定性要比内部高一些对于追求稳定性的项目来说用外部的晶振可能会更好一些所以在这里我们特意做了备用的外部晶振电路部分默认给大家带是22.1184MHz使用方法是上图晶振焊好的引脚附近都会有一个焊盘每一个焊盘都是直接连接到单片机的晶振输入口的如果是用外部晶振的时候就直接把晶振上下的焊盘和晶振引脚连接上即可同时下载程序时要把第一项的勾选去掉如上图这样就设置成了外部时钟复位按键也是同理在图中复位按键的右边也有个焊盘当用复位按键的时候将其用烙铁连接好即可同时在下载软件里的复位引脚做为I/O口勾选去掉如上图下载后重新上电就可以显示外部复位功能以上两个设置设置好以后下载第一次以后都要重新上电才能实现功能以后在下载就不用在重新上电了。
用数码管显示实时日历时钟的应用设计

(用数码管显示实时日历时钟的应用设计)摘要本课题通过MCS-51单片机来设计电子时钟,采用汇编语言进行编程,可以实现以下一些功能:小时,分,秒和年,月,日的显示。
本次设计的电子时钟系统由时钟电路,LED显示电路三部分组成。
51单片机通过软件编程,在LED数码管上实现小时,分,秒和年,月,日的显示;利用时钟芯片DS1302来实现计时。
本文详细介绍了DS1302 芯片的基本工作原理及其软件设计过程,运用PROTEUS软件进行电路连接和仿真,同时还介绍了74LS164,通过它来实现I|O 口的扩展。
关键词:时钟芯片,仿真软件,74LS164目录前言0.1设计思路 (8)0.2研究意义 (8)一、时钟芯片1.1 了解时钟芯片……………………………………………….8-91.2 掌握时钟芯片的工作原理………………………………….10-11二、74LS1642.1 了解74LS164........................................................11-12 2.2 掌握的74LS164工作原理. (12)三、数码管3.1 熟悉常用的LED数码管...........................................12-13 3.2 了解动态显示与静态显示. (13)四、程序设计4.0 程序流程图 (14)4.1 DS1392的驱动.......................................................15-16 4.2 PROTUES实现电路连接. (17)4.3 数码管的显示:小时;分;秒 (18)4.4 数码管显示:年;月;日 (19)五、总结…………………………………………………………………..20-21六、附页程序………………………………………………………………22-31前言单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
实验一STC15系列单片机数码管扫描显示和液晶显示

/*******1602液晶屏幕初始化*******/
void Display_init(void) //1602显示初始化
{ LCD_write_cmd(0x80); //写指令,设置DDRAM指针AC=0x00
for(i=0;i<16;i++) LCD_write_data(disp1[i]);//往第1行写数据:"Increase: . s"
LCD_write_data(' '); //1602符号位送正号对应的空的ASCII码
}
i=Ax/100; //计算百位
dispbuf[8]=SG[i]; //数码管对应加数秒的百位更新
LCD_write_data(i+0x30); //往1602写百位的ASCII码
void LCD_write_cmd(char cmd) //要传递指令
{ while((readstate&0x80)!=0); //查询LCD忙否?BF=1表示忙,循环,直到BF=0退出循环
writecmd=cmd; //写指令,即把指令送[0xE3FF]端口
#define LCD_CLR 0x01 //清屏,清DDRAM内容为空,AC=00H
#define LCD_MODE 0x38 //模式设置,001DLNF**,DL=1是8位数据接口,N=1两行显示,F=0是5*7点阵字符
#define LCD_ON 0x0c //显示开关控制,00001DCB,D=1开显示,C=0关光标,B=0关闪烁
dispbuf[6]=SG[i]|0x80; //数码管对应加数秒的个位更新
LCD_write_data(i+0x30); //往1602写个位的ASCII码
单片机和数码管设计的电子时钟

单片机和数码管设计的电子时钟电子时钟是一种用电子技术实现时间显示的设备,它能够精确地显示时间,并通过单片机控制数码管进行数字显示。
在本文中,将介绍单片机和数码管设计的电子时钟的原理、设计过程和实现方法。
一、电子时钟原理电子时钟的原理主要包括时钟信号源、计数器、数码管显示和时钟控制等部分。
时钟信号源提供一个恒定的频率信号,一般使用晶振产生。
计数器用于计数时钟信号的脉冲数,通过累加到一定的脉冲数后,完成对秒、分、时等单位的计数。
数码管显示用于将计数器的计数值转化为数字进行显示。
时钟控制部分通过单片机对时钟模块进行控制,完成时钟的设置、调整和显示等功能。
二、电子时钟设计过程1.确定需求:首先确定电子时钟的功能和要求,包括时间显示、闹钟功能、调节功能等。
根据需求确定显示部分所需的数码管数量和接口方式。
2.选择单片机:根据需求选择一款适合的单片机,考虑其处理能力、接口数量和扩展性等因素。
3.设计时钟源:选择合适的晶振作为时钟源,并将时钟信号输入到单片机的计时部分,生成一个恒定频率的脉冲信号。
4.编程设计:根据单片机类型选择相应的开发工具,编写程序实现时钟的计数、显示和控制功能。
其中,需要实现时钟的秒、分、时等单位的计数和显示、时钟调节和设置等功能。
5.数码管接口设计:根据数码管的数量和接口方式,进行接口设计。
常用的接口方式有共阳和共阴两种方式。
通过连接适当的电阻和引脚控制,实现对数码管进行数字显示。
6.硬件设计:根据实际需求和电路原理进行电路设计,包括电源电路、晶振电路和数码管显示电路。
注意电源的稳定性以及数码管的驱动电流和电压等参数。
7.调试和测试:完成硬件设计后,进行电子时钟的调试和测试工作。
通过对时钟进行时间设置和调整,验证时钟的计时和显示功能是否正常。
8.最终优化:对电子时钟的功能和性能进行评估,并进行必要的优化。
可以考虑添加闹钟功能、温度显示等扩展功能。
三、实现方法电子时钟的实现方法主要有两种,一种是基于单片机开发板实现,另一种是自己设计和制作。
第6章STC15F2K60S2单片机定时器及可编程时钟输出《单片机原理及应用》

第6章STC15F2K60S2单片机定时器及可编程时钟输出《单片机原理及应用》本文介绍了STC15F2K60S2单片机的定时器和可编程时钟输出功能。
单片机定时器是单片机中常用的功能模块之一,可以用于定时、计时、延时等应用。
STC15F2K60S2单片机具有多个定时器,包括定时/计时器的选择,工作模式的设置,定时器中断的配置等。
另外,该单片机还具备可编程时钟输出功能,可以用于生成各种频率的时钟信号。
一、STC15F2K60S2单片机定时器概述STC15F2K60S2是一款杰出的8051内核单片机,它具有多种功能和丰富的接口资源,适用于各种应用场景。
定时器是其中一个重要的功能模块,可以用于实现各种定时任务,例如周期性的数据采集、定时触发等。
STC15F2K60S2单片机具有4个定时器,分别为T0、T1、T2和T3。
每个定时器又分为两个独立的计时/定时模块,通常称之为T0高速定时器和T0低速定时器等。
这些定时器的工作频率由系统时钟频率决定,可以通过定时器控制寄存器来设置时钟来源和分频系数。
二、STC15F2K60S2单片机定时器的工作模式定时器有多种工作模式可供选择,常用的有定时器模式和计数器模式。
定时器模式主要用于实现定时功能,可以根据需求设置定时时长和触发条件。
计数器模式主要用于计数功能,可以将外部事件转换为内部计数脉冲,用于测量时间间隔或者脉冲频率。
STC15F2K60S2单片机定时器的工作模式可以通过相关的寄存器位进行配置。
例如,可以通过T2CON寄存器的T2M0和T2M1位来选择定时器2的工作模式,可以选择定时器模式、16位自动重载模式、13位同步计数器模式,或者外部事件计数器模式。
三、STC15F2K60S2单片机定时器中断的配置定时器中断是使用定时器功能的常用方法之一,可以在定时达到设定值时触发中断,执行相应的中断服务程序。
STC15F2K60S2单片机的定时器可以设置使能定时器中断,并通过相关的中断使能寄存器来控制定时器中断的使能和优先级。
单片机数码管显示时钟程序

ttincludeO //#include#include〈>ftdefine uchar unsigned charftdefine uint unsigned intsbit dula二P2"6;sbit wela二P2"7;sbit keyl=P3"4;sbit key2二P3"5;sbit key3=P3*6;sbit beep二P2"3;unsigned code table[]={0x3f , 0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 ,0x7f , 0x6f , 0x77 , 0x7c,0x39 , 0x5e , 0x79 , 0x71};uchar numl, num2, s, si, m, ml, f, fl, num, numf, nums, dingshi;uchar ns, nsl, nf, nf 1, numns, numnf;void delay(uint z);void keyscan ();void keyscanl ();void alram(); void display(uchar m, uchar ml, uchar f, ucharf1, uchars,ucharsl); void displayO(uchar nf, uchar nf1, uchar ns, uchar nsl); void main(){TMOD二0x01;//设定定时器0工作方式1THO=(65536-46080)/256 ;TLO=(65536-46080)%256 ;EA二1;//开总中断ETO=1;//开定时器0中断TRO二1;//启动定时器0中断numns=12;numnf=0;while (1){if(dingshi==0){keyscan ();display (m, ml, f, fl, s, si);alram();elsekeyscanl ();displayO (nf, nf 1, ns, nsl);}}}void keyscan ()if (keyl==0){delay(10);if(keyl==0)nums++;if (nums=:=24)nums二0;while (!keyl);display (m, ml, f, fl, s, si); }if(key2==0)delay(10);if (key2=0)numf++;if (numf==60)numf=O;while (!key2);display(m, ml, f, fl, s, si);}if(key3==0){delay (10);if(key3==0){dingshi二'dingshi;while(!key3)display(m, ml, f, fl, s, si);}}/* if(key4=0){delay (10);if(key4==0)flag二1;while(!key4);display (m, ml, f, fl, s, si);}}*/}void keyscanl(){if(keyl==0){delay 仃0);if(keyl==0)numns++;if (numns=24)numns=0;while (!keyl);// display (nf, nf 1, ns, nsl);if (key2=0)delay (10);if(key2==0)numnf++;if (numnf—60)numnf=0;while(!key2);// display (nf, nf 1, ns, nsl);}if(key3==0){delay 仃0);if(key3==0){dingshi^O;wh订e(!key3);display (m, ml, f, fl, s, si);}void alramOif((numnf==numf)&&(numns二二nums))beep二0;if (((numnf+l=:numf) && (numns~nums)) && (dingshi—O)) // 一分钟报时提示beep=l;}void displayO (uchar nf, uchar nf 1, uchar ns, uchar nsl)//闹钟显示函数{nf=numnf%10;nfl=numnf/10;ns=:numns%10;nsl 二numns./10;/* wela=l;P0=0xc0; //送位选数据wela=0;P0二Oxff;*/dula=l;PO二table[nsl]; dula=0;PO二Oxff;wela=l;PO二Oxfe;wela=0;delay (1);dula=l;PO二table[ns] 0x80; dula=0;PO=Oxff;wela=l;PO二Oxfd;wela=0;delay (1);dula=l;P0=table Lnf1]; dula=0;PO二Oxff;wela=l;PO=Oxfb;wela=O;delay (1);dula=l;PO=table[nf];dula=O;PO=Oxff;wela=l;P0=0xf7;wela=O;delay (1);}void display(uchar m, uchar ml, uchar f, ucharfl, uchars, ucharsl) // 时间显示{dula=l;PO二table [ml] ; //秒位第 1 位dula=0;P0=0xff;wela=l;PO=Oxef; wela=O; delay (1); dula=l;Portable Im]; dula=0;PO二Oxff; wela=l;PO二Oxdf; wela=0; delay (1);dula=l;P0=table[si]; dula=0;PO=Oxff; wela=l; PO二Oxfe; wela=0; delay (1);Portable [s] 0x80;//秒位第2位//时位第一位dula=l;PO二Oxff;wela=l;PO二Oxfd;wela=0;delay(1);dula=l;P0=table [fl] : //分位第一位dula=0;PO=Oxff;wela=l;PO=Oxfb;we la二0;delay (1);dula=l;PO二table[f] 0x80;dula=0;PO=Oxff;P0=0xf7;delay (1);void T0_timer() interrupt 1{TH0=(65536-46080)/256 ;TL0=(65536-46080)%256 ; num2++;if (num2=20){num++;num2=0;m=:num%10;ml二num/10;f=numf%10;f1二numf/10;s=nums%10;signums/10;if (num—59){num^O;numf++;if(numf59)numf=O;nums++;}if (nums二二24) nums=O;}}}void delay(uint z)uint x, y;for (x=110;x>0;x--)for (y=z;y>0;y一一);。
数码管显示时钟程序

sbit RST = P1^2;
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
uchar *WEEK[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"};
uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "};
Set_LCD_POS(p);
for(i=0;i<16;i++)
{
Write_LCD_Data(s[i]);
DelayMS(1);
}
}
void Format_DateTime(uchar d,uchar *a)
{
a[0]=d/10+'0';
a[1]=d%10+'0';
}
void main()
{
Init_LCD();
从DS1302读1字节数据
**************************************/
BYTE DS1302_ReadByte()
{
BYTE i;
BYTE dat = 0;
for (i=0; i<8; i++) //8位计数器
{
SCLK = 0; //时钟线拉低
Delay(); //延时等待
Display_LCD_String(0x00,LCD_DSY_BUFFER1);
十五位数码管电子钟万年历设计 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小时制,为此,要在程序中设置相应的标志,以利于主程序识别。
stc15串口范例程序

stc15串口范例程序STC15是一种常见的单片机型号,它具有丰富的外设和功能,其中包括串口通信功能。
下面是一个简单的STC15串口通信的范例程序,供你参考:c.#include <STC15F2K60S2.H>。
#define FOSC 11059200L.#define BAUD 9600。
void InitUART() {。
SCON = 0x50; // 8位数据,可变波特率。
TMOD = 0x20; // 设置定时器1为模式2。
TH1 = 256 FOSC/12/32/BAUD; // 波特率9600。
TL1 = TH1; // 初始化TL1。
TR1 = 1; // 启动定时器1。
ES = 1; // 使能串口中断。
EA = 1; // 打开总中断。
}。
void UARTInterrupt() interrupt 4 {。
if (RI) {。
P0 = SBUF; // 串口接收到的数据通过P0口输出。
RI = 0; // 清零接收中断标志位。
}。
if (TI) {。
TI = 0; // 清零发送中断标志位。
}。
}。
void main() {。
InitUART(); // 初始化串口。
while (1) {。
// 主循环。
}。
}。
以上是一个简单的STC15串口通信的范例程序。
在这个程序中,我们首先定义了晶振频率和波特率,然后编写了初始化串口的函数InitUART。
在主函数main中,我们调用InitUART进行串口的初始化,然后进入一个无限循环。
当有数据通过串口接收到时,会触发串口中断UARTInterrupt,并将接收到的数据通过P0口输出。
这个程序可以作为一个基础的串口通信范例,你可以根据自己的实际需求进行修改和扩展。
希望这个范例对你有所帮助。
STC15单片机PCF8563时钟芯片LCD1602显示4×4键盘设置时间程序

敬告:没有51单片机基础的人请慎重下载高质量实用性51单片机STC15W系列程序(3),STC8A系列可参考STC15单片机PCF8563时钟芯片LCD1602显示4×4键盘设置时间程序/**************************************************/ main主函数程序:#include "Library.h"unsigned char code orgval[7]={0x00,0x00,0x00,0x20,0x01,0x04,0x20,};unsigned char set_buf[13]={0,0,0,0,0,0,1,0,0,0,0,0,0,}; unsigned char t_buf[7];unsigned char t_rec[7];unsigned char time_buf[15];unsigned char x_value;unsigned char y_value;bit enter_flag;bit tmr200ms_flag=0;void Write_original(unsigned char *originalval);void Timer0_config(unsigned int ms);void Display_time(unsigned char *tm_buf);void main(){unsigned char sec_bkp;unsigned char testbuf[7];P1M1 &= 0x3F; P1M0 &= 0x3F;P2M1 &= 0x3F; P2M0 &= 0x3F;P5M1 &= 0xF3; P5M0 &= 0xF3;P4M1 &= 0x0F; P4M0 &= 0x0F;P2M1 &= 0xE5; P2M0 &= 0xE5;P0M1 = 0x00; P0M0 = 0x00;Timer0_config(1);LCD1602_init();EA = 1;//F0 = 0;//LCD1602_wbyte(0,0,"hi",sizeof("hi")-1);//test LCD1602//P0 = 0xFF;Read_time(0x02,testbuf);if(testbuf[0]&0x80){Write_original(orgval);}while(1){Key_driver();if(tmr200ms_flag){tmr200ms_flag=0;Read_time(0x02,t_rec);//Display_time(t_buf);//test}if(enter_flag==0){if(sec_bkp!=t_rec[0]){sec_bkp = t_rec[0];Display_time(t_rec);}}}}void Display_time(unsigned char *tm_buf){time_buf[0] = ((tm_buf[2])>>4)+'0';time_buf[1] = ((tm_buf[2])&0x0F)+'0';time_buf[2] = ':';time_buf[3] = ((tm_buf[1])>>4)+'0';time_buf[4] = ((tm_buf[1])&0x0F)+'0';time_buf[5] = ':';time_buf[6] = ((tm_buf[0])>>4)+'0';time_buf[7] = ((tm_buf[0])&0x0F)+'0';LCD1602_wbyte(0,0,time_buf,8);time_buf[0] = 0x02 + '0';time_buf[1] = 0x00 + '0';time_buf[2] = (tm_buf[6]>>4)+'0';time_buf[3] = (tm_buf[6]&0x0F)+'0';time_buf[4]= '-';time_buf[5] = (tm_buf[5]>>4)+'0';time_buf[6] = (tm_buf[5]&0x0F)+'0';time_buf[7]= '-';time_buf[8] = (tm_buf[3]>>4)+'0';time_buf[9] = (tm_buf[3]&0x0F)+'0';LCD1602_wbyte(0,1,time_buf,10);time_buf[0] = (tm_buf[4]&0x0F)+'0';LCD1602_wbyte(10,0,time_buf,1);}void Write_original(unsigned char *originalval) {Display_time(originalval);Write_time(0x02,originalval);}void KeyAction(unsigned char kc){unsigned int tmp;if(kc==0x26)//up{}else if(kc==0x28)//down{}else if(kc==0x25)//left:set x,y{if(enter_flag){if(y_value==0){if(x_value<10){x_value++;if(x_value==7){x_value = 10;}}else{x_value = 0;y_value = 1;}}else if(y_value==1){if(x_value<9){x_value++;}else{x_value = 0;y_value = 0;}}Setcursor(x_value,y_value);}}else if(kc==0x27)//right:set value{if(enter_flag){if(y_value==0){if(x_value==0||x_value==1){if(x_value==0){if(set_buf[0]<2){set_buf[0]++;}else{set_buf[0]=0;}}else if(x_value==1){if(set_buf[1]<9){set_buf[1]++;}else{set_buf[1]=0;}}if((set_buf[0]==2)&&(set_buf[1]>3)){set_buf[1] = 0;}t_buf[2] =( set_buf[0]<<4) |( set_buf[1]&0x0F);}else if(x_value==3||x_value==4){if(x_value==3){if(set_buf[2]<5){set_buf[2]++;}else{set_buf[2]=0;}}else if(x_value==4){if(set_buf[3]<9){set_buf[3]++;}else{set_buf[3]=0;}}t_buf[1] =(set_buf[2]<<4 )|( set_buf[3]&0x0F);}else if(x_value==6||x_value==7){if(x_value==6){if(set_buf[4]<5){set_buf[4]++;}else{set_buf[4]=0;}}else if(x_value==7){if(set_buf[5]<9){set_buf[5]++;}else{set_buf[5]=0;}}t_buf[0] = (set_buf[4]<<4 )|( set_buf[5]&0x0F);}else if(x_value==10){if(set_buf[6]<7){set_buf[6]++;}else{set_buf[6] = 0x01;}t_buf[4] = set_buf[6]&0x0F; }}else if(y_value==1){if(x_value==2||x_value==3){if(x_value==2){if(set_buf[7]<9){set_buf[7]++;else{set_buf[7]=0;}}else if(x_value==3){if(set_buf[8]<9){set_buf[8]++;}else{set_buf[8]=0;}}t_buf[6] = (set_buf[7]<<4)|( set_buf[8]);}else if(x_value==5||x_value==6){if(x_value==5){if(set_buf[9]<1){set_buf[9]++;else{set_buf[9]=0;}}else if(x_value==6){if(set_buf[10]<9){set_buf[10]++;}else{set_buf[10]=0;}if((set_buf[9]==1)&&(set_buf[10]>2)){set_buf[10] = 0;}}t_buf[5] = (set_buf[9]<<4)| set_buf[10];}else if(x_value==8||x_value==9){if(x_value==8){if(set_buf[11]<3){set_buf[11]++;}else{set_buf[11]=0;}}else if(x_value==9){if(set_buf[12]<9){set_buf[12]++;}else{set_buf[12]=0;}if((set_buf[11]==3)&&(set_buf[12]>0)&&((t_buf[5]==0x04)| |(t_buf[5]==0x06)||(t_buf[5]==0x09)||(t_buf[5]==0x11))){set_buf[12] = 0;}elseif((set_buf[11]==3)&&(set_buf[12]>1)){set_buf[12] = 0;}}t_buf[3] = (set_buf[11]<<4)|set_buf[12];}if((t_buf[5]==0x02)&&(t_buf[3]>=0x29)){tmp = set_buf[7]*10 + set_buf[8];tmp = tmp + 2000;if((tmp%4==0)&&(tmp%100!=0)){t_buf[3] = 0x29;}else{t_buf[3] = 0x28;}}if(((t_buf[5]==0x04)||(t_buf[5]==0x06)||(t_buf[5]==0x09) ||(t_buf[5]==0x11))&&(t_buf[3]==0x31)){t_buf[3]=0x30;}}Display_time(t_buf);}}else if(kc==0xC0)//esc{OffCursor();Setcursor(0,0);enter_flag = 0;}else if(kc==0x0D)//enter{if(enter_flag==0){enter_flag = 1;OnCursor();Setcursor(0,0);}else{enter_flag = 0;OffCursor();Setcursor(0,0);Write_time(0x02,t_buf); }}else{}}void Timer0_config(unsigned int ms){unsigned long tmp;tmp = (MAIN_Fosc*ms)/1000;tmp = 65536 - tmp;TL0 = (unsigned char)tmp;TH0 = (unsigned char)(tmp>>8);TMOD &= 0xF0;AUXR |= 0x80;ET0 = 1;TR0 = 1;}void Timer0_interrupt() interrupt 1{static unsigned int tmr200ms=0;Key_scan();tmr200ms++;if(tmr200ms>500){tmr200ms = 0;tmr200ms_flag=1; }}/**************************************************/ PCF8563程序及简要说明:/*****************************1.IIC-bus slave address:read A3h and write A2h2.16 8-bit registers3.Binary coded Decimal->BCD4.registers describe1>Control_status_1 address 00h-> 0000 00002>Control_status_2 address 01h-> 0000 00003>VL_seconds address 02h-> VL 000(5) 0000(9)defualt VL = 14>Minutes address 03h-> x 000(5) 0000(9)5>Hours address 04h-> xx 00(2) 0000(9)6>Days address 05h-> xx 00(3) 0000(9)7>Weekdays address 06h-> xxxx x000(6):000->sunday 110->saturday8>Century_months address 07h-> 0xx 0(1) 0000(9)9>Years address 08h-> 0000(9) 0000(9)->99Access time for read/write operations->start->slave address->data/data...->stop->10>~13> alarm registers omitted:default value,min_alarm->0b1000 0000, hour_alarm->0b1000 0000,day_alarm->0b1000 0000,week_alarm->0b1000 0000,14> clkout control register omitted:default value,0b1000 0000,15>Timer_control address 0Eh->default value,0b0000 0000,16>Tiemr address 0Fh->default value,0b0000 0000*******************************/ #include "Library.h"//struct t_truct//{// unsigned char sec;// unsigned char min;// unsigned char hor;// unsigned char day;// unsigned char mon;// unsigned int year;// unsigned char week;//};void Delay1us() //@11.0592MHz {unsigned char i;_nop_();_nop_();i = 8;while (--i);}void IIC_start(){SDA = 1;SCL = 1;Delay1us();SDA = 0;Delay1us();SCL = 0;}void IIC_stop(){SCL = 0;SDA = 0;Delay1us();SCL = 1;Delay1us();SDA = 1;Delay1us();}unsigned char IIC_readAck(){unsigned char val;unsigned char mask;SDA = 1;for(mask=0x80;mask!=0;mask>>=1) {Delay1us();SCL = 1;if(SDA)val |= mask;elseval &= ~mask;Delay1us();SCL = 0;}SDA = 0;Delay1us();SCL = 1;Delay1us();SCL= 0;return val;}unsigned char IIC_readNack(){unsigned char val;unsigned char mask;SDA = 1;for(mask=0x80;mask!=0;mask>>=1) {SCL = 1;Delay1us();if(SDA)val |= mask;elseval &= ~mask;SCL = 0;Delay1us();}SDA = 1;Delay1us();SCL = 1;Delay1us();SCL= 0;return val;}bit IIC_write(unsigned char dat) {unsigned char mask;bit ack;for(mask=0x80;mask!=0;mask>>=1) {//Delay1us();if((dat&mask)==0)SDA = 0;elseSDA = 1;Delay1us();SCL = 1;Delay1us();SCL = 0; ////////}SDA = 1;Delay1us();//SCL = 0;SCL = 1;ack = SDA;Delay1us();// SCL = 1;// Delay1us();SCL = 0;return ~ack;}void Read_time(unsigned char addr,unsigned char *tm_buf) { do{IIC_start();if(IIC_write(0xA2))break;IIC_stop();}while(1);IIC_write(addr);IIC_start();//or IIC_stop()IIC_write(0xA3);tm_buf[0] = IIC_readAck();tm_buf[1] = IIC_readAck();tm_buf[2] = IIC_readAck();tm_buf[3] = IIC_readAck();tm_buf[4] = IIC_readAck();tm_buf[5] = IIC_readAck();tm_buf[6] = IIC_readNack();IIC_stop();}void Write_time(unsigned char addr,unsigned char *tm_buf) {do{IIC_start();if(IIC_write(0xA2))break;IIC_stop();}while(1);IIC_write(addr);IIC_write(tm_buf[0]);IIC_write(tm_buf[1]);IIC_write(tm_buf[2]);IIC_write(tm_buf[3]);IIC_write(tm_buf[4]);IIC_write(tm_buf[5]);IIC_write(tm_buf[6]);IIC_stop(); }/**************************************************/4×4键盘程序:#include "Library.h"/**********************************if enter key down 3second ,into time setting mode,else calculator mode**********************************/unsigned char code keycode[4][4]={{0x31,0x32,0x33,0x26},//up{0x34,0x35,0x36,0x28},//down{0x37,0x38,0x39,0x25},//left{0x30,0xC0,0x0D,0x27},//right};unsigned char keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};//bit enter3s;//down 3svoid Key_scan(){static unsigned char keyout = 0;static unsigned char keybuf[4][4]={{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},};unsigned char i;keybuf[keyout][0]=(keybuf[keyout][0]<<1)|keyin_1;keybuf[keyout][1]=(keybuf[keyout][1]<<1)|keyin_2;keybuf[keyout][2]=(keybuf[keyout][2]<<1)|keyin_3;keybuf[keyout][3]=(keybuf[keyout][3]<<1)|keyin_4;for(i=0;i<4;i++){if((keybuf[keyout][i]&0x0F)==0x00){keysta[keyout][i] = 1;}else if((keybuf[keyout][i]&0x0F)==0x0F){keysta[keyout][i] = 0;}}keyout++;keyout &= 0x03;switch(keyout){case 0:keyout_4=1;keyout_1=0;break;case 1:keyout_1=1;keyout_2=0;break;case 2:keyout_2=1;keyout_3=0;break;case 3:keyout_3=1;keyout_4=0;break;default:break;}}void Key_driver(){unsigned char i,j;static unsigned char stabkp[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};for(i=0;i<4;i++){for(j=0;j<4;j++){if(stabkp[i][j]!=keysta[i][j]){if(stabkp[i][j]==0){KeyAction(keycode[i][j]); }}stabkp[i][j] = keysta[i][j]; }}}/**************************************************/ LCD1602程序:#include "Library.h"void LCD1602_rsta(){unsigned char tmp;P0 = 0xFF;//this is a mustrs = 0;rw = 1;do{en = 1;//Delay1us();tmp = P0;//Delay1us();en = 0;}while(tmp&0x80);}void LCD1602_wdat(unsigned char dat){LCD1602_rsta();rs=1;rw=0;P0 = dat;en = 1;//Delay1us();en = 0;}void LCD1602_wcmd(unsigned char cmd){LCD1602_rsta();rs=0;rw=0;P0 = cmd;en = 1;//Delay1us();en = 0;}void Setcursor(unsigned char x,unsigned char y){if(y==0)x = x + 0x00;else if(y==1)x = x + 0x40;LCD1602_wcmd(x|0x80);}void LCD1602_wbyte(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len){Setcursor(x,y);while(buf_len>0){LCD1602_wdat(*buf++); buf_len--;}}void OnCursor(){LCD1602_wcmd(0x0F);}void OffCursor(){LCD1602_wcmd(0x0C);}void LCD1602_init(){// Delay15ms();// LCD1602_wcmd(0x38);// Delay5ms();LCD1602_wcmd(0x38);// LCD1602_wcmd(0x08);LCD1602_wcmd(0x06);LCD1602_wcmd(0x0C);LCD1602_wcmd(0x01);}/**************************************************/Library.h#ifndef _Library_H#define _Library_H#include "STC15.h"#include "intrins.h"#define MAIN_Fosc 11059200L//PCF8563sbit SCL = P1^6;sbit SDA = P1^7;//sbit SDA = P5^3;//sbit SCL = P5^2;void Read_time(unsigned char addr,unsigned char *tm_buf); void Write_time(unsigned char addr,unsigned char *tm_buf); void Delay1us();//4x4Keysbit keyin_1 = P2^7;sbit keyin_2 = P2^6;sbit keyin_3 = P5^3;sbit keyin_4 = P5^2;sbit keyout_1 = P4^7;sbit keyout_2 = P4^6;sbit keyout_3 = P4^5;sbit keyout_4 = P4^4;void Key_driver();void Key_scan();void KeyAction(unsigned char kc);//LCD1602sbit rs = P2^4;sbit rw = P2^3;sbit en = P2^1;void LCD1602_init();void LCD1602_wbyte(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len);void OnCursor();void OffCursor();void Setcursor(unsigned char x,unsigned char y);void LCD1602_wdat(unsigned char dat);#endif。
【单片机】c51数字时钟(带年月日显示)

【单片机】c51数字时钟(带年月日显示)集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-【单片机】c51数字时钟(带年月日显示)显示当前时间:9点58分34秒(第一个零表示闹钟未开启)当前日期:10年4月六日摘要:本设计以单片机为核心,LED数码管动态扫描显示。
采用矩阵式键盘输入能任意修改当前时间日期和设定闹钟时间。
具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能说明系统的功能选择由7个按键完成。
其中,分别对应调整当前时间的时和分,为外部中断0,控制闹钟功能的开启/关闭(开启时数码管第一位显示字母’c’)用作外部中断1,当前时间的显示与闹铃时间显示切换,闹钟显示时按,可进行闹钟时分的设定,此时,led1灯灭。
闹铃时间到切闹钟开关开启时,闹铃响一分钟。
\\对年月日进行调整(第一次按,就进入了年月日的显示,现在就可对日期进行调整)。
按回到当前时间的显示状态。
整点到时:报警对应小时的次数。
程序如下:#include<>#include<>#include<>#define uchar unsigned char#define uint unsigned intuchar data keyvalue; //查到的键值uchar data keys; //转换出的数字uchar dis[8];uchar codeseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x39,0xf7}; // 0 1 2 3 4 5 6 7 8 9 - 灭灯 cnsbit led_duan=P2^6;//段选通sbit led_wei=P2^7;//位选通sbit speaker=P2^3;//蜂鸣器sbit minitek=P3^0;//分校正按键sbit hourk=P3^1;//小时校正按键sbit p3_4=P3^4;//sbit yeark=P3^5;//年sbit monthk=P3^6;//月sbit dayk=P3^7;//日uchar data wei,i;bit leap_year;//闰年标志位bit dis_nyr;bit cal_year=1;bit calculate=1;//显示年月日与当前时间切换标志uchar data c_min;//闹钟‘分寄存单元uchar data c_hou;//闹钟、小时寄存单元uchar data second;//秒uchar data minite;//分变量uchar data hour;//小时变量uchar data year,month,day;//定义年月日变量uchar data CNTA;uchar data speaker_num; //蜂鸣次数bit beep; //整点报时标志bit run; //运行标志bit flash; //灭灯标志bit clarm_switch; //闹钟开关标志bit baoshi; //报时开关标志sbit led1=P1^6; // 按键标识指示灯sbit led2=P1^7; // 运行标志指示灯sbit P3_2=P3^2;sbit P3_3=P3^3;uint n,k;/*10微秒级延时*/void delay_10us(uchar n)?{ do{ _nop_();_nop_();_nop_();_nop_();_nop_();}while(--n);}/***毫秒级延时 ***/void delay_ms(uint n)?{ do delay_10us(131);while(--n);}/****** 当前时间转换******/clk_to_dis(){dis[0]=second%10;dis[1]=second/10;if(flash)dis[2]=10;else dis[2]=11;dis[3]=minite%10;dis[4]=minite/10;dis[5]=hour%10;dis[6]=hour/10;}/*****定时闹钟显示译码(用于七段码显示)*****/ clarm_to_dis(){dis[0]=c_min%10;dis[1]=c_min/10;if(flash)dis[2]=10;//亮灯else dis[2]=11; //灭灯dis[3]=c_hou%10;dis[4]=c_hou/10;dis[5]=10;dis[6]=13;}/***********年月日显示译码************/ nyr_to_dis(){dis[0]=day%10;dis[1]=day/10;dis[2]=10;//显示'-'dis[3]=month%10;dis[4]=month/10;dis[5]=10; // '-'dis[6]=year%10;dis[7]=year/10;}/*主函数*/void main(){P2=0xff;P1=0XFF;p3_4=0;run=1;led2=0;//运行指示灯亮led1=1;flash=0x00;dis[2]=10; //第三位显示“-”wei=0x7f;//选通低位 i=0;?second=21;minite=58;hour=9;CNTA=0x00;year=10;month=4;day=5;clk_to_dis(); TMOD=0x11;TH0=15560/256;TL0=15560%256;TH1=0xfc;TL1=0x18;EA=1;PT0=1;EX0=1; //开中断;EX1=1;?ET0=1;ET1=1;TR0=1;TR1=1;while(1){while(run==1){clk_to_dis();if(calculate){if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day++;?if(day>31){day=0x01;month++; if(month==13){month=1;year++;cal_year=1;}}led1=0; //指示灯亮}if(month==4|month==6|month==9|month==11){day++;if(day>30){day=0x01;month++;}led1=0; //指示灯亮}if(month==2) {if(leap_year==1){day++;if(day==30)day=1;}else {day++;if(day==29)day=1;}}while(cal_year){if((year+2000)%400==0) leap_year=1; // 被400整除为闰年else if((year+2000)%100==0) leap_year=0; //不能被400整除能被100整除不是闰年 else if((year+2000)%4==0) leap_year=1; //不能被400、100整除能被4整除是闰年 else leap_year=0;cal_year=0;}calculate=0;led1=1;}while(!minitek){for(n=0;n<1000;n++);if(!minitek==0)break; //延时防抖minite++;second=0x00;led1=0;for(n=0;n<20;n++){speaker=!speaker;delay_10us(50); //蜂鸣器响 }if(minite==60)minite=0x00; while(!minitek); //等待键松开led1=1;//显示灯}while(!hourk){for(n=0;n<1000;n++);if(!hourk==0)break;hour++;second=0x00;led1=0;。
单片机数码管显示时钟程序

#include<>//#include#include<>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit beep=P2^3;unsigned code table[]={0x3f , 0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 ,0x7f , 0x6f , 0x77 , 0x7c,0x39 , 0x5e , 0x79 , 0x71};uchar num1,num2,s,s1,m,m1,f,f1,num,numf,nums,dingshi;uchar ns,ns1,nf,nf1,numns,numnf;void delay(uint z);void keyscan ();void keyscan1 ();void alram();void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1); void display0(uchar nf,uchar nf1,uchar ns,uchar ns1);void main(){TMOD=0x01;//设定定时器0工作方式1TH0=(65536-46080)/256 ;TL0=(65536-46080)%256 ;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0中断numns=12;numnf=0;while(1){if(dingshi==0){keyscan ();display(m,m1,f,f1,s,s1);alram();}else{keyscan1 ();display0(nf,nf1,ns,ns1);}}}void keyscan (){if(key1==0){delay(10);if(key1==0)nums++;if (nums==24)nums=0;while(!key1);display(m,m1,f,f1,s,s1); }if(key2==0){delay(10);if(key2==0)numf++;if (numf==60)numf=0;while(!key2);display(m,m1,f,f1,s,s1); }if(key3==0){delay(10);if(key3==0){dingshi=~dingshi;while(!key3)display(m,m1,f,f1,s,s1);}/* if(key4==0){delay(10);if(key4==0){flag=1;while(!key4);display(m,m1,f,f1,s,s1);}} */}void keyscan1(){if(key1==0)delay(10);if(key1==0)numns++;if (numns==24)numns=0;while(!key1);// display(nf,nf1,ns,ns1); }if(key2==0){delay(10);if(key2==0)numnf++;if (numnf==60)numnf=0;while(!key2);// display(nf,nf1,ns,ns1); }if(key3==0){delay(10);if(key3==0){dingshi=0;while(!key3);// display(m,m1,f,f1,s,s1);}}}void alram(){if((numnf==numf)&&(numns==nums))beep=0;if(((numnf+1==numf)&&(numns==nums))&&(dingshi==0))//一分钟报时提示 beep=1;}void display0(uchar nf,uchar nf1,uchar ns,uchar ns1)//闹钟显示函数 {nf=numnf%10;nf1=numnf/10;ns=numns%10;ns1=numns/10;/* wela=1;P0=0xc0;//送位选数据wela=0;P0=0xff;*/dula=1;P0=table[ns1];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[ns]|0x80;dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[nf1];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[nf];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1); }void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1) //时间显示 {dula=1;P0=table[m1]; //秒位第1位dula=0;P0=0xff;wela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[m]; // 秒位第2位dula=0;P0=0xff;wela=1;P0=0xdf;delay(1);dula=1;P0=table[s1]; //时位第一位 dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[s]|0x80;dula=0;P0=0xff;wela=1;P0=0xfd;delay(1);dula=1;P0=table[f1]; //分位第一位 dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[f]|0x80;dula=0;P0=0xff;wela=1;P0=0xf7;delay(1);}void T0_timer() interrupt 1 {TH0=(65536-46080)/256 ;TL0=(65536-46080)%256 ;num2++;if(num2==20){num++;num2=0;m=num%10;m1=num/10;f=numf%10;f1=numf/10;s=nums%10;s1=nums/10;if(num==59){num=0;numf++;if(numf==59){numf=0;nums++;}if (nums==24)nums=0;}}}void delay(uint z) {uint x,y;for(x=110;x>0;x--) for(y=z;y>0;y--); }。
20103020065-陈雪莲-基于STC15单片机的电子钟设计详解

安康学院学年论文﹙设计﹚题目基于STC15单片机的电子钟设计学生姓名陈雪莲学号2013020065所在院(系)电子与信息工程学院专业班级 2013级电子信息工程系2班指导教师张兴辉年月日安康学院学年论文(设计)基于STC15单片机的电子钟设计(作者:陈雪莲)(安康学院电子与信息工程学院电子信息工程专业2013级,陕西安康725000)指导教师:张兴辉【摘要】本设计是基于STC单片机的电子时钟技术,由STC15C5A16S2芯片和LCD1602液晶显示屏,辅以必要的的电路,构成一个单片机可调整时钟。
电子钟可采用数字电路实现,也可以采用单片机来完成。
LCD显示“年”,“月”,“日”“星期”“时”,“分”“秒”,用S6,S8,S11,S10键进行调整时间,S6表示设置,S8表示加,S11表示键,S10表示确定。
现在是自动化高度发达的时代,特别是电子类产品都是靠内部的控制电路来实现对产品的控制,达到自动运行的目的,这就需要我们这里要做的设计中的电器元件及电路的支持。
在这次设计中主要是用STC15FK61S2来进行定时,也结合着其他辅助电路实施控制。
【关键词】可调整时钟STC15F2K61S2 LCD1602Design of electronic clock based on STC15 single chipmicrocomputerAuthor: ChenXue lian(Grade 2013,Class 1,Major Electronic information engineering,Electronic & Information Engineering Dept.,Ankang University,Ankang 725000,Shaanxi)Directed by:ZhangXinghuiAbstract:The design is based on the STC single-chip electronic clock technology, by theSTC15C5A16S2 chip and LCD1602 LCD display, supplemented by the necessary circuit, constitute a single chip can adjust the clock. Electronic clock can be used to achieve digital circuits, can also be used to complete the mcu. LCD show "year", "month", "day" "week", "minute", "second", with S6, S8, S11, S10 key to adjust the time, S6 said, S8,, S11, S10, said the key to determine. Now is the era of highly developed automation, especially electronic products are by the internal control circuit to achieve control of products, achieve the purpose of automatic operation, which requires us to do the design of electronic components and circuit support. In this design is mainly used STC15FK61S2 to carry out timing, but also combined with other auxiliary circuit implementation control.Key words:Adjustable clock STC15F2K61S2 LCD16020 引言随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A 转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。