单片机控制数码管显示时分秒

合集下载

基于51单片机的数码管时钟(带闹钟调时秒表)

基于51单片机的数码管时钟(带闹钟调时秒表)

基于51单片机的数码管时钟(带闹钟调时秒表)/**************************************************************** ************ ** *********************************************************** ** * * ** * * ** * 基于51单片机的数码管时钟程序* ** ** * * ** * * *********************************************************** ** ** ************************************************************ ****************/#include<stdio.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^6; //申明u1锁存器的锁存端sbit wela=P2^7; //申明u2锁存器的锁存端sbit key1=P3^0; //功能键sbit key2=P3^1;//增大键sbit key3=P3^2;//减小键sbit key4=P3^3;//秒表查看键sbit beep=P2^3;//蜂鸣端uchar num,num1,num2,numm;uchar numf,num,nums,num;uchar s,s1,f,f1,m,m1;uchar ns,ns1,nf,nf1;uchar numns,numnf;uchar dingshi;void display(uchar m,uchar m1,ucharf,uchar f1,uchar s,uchar s1);void display1(uchar nf,uchar nf1,uchar ns,uchar ns1);void key();void key1();void alram();void di();void delayms(xms);void T0_time() interrupt 1;void miaobiao();uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x77,0x7c,0x39,0x5e,0x79,0x71};/*********************************************************主函数void main()*********************************************************/int main(){TMOD=0X01;TH0=(65536-46080)/256;TL0=(65536-46080)%256;EA=1;ET0=1;TR0=1;nums=12;numf=0;num2=0;num=0;while(1){if(dingshi==0){keyscan();display(m,m1,f,f1,s,s1);alarm();}else{miaobiao();keyscan1();display1(nf,nf1,ns,ns1);}}return 0;}/********************************************************* 蜂鸣器函数di()*********************************************************/ void di(){beep=0;delayms(100);beep=1;}/********************************************************** 按键调时函数key()**********************************************************/ void keyscan(){if(key1==0){delayms(10);display(m,m1,f,f1,s,s1);}}}/********************************************** 按键设定闹钟函数keyscan1();***********************************************/ void keyscan1(){if(key1==0){delayms(10);if(key1==0){ numns++;if(numns==24);numns=0;while(!key1);di();display1(nf,nf1,ns,ns1);}}if(key2==0){delayms(10);if(key2==0){ numnf++;if(numnf==24);numnf=0;while(!key2);di();display1(nf,nf1,ns,ns1);}}if(key3==0){delayms(10);if(key3==0){dingshi=0;while(!key1);di();display1(nf,nf1,ns,ns1);}}}/********************************************************* 闹钟函数alram()*********************************************************/ void alram(){if((nums==numns)&&(numnf==numf))beep=0;}/*********************************************************秒表函数miaobiao()*********************************************************/ void miaobiao(){if(key4==0){delayms(100);if(key4==0){while(!key4);di();displaym(uchar m,uchar m1);}}}/********************************************************* 正常显示函数display()*********************************************************/ void display(uchar m,uchar m1,ucharf,uchar f1,uchar s,uchar s1){dula=1;P0=table[m1]//秒位第1位dula=0;PO=0xff;// 送入位选信号前关闭所有显示,防止打开位选锁存时wela=1;P0=0xef;wela=0;delayms(10);dula=1;P0=table[m]; //秒第2位dula=0;P0=0xff;wela=1;P0=0xdf;wela=0;delayms(100)dula=1;P0=table[f1]; //分第1位dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delayms(100)dula=1;P0=table[f]; //分第2位dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delayms(10)dula=1;P0=table[s1]; //时第1位dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delayms(100)dula=1;P0=table[s]; //时第2位dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(10)}/********************************************************** ***调时闹钟显示函数display1()*********************************************************** **/void display1(uchar nf,uchar nf1,uchar ns,uchar ns1){nf1=numnf/10;nf=numnf%10;ns1=nums/10;ns=nums%10;dula=1;P0=table[nf1];//分第1位dula=0;P0=0xff;wela=1;P0=0xfb;//待改参数wela=0;delayms(10);dula=1;P0=table[nf];//分第2位dula=0;P0=0xff;wela=1;P0=0xf7;//待改参数wela=0;delayms(10);P0=table[ns1];//时第1位dula=0;P0=0xff;wela=1;P0=0xfe;//待改参数wela=0;delayms(10);dula=1;P0=table[ns];//时第2位dula=0;P0=0xfd;wela=1;P0=0xff;//待改参数wela=0;delayms(10);}/********************************************************** ***秒表显示函数displaym()*********************************************************** **/void displaym(uchar m,uchar m1){dula=1;P0=table[m1];//秒位第一位P0=0xff;wela=1;P0=0Xbf;wela=0;delayms(10);dula=1;P0=table[m];dula=0;P0=0xff;wela=1;P0=0X7f;wela=0;delayms(10);}/**************************************************** 中断服务函数void T0_time() interrupt 1****************************************************/ void T0_time() interrupt 1{TH0=(65536-45872)/256; //46080TL0=(65536-45872)%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;}}}/*************************************************** 延时函数delayms()***************************************************/ void delayms(xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); }。

基于51单片机的时分秒显示

基于51单片机的时分秒显示

福建农林大学金山学院《电子器件设计与制作》课程设计报告设计题目基于51单片机的时分秒显示专业年级12电子科学与技术姓名学号*********成绩2015 年 5月1日目录前言 (1)§1 设计要求 (1)§2 总体设计过程 (1)2.1 使用的仪器与器材 (1)2.1.1 电路系统框图 (2)2.1.2 系统硬件概述 (2)2.2电路图(外设部分) (2)2.2.1 74LS138译码器 (2)2.2.2 74LS138译码器工作方式 (4)2.3数码管的结构与工作原理 (5)§3 工作原理 (5)§4原理图和PCB图 (6)§5 仿真实验 (7)§6电路板制作 (8)§7 感想与体会 (8)§8 完成效果图 (9)§9 参考文献 (10)§9 附录 (11)万年历设计前言电子万年历是一种日常计时工具,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能。

数字电子万年历采用直观的数字显示,可以同时显示年、月、日、星期、时、分、秒,还具有时间校准等功能。

本设计要实现硬件与软件两方面的同步设计。

硬件部分主要由AT89C51单片机、74LS138芯片和数码管组成。

AT89C51单片机适合于许多较为复杂控制应用场合,74LS138芯片实现端口扩展和数码管实现显示。

软件方面主要包括时间调整程序和显示程序。

设计中直接采用单片机的定时计数器来提供秒信号,从而实现时、分、秒计数。

程序采用C语言或者汇编语言编写,所有程序编写完成后,首先在Keil uVision3软件中进行调试,然后在Poteus 软件中仿真成功,最后通过STC_ISP_V4.80下载到单片机内进行检验,从而完成此次电子万年历的设计。

一、要求1、设计任务以AT89C51单片机控制的时钟,在数码管上显示当前的时间。

2、设计要求2.1 使用数码管显示当前时间,显示格式为“时时-分分-秒秒”,并且误差需要在一定范围之内。

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计设计一个51单片机数码管时钟电路,让我们开始吧。

一、设计思路该数码管时钟电路的设计主要包括以下几个方面:1.使用DS1302时钟芯片获取真实时间;2.使用I2C总线方式将DS1302时钟芯片与51单片机连接;3.使用74HC595芯片驱动数码管显示;4.使用按键控制时钟的设置和调节;5.使用蜂鸣器发出报警声;6.使用LED指示灯显示时钟状态。

二、硬件设计部分数码管显示部分:1.使用4位共阳数码管作为时分显示器,使用1位共阳数码管作为秒显示器;2.使用8片74HC595芯片级联起来,将时分秒数据传输到数码管显示;3.设置共阳数码管的通阳管为P0口,设置74HC595的DS(串行数据输入)、SH(上升沿锁存)、STCP(74HC595的8位锁存输出)引脚接到P1.2、P1.3、P1.4端口;4.设置8个控制引脚接到P1.5~P1.12端口。

实时时钟部分:1.使用DS1302时钟芯片连接到P2.0、P2.1、P2.2、P2.3、P2.4、P2.5、P2.6、P2.7端口;2.设置时钟复位引脚接到P0.1端口,时钟传输使能引脚接到P0.2端口。

按键输入部分:1.设置按键S1接到P3.2端口,按键S2接到P3.3端口;2.设置按键的上拉电阻,使其处于高电平状态;3.设置按键的下降沿触发外部中断,以便检测按键的按下事件。

其他部分:1.设置蜂鸣器接到P0.0端口,并使用普通电阻限流;2.设置LED指示灯接到P0.7端口。

三、软件设计部分1.初始化函数:初始化P0、P1、P2、P3口的状态;2.DS1302驱动函数:包括初始化DS1302芯片和读写DS1302寄存器的函数;3.74HC595驱动函数:包括初始化74HC595芯片,以及向74HC595芯片发送8位数据的函数;4.数码管显示函数:将时分秒数据按位转换为对应的数字和状态,并调用74HC595驱动函数显示;5.按键检测函数:检测按键的按下事件,并根据按键事件的不同触发不同的操作;6.报警函数:当设定时间到达时,将触发报警声,并控制LED灯闪烁;7.主函数:循环读取DS1302时间,并更新数码管显示,检测按键事件,触发报警。

51单片机数码管显示时钟(C语言)

51单片机数码管显示时钟(C语言)

* 输出
:无
*******************************************************************************
/
void main() {
Ds1302Init(); Timer0Configuration(); while(1) {
Ds1302ReadTime(); disp[7] = DIG_CODE[TIME[0]&0x0f]; disp[6] = DIG_CODE[TIME[0]>>4]; disp[5] = 0X40; disp[4] = DIG_CODE[TIME[1]&0x0f]; disp[3] = DIG_CODE[TIME[1]>>4]; disp[2] = 0X40; disp[1] = DIG_CODE[TIME[2]&0x0f]; disp[0] = DIG_CODE[TIME[2]>>4]; }
/
void DigDisplay() interrupt 1 { //定时器在工作方式二会自动重装初,所以不用在赋值。 // TH0=0X9c;//给定时器赋初值,定时 1ms // TL0=0X00;
DIG=0; //消隐 switch(Num) //位选,选择点亮的数码管, {
case(7): LSA=0;LSB=0;LSC=0; break;
uchar n;
EA = 0; RST = 0; _nop_();
SCLK = 0;//先将 SCLK 置低电平。 _nop_(); RST = 1; //然后将 RST(CE)置高电平。 _nop_();
for (n=0; n<8; n++)//开始传送八位地址命令 {

单片机-数码管-时分秒显示

单片机-数码管-时分秒显示

#include<>#define uchar unsigned char#define uint unsigned intuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~9的数码管显示sbit dula=P2^6;//声明段选sbit wela=P2^7;//声明位选uchar h,m,s,num1;//定义变量void delay(uint xms)//延时函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void init()//初始化{TMOD=0x10;// 0001 0001 定时器0的工作方式1,定时器1的工作方式1 TH1=(65536-45872)/256;TL1=(65536-45872)%256;EA=1;//开总中断ET1=1;//开定时器1中断TR1=1;//启动定时器1}void main()//主函数{init(); //初始化while(1) //while循环{wela=1; //打开位选P0=0xfe; //点亮数码管wela=0; //关闭位选dula=1; //打开段选P0=table[h/10];//送入数据dula=0; // 关闭段选delay(1); //延时5mswela=1; //打开位选P0=0xfd; //点亮数码管wela=0; //关闭位选dula=1; //打开段选P0=table[h%10];//送入数据dula=0; // 关闭段选delay(1); //延时5mswela=1; //打开位选P0=0xfb; //点亮数码管wela=0; //关闭位选dula=1; //打开段选P0=table[m/10];//送入数据dula=0; // 关闭段选delay(1); //延时5mswela=1; //打开位选P0=0xf7; //点亮数码管wela=0; //关闭位选dula=1; //打开段选P0=table[m%10];//送入数据dula=0; // 关闭段选delay(1); //延时5mswela=1; //打开位选P0=0xef; //点亮数码管wela=0; //关闭位选dula=1; //打开段选P0=table[s/10];//送入数据dula=0; // 关闭段选delay(1); //延时5mswela=1;P0=0xdf;wela=0;dula=1;P0=table[s%10];dula=0;delay(1);}}void T1_time()interrupt 3 //中断3{TH1=(65536-45872)/256; //重装初值TL1=(65536-45872)%256; //num1++; //num2每加一次判断一次是否到20次了if(num1==20) //如果到了20次,说明1秒钟到了{num1=0; //把num1清零,重新再计20次s++; //s每加一次判断一次,是否到60次了if(s==60) //如果到了60次,说明1分钟到了{s=0; //把s清零,重新再计60次m++; //m每加一次判断一次是否到60次了if(m==60) //如果到了60次,说明1小时到了{m=0; //把m清零,重新再计60次h++; //h每加一次判断一次是否到24次了if(h==24)//如果h到了24次,说明24小时到了{h=0; //把m清零,重新再计60次}}}}}。

单片机数字钟工作原理

单片机数字钟工作原理

单片机数字钟工作原理
单片机数字钟是一种通过单片机控制数字时钟的设备。

单片机是一种高度集成的电子芯片,具有非常强大的计算和控制能力。

在数字钟中,单片机负责控制时间数码管的显示和计时功能。

具体来说,单片机数字钟的工作原理如下:
1. 时钟电路:单片机数字钟中使用的时钟电路通常是晶体振荡器。

晶体振荡器会产生非常稳定的频率,用于单片机的计时和控制。

2. 计时功能:单片机通过时钟电路来计时。

当单片机启动时,它会从时钟电路中读取当前的时间,然后根据程序中设定的规则不停地更新时间。

单片机数字钟通常会具有秒、分、时等多个计时功能,可以显示当前的精确时间。

3. 显示功能:单片机数字钟通过数码管来显示时间。

数码管是一种常见的显示器件,可以显示数字、字母等信息。

单片机通过控制数码管的亮灭来显示当前时间。

4. 控制功能:单片机数字钟还具有控制功能。

例如,可以通过按钮来调整时间、闹钟等功能。

单片机还可以控制数码管的亮度、闪烁等效果,以及声光报警等功能。

综上所述,单片机数字钟是一种功能强大、精确可靠的电子设备,广泛应用于家庭、办公室、实验室等场合。

- 1 -。

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

;///////////////////////////////////////////;本程序源代码由湖南工程职业技术学院提供.;专业单片机培训,让你学习单片机更容易.;程序员:蒋庆桥;QQ:xxxxxxxxx;本程序用汇编实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历,H_ADJ BIT P3.0 ;时/年调整M_ADJ BIT P3.1 ;分/月调整S_ADJ BIT P1.4 ;秒/日调整DT_SET BIT P1.6 ;时间/日期选择STR BIT P1.5;启动走时T_RST BIT P1.0 ;实时时钟复位线引脚T_CLK BIT P1.1 ;实时时钟时钟线引脚T_IO BIT P1.2 ;实时时钟数据线引脚HH_BIT EQU 40H ;时高位HL_BIT EQU 41H ;时低位MH_BIT EQU 42H ;分高位ML_BIT EQU 43H ;分低位SH_BIT EQU 44H ;秒高位SL_BIT EQU 45H ;秒低位TEMPER_L EQU 46HTEMPER_H EQU 47HYH_BIT EQU 48H ;年高位YL_BIT EQU 49H ;年低位MOH_BIT EQU 4aH ;月高位MOL_BIT EQU 4bH ;月低位DH_BIT EQU 4cH ;日高位DL_BIT EQU 4dH ;日低位SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPER equ 37hFLAG1 BIT 20h.0 ;DS18B20存在标志位DQ BIT P1.3A_BIT EQU 55HB_BIT EQU 56HDS1302_ADDR EQU 5EHDS1302_DATA EQU 5FHORG 00HLJMP STARTSTART:MOV SP,#60HMOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0HMOV R0,#10SETB EASETB ET0SETB TR0MOV R1,37HMOV YEAR,#13H ;上电预置日期、时间MOV WEEK,#03H ;周1 MONMOV MONTH,#07H ;2011 04 25 12:00:00MOV DAY,#05HMOV HOUR,#23HMOV MIN,#00HMOV SEC,#00HMOV 50H,#0/////////////////////////////////////////////////////////////////////// ////MAIN:LCALL KEY//MAIN2:CALL FENLILCALL INIT_18B20LCALL GET_TEMPERcall CHANGEcall dispcall displayAJMP MAINFENLI:MOV A,YEARMOV B,#10HDIV ABMOV YL_BIT,BMOV YH_BIT,AMOV A,MONTHMOV B,#10HDIV ABMOV MOL_BIT,BMOV MOH_BIT,AMOV A,DAYMOV B,#10HDIV ABMOV DL_BIT,BMOV DH_BIT,AMOV A,HOURMOV B,#10HDIV ABMOV HL_BIT,BMOV HH_BIT,AMOV A,MINMOV B,#10HDIV ABMOV ML_BIT,BMOV MH_BIT,AMOV A,SECMOV B,#10HDIV ABMOV SL_BIT,BMOV SH_BIT,ARETKEY: ;按键子程序JB F0,MAIN10 ;F0=1,开始走时。

单片机控制秒表显示时间为00—99(每秒自动加1),暂停,复位

单片机控制秒表显示时间为00—99(每秒自动加1),暂停,复位

标准文档9创新实践实训报告学院信息电子技术学院专业电子信息工程班级14学籍号姓名指导教师蒋野2017年06月29日单片机控制秒表电路一、电路工作原理1.工作原理用STC89C52设计一个2位的LED数码显示作为“秒表”:显示时间为00—99秒,每秒自动加1,另设计一个“暂停”键S2和一个“继续”键S3。

为使本设计系统更加完善,可以引入一个“复位”键S1,以方便对系统的控制。

如图。

本系统采用STC89C51单片机为中心器件,利用其定时器/计数器定时计数的原理,结合硬件电路如电源电路,晶振电路,复位电路和显示电路,以及一些按键电路等来设计计数器,将软硬件有机结合起来,其中软件系统采用汇编语言编写程序,包括显示程序,计数程序,中断,硬件系统利用Protues强大的功能来实现,简单易于观察,在仿真中就可以观察到实际的工作状态。

2.元器件作用(1)STC89C52单片机在电子行业中有着广泛的应用。

AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,STC89C52可以按照常规方法进行编程,也可以在线编程。

其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。

(2)时钟电路作用是为电路提供唯一的时钟信号。

(3)复位电路外接一个开关,控制电路复位,接通电源电路直接复位,如果没有开关亦可将复位电路引出导线接电源后断开。

(4)本设计要求使用共阳极的数码管,如下是共阳极的数码管的0-9编码:0xc0,0x92,0x82,0xf8,0x80,0x90,0xf9,0xa4,0xb0,0x99.(5)控制电路:S2按下电路停止计时,S3按下电路恢复计时。

二、程序流程图主程序流程图三、检测安装与调试1.元件检测共阳极数码管检测管脚序号利用万用表二极管档红表笔接一个抵住两个管脚,利用另一个接触其他,找出1,2两个管脚,继续分别找出A,D,C,D,E,F,G,Dp管脚。

51单片机4位数码管秒表代码

51单片机4位数码管秒表代码

主题:51单片机4位数码管秒表代码内容:1. 介绍51单片机51单片机是一种通用的单片机系列,广泛应用于各种电子设备中。

它具有稳定性好、成本低、易于编程等优点,因此备受电子爱好者和专业工程师的青睐。

2. 4位数码管秒表4位数码管秒表是一种常见的电子计时器,通过LED数码管显示出当前的时间,可以用于各种计时应用,比如比赛计时、实验计时等。

3. 代码编写以下是一段简单的51单片机4位数码管秒表代码:```c#include <reg52.h>#include <intrins.h>// 数码管位选端口sbit wei1 = P2^2;sbit wei2 = P2^3;sbit wei3 = P2^4;sbit wei4 = P2^5;// 数码管显示段选端口sbit se2 = P0^2;sbit se1 = P0^3;sbit se4 = P0^4;sbit se3 = P0^5;unsigned char code smgduan[17] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; // 显示0~9,A,b,C,d,E,F,无的值void delay(unsigned int i) { // 延时while(i--);}void display(unsigned char *tab) { // 数码管显示 unsigned char i;for(i=0; i<7; i++) {P0=0; // 清除段选,以选中所显示的数码管 switch(i) { //确定位选case(0):wei1=0;wei2=wei3=wei4=1;break;case(1):wei2=0;wei1=wei3=wei4=1;break;case(2):wei3=0;wei1=wei2=wei4=1;break;case(3):wei4=0;wei1=wei2=wei3=1;break;default:break;}P0=tab[i]; //段码输出delay(5); // 数码管微秒级延迟}}void m本人n() {unsigned char a=0,b=0,c=0,d=0; //时钟的4位数据 unsigned int i=0;wei1=wei2=wei3=wei4=1; //段选、位选初始化while(1) {a++; // 微秒级的计数if(a==100) { //达到100a=0; b++; //b加1if(b==60) { //当b=60时b=0; c++; //c加1if(c==60) { //当c=60时c=0; d++; //d加1if(d==24) { //当d=24时d=0; //归零}}}}display(smgduan+d10); //显示个秒wei1=1;wei2=wei3=wei4=0; //位选delay(500); //延时display(smgduan+c/10+10); //显示十秒wei2=1;wei1=wei3=wei4=0; //位选delay(500); //延时display(smgduan+b10); //显示个分wei3=1;wei1=wei2=wei4=0; //位选delay(500); //延时display(smgduan+b/10+10); //显示十分wei4=1;wei1=wei2=wei3=0; //位选delay(500); //延时if(i++==200) { //当i=200时i=0;}}}```4. 代码分析该代码通过对51单片机的引脚进行控制,实现了4位数码管秒表的计时功能。

单片机6个数码管上显示时分秒

单片机6个数码管上显示时分秒

//6个数码管上依次显示时、分、秒,//按下S2一次,停止计时,按下S2两次,开始计时;//停止计时后,按下S3一次,小时数加1;//停止计时后,按下S4一次,分钟数加1;//停止计时后,按下S5一次,秒数加1#include<reg52.h>//头文件#define uint unsigned int#define uchar unsigned char //宏定义sbit wela=P2^7;sbit dula=P2^6;//数码管锁存位声明sbit s2=P3^4;sbit s3=P3^5;sbit s4=P3^6;sbit s5=P3^7;//独立按键位声明uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9段码uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位码uint num=0,num1,num2;//全局变量uchar shi,fen,miao;void delay(uint);void display(uchar,uchar);void keyscan();void main(){TMOD=0x01;TH0=(65536-50000)/256;//赋初值TL0=(65536-50000)%256;EA=1;//中断使能ET0=1;TR0=1;while(1){shi=num/3600;fen=num%3600/60;miao=num%60;if(shi==13)num=num%3600;if(fen==60)num=num/3600*3600+num%60;if(miao==60)num=num/60*60;keyscan();//按键if(num2==0){display(shi,0);//显示display(fen,2);display(miao,4);}else{switch(num2){case 1:display(shi,0);display(fen,2);display(miao,4);break;case 2:display(shi,0);break;case 3:display(fen,2);break;case 4:display(miao,4);break;}}}}void delay(uint x){uint i,j;//局部变量for(i=0;i<x;i++)for(j=0;j<110;j++);//延时子函数}void display(uchar disnum,uchar weinum){uchar sh,ge;sh=disnum/10;ge=disnum%10;P0=0xff;wela=1;wela=0;P0=table[sh];dula=1;dula=0;P0=table1[weinum];wela=1;wela=0;delay(2);//十位显示P0=0xff;wela=1;wela=0;P0=table[ge];dula=1;dula=0;P0=table1[weinum+1];wela=1;wela=0;delay(2);//个位显示*/}void keyscan(){if(s2==0){delay(15);//消抖if(s2==0){TR0=0;num2++;while(!s2);//松手检测if(num2==5){num2=0;TR0=1;}}}if(num2!=0){if(s3==0){delay(5);if(s3==0){while(!s3);num=num+3600;}}if(s4==0){delay(5);if(s4==0){num=num+60;while(!s4);}}if(s5==0){delay(5);if(s5==0){num++;while(!s5);}}}}void time0() interrupt 1{TH0=(65536-50000)/256;//赋初值TL0=(65536-50000)%256;num1++;if(num1==20){num1=0;num++;//if(num==43200)//num=0;}}。

8位数码管显示电子时钟c51单片机程序

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]填充相应的代码。

单片机控制秒表显示时间为00—99(每秒自动加1),暂停,复位

单片机控制秒表显示时间为00—99(每秒自动加1),暂停,复位

9创新实践实训报告学院信息电子技术学院专业电子信息工程班级14学籍号姓名指导教师蒋野2017年06月29日单片机控制秒表电路一、电路工作原理1.工作原理用STC89C52设计一个2位的LED数码显示作为“秒表”:显示时间为00—99秒,每秒自动加1,另设计一个“暂停”键S2和一个“继续”键S3。

为使本设计系统更加完善,可以引入一个“复位”键S1,以方便对系统的控制。

如图。

本系统采用STC89C51单片机为中心器件,利用其定时器/计数器定时计数的原理,结合硬件电路如电源电路,晶振电路,复位电路和显示电路,以及一些按键电路等来设计计数器,将软硬件有机结合起来,其中软件系统采用汇编语言编写程序,包括显示程序,计数程序,中断,硬件系统利用Protues强大的功能来实现,简单易于观察,在仿真中就可以观察到实际的工作状态。

2.元器件作用(1)STC89C52单片机在电子行业中有着广泛的应用。

AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,STC89C52可以按照常规方法进行编程,也可以在线编程。

其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。

(2)时钟电路作用是为电路提供唯一的时钟信号。

(3)复位电路外接一个开关,控制电路复位,接通电源电路直接复位,如果没有开关亦可将复位电路引出导线接电源后断开。

(4)本设计要求使用共阳极的数码管,如下是共阳极的数码管的0-9编码:0xc0,0x92,0x82,0xf8,0x80,0x90,0xf9,0xa4,0xb0,0x99.(5)控制电路:S2按下电路停止计时,S3按下电路恢复计时。

二、程序流程图主程序流程图三、检测安装与调试1.元件检测序号名称型号(标称值)测量值误差备注1 电阻1K 780 22%2 电阻10K 10.78 0.07%3 电容33pF 32 3%4 电容10uF 9 10%5 晶振12M 12M 0共阳极数码管检测管脚序号利用万用表二极管档红表笔接一个抵住两个管脚,利用另一个接触其他,找出1,2两个管脚,继续分别找出A,D,C,D,E,F,G,Dp管脚。

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序
一、程序概述
本程序使用单片机AT89S52,通过数码管(8位)显示当前时间,支持12小时制和24小时制切换,精度为秒。

二、程序实现
程序首先定义了数码管的连接方式和每个数字的位图数据,然后定义了时间变量和函数,包括:
1.初始化函数:设置数码管端口和时钟计数器的计数方式。

2.读时钟函数:读取时钟计数器及寄存器,返回当前时间的小时、分钟和秒数。

3.显示函数:将当前时间转化为8个数码管显示的位图数据,用数字和符号映射表将数字和符号的位图数据与数码管连接方式对应起来,输出到数码管上。

在主函数中,程序初始化后循环执行读时钟函数和显示函数,实现时钟的实时显示。

三、程序特点
1.采用8位数码管显示,时间更加直观。

2.支持12小时制和24小时制切换,适用于不同场景。

3.实现精度为秒的实时显示,更加准确。

四、程序优化
1.增加闹钟功能,提醒用户打卡或者起床。

2.加入温度传感器模块,实现显示温度的功能。

3.优化显示效果,增加字体和颜色等选项。

五、程序应用
本程序可应用于家庭、办公室、学校等场合,用于显示时间,提醒用户合理安排时间和时间管理,也可作为DIY电子制作的教学和实验材料,提高学生的动手实践能力和电子信息技术水平。

单片机控制8位数码管显示秒表课程设计

单片机控制8位数码管显示秒表课程设计

长沙学院《单片机原理及应用》课程设计说明书题目 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秒的计时。

单片机控制秒表显示时间为00—99(每秒自动加1),暂停,复位

单片机控制秒表显示时间为00—99(每秒自动加1),暂停,复位
(3)二次接通电源,电路依然不工作。
(4)复查电路:重新检测电路,利用万用表电流档,检测电路电流,发现电路无电流,检查40引脚VCC,发现单片机40引脚与插座短路,接触不良导致,陆续检查其他引脚。发现还有部分引脚短路。
(5)继续检查电路,直至数码管显示数字为止。
结果显示,秒表运行正常。按照预期实现了99s计时、暂停以及继续的功能。
附件
1.利用单片机完成一定的任务,你的创意(创新)是什么?
我的创意就是电路的布局,实验操作起来与仿真不同,需要注意很多细节,例如原件检测。我的电路布局既节省空间,又不影响电路结构。
2.程序
#include<reg52.h>
sbit W=P1^4;
sbit H=P1^6;
unsigned char msec,sec;
void delay(unsigned char i)
{
unsigned int j,k;
for(k=0;k<i;k++)
for(j=0;j<255;j++);
}
void To_INT(void) interrupt 1
2.元器件作用
(1)STC89C52单片机在电子行业中有着广泛的应用。AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,STC89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。
9
创新实践实训报告
学院
信息电子技术学院
专业
电子信息工程

数码管时分秒动态显示

数码管时分秒动态显示

数码管时分秒动态显示1、目的:数码管显示时、分、秒,实现计时功能。

2、原理:定时器产生中断,一秒钟计数一次,计数值转换成时、分、秒后,数码管动态显示。

3、原理图4、函数思路。

单片机工作频率是12MHZ,定时器12分频后累加计数,也就是1us计数一次。

定时一秒,定时器装入初值50000,则需进入中断20次,才能实现(50000*20=100000=1s)!数码管动态显示,要求控制显示延时时间和消隐。

累计计数转换成时、分、秒,转换思路是计数分割。

一分等于60,秒,一小时等于60分。

计数累加,计数一次,秒加1,;计数60次,分加1,;计数3600次,时加1.计数86400次,24小时满,而后计数清零。

5、程序#include<reg52.H>#include<intrins.H> // 加载头文件#define uchar unsigned char // 宏定义无符号字符型#define uint unsigned long int // 宏定义无符号长整型uint num ; // 定义num和cunt为全局变量,全局更改有效uchar cunt ;uchar tab1[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 数码管段选编码高电平有效uchar code tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //数码管位选编码,低电平有效void display(uint num ); // 显示函数函数声明void delay (); // 延时函数声明void init () // 中断初始化{TMOD=0x01; // 设置定时器T0为16位定时模式TH0=(65535-50000)/256; // T0装入初值50000TL0=(65535-50000)%256; // / 取整,%取余。

基于单片机的电子时钟6位LED数码管显示

基于单片机的电子时钟6位LED数码管显示

数码管显示电子时钟设计一.功能要求1.数字电子时钟最主要是LED数码管显示功能,以24小时为一个周期,显示时间时、分、秒。

2.具有校时功能,可以对时、进行单独校对,使其校正到标准时间。

二.方案论证1.数字时钟方案数字时钟是本设计的最主要的部分。

根据需要,可利用两种方案实现。

方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。

该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。

为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。

当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。

而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

方案二:本方案完全用软件实现数字时钟。

原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。

利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。

该方案具有硬件电路简单的特点。

但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。

而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。

基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。

2.数码管显示方案方案一:静态显示。

所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。

该方式每一位都需要一个8 位输出口控制。

静态显示时较小的电流能获得较高的亮度,且字符不闪烁。

但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。

方案二:动态显示。

所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。

单片机数码管秒表程序

单片机数码管秒表程序

单片机数码管秒表程序
数码管秒表是一种常见的计时工具,它利用单片机控制数码管的显示来实现计时功能。

下面我将为大家介绍一种基于单片机的数码管秒表程序。

程序的实现思路如下:首先,我们需要使用单片机的定时器来实现时间的计数。

通过设置定时器的计数周期和中断处理函数,我们可以在每个固定的时间间隔内进行一次计数。

然后,我们需要将计数的结果通过数码管进行显示。

为了方便显示,我们可以将计数结果分为小时、分钟和秒三个部分,分别显示在数码管的不同位上。

程序的具体实现步骤如下:
1. 初始化单片机的定时器,并设置计数周期为1秒。

2. 设置一个全局变量来保存计数的结果,初始值为0。

3. 在定时器的中断处理函数中,每次中断时将计数结果加1。

4. 在主函数中,设置一个循环来不断检测计数结果的变化,并将其转换为时、分、秒的形式。

5. 将转换后的时、分、秒分别显示在数码管的不同位上,通过控制数码管的引脚来实现。

通过以上步骤,我们就可以实现一个简单的数码管秒表程序。

当程序运行时,数码管会不断地显示计时结果,从0开始递增,以秒为单位。

当需要停止计时时,可以通过外部按键等方式来暂停或重置计数结果。

这种数码管秒表程序可以广泛应用于各种计时场景,比如运动比赛、实验计时等。

它的实现简单、成本低廉,并且可以精确地显示时间,非常实用。

希望通过以上介绍,大家对基于单片机的数码管秒表程序有了更深入的了解。

希望这个简单的程序能够帮助大家更好地实现计时功能,提高工作和学习的效率。

谢谢大家!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

unsigned char count=0;//计数器中断次数
unsigned char hour=16;//小时
unsigned char minute=58;//分钟
unsigned char second=40;//秒
void yanshi() //延时函数
{
unsigned int x,y;
yanshi(); //延时
p25=0; //开通位6
yanshi(); //延时
P2=0XF0; //关闭所有位
} ห้องสมุดไป่ตู้
void timer() interrupt 1 //定时器T0中断服务程序
{
TH0=0X3C; //高八位重装初值
TL0=0XB0; //低八位重装初值,定时50ms
for(x=0;x<10;x++)
for(y=0;y<20;y++) ;
}
void smgxs(void) //数码管显示函数
{ p20=1; //开通位1
P0=shumaguan[hour/10]; //赋值,小时十位
yanshi(); //延时
p20=0; //关闭位1
}
}
}
}
void main() /*主函数*/
{
TMOD=0X01;//模式选择:定时器T0,方式1
TH0=0X3C; //高八位赋初值
TL0=0XB0; //低八位赋初值,定时50ms
TR0=1;//启动定时器T0
#include<reg51.h>
//unsigned char code liushideng[]=(0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f); /*led灯共阳型 */
unsigned char shumaguan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; /*共阳型数码管 */
unsigned char i=0;
sbit p20=P2^0; //数码管位控制端
sbit p21=P2^1; //数码管位控制端
sbit p22=P2^2; //数码管位控制端
sbit p23=P2^3; //数码管位控制端
sbit p24=P2^4; //数码管位控制端
sbit p25=P2^5; //数码管位控制端
yanshi(); //延时
p22=0; //开通位3
p23=1; //开通位4
P0=shumaguan[minute%10]&0x7f; //赋值,分钟个位,同时点亮小数点
yanshi(); //延时
p23=0; //关闭位4
ET0=1; //开定时器中断
EA=1; //开总中断
while(1) //防止程序跑飞
{
smgxs(); //数码管显示
}
}
p24=1; //开通位5
P0=shumaguan[second/10]; //赋值,秒十位
yanshi(); //延时
p24=0; //关闭位5
p25=1; //开通位6
P0=shumaguan[second%10]; //赋值,秒各位
count++; //中断次数自增1
if(count==20) //1秒判断
{
count=0; //中断次数清零
second++; //秒自增1
if(second==60) //1分钟判断
{
second=0; //秒清零
minute++; //分钟自增1
if(minute==60) //1小时判断
{
minute=0; //分钟清零
hour++;//小时自增1
if(hour==23) //1小时判断
{
hour=0;//小时清零
}
p21=1; //开通位2
P0=shumaguan[hour%10]&0x7f; //赋值,小时各位,同时点亮小数点
yanshi(); //延时
p21=0; //关闭位2
p22=1; //开通位3
P0=shumaguan[minute/10]; //赋值,分钟十位
相关文档
最新文档