文档库 最新最全的文档下载
当前位置:文档库 › 51单片机数码管电子时钟C程序

51单片机数码管电子时钟C程序

//**单片机stc89c52, 8位共阴数码管12M晶振

//*******P0 位选,P2 段选❖******//

#include 〃reg52・ h〃

#define uchar unsigned char

#define uint unsigned int

uchar 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. 5ms

uint i;

uint j;

for (i=0;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;//月H

day萨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二Oxff

dula=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二Oxff

dula二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二Oxff

dula=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二Oxff

dula二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

^

+

、、

d

x

o

u

o

c

r

(DAP^PQZXOUOmxouzd

o

u d n p 二 SAPP 〕qpfzd 二%

-np 、、—

、、、

、QJXOUOd

J

I

) 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 o

u

o

c

r

(DAP^PQZXOUOmxouzd

o

u

d

n

p

SAPP

qpfzd

%-np 、、—、、、、QJXOUOd J I ) A32P

cu 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二Oxff

dula=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)

{

基于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所示:

51单片机多功能智能电子钟程序代码

/* * 演示数码管的动态扫描显示,用dpj8.dll仿真模块。* P0口接段,低电平亮,高电平灭。 * P2口接位,低电平亮,高电平灭。 */ #include "regx52.h" #define uint8 unsigned char code uint8 LED[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e}; unsigned char riqi[8]; static uint8 keyReleas; uint8 disptmp; uint8 pos; uint8 buffer[8]; code uint8 BIT[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; uint8 flag2ms; // uint8 t2msCnt; // uint8 halfSecCnt; // uint8 IsTimerRun; // 控制时钟是否运转 uint8 mode; // date or clock unsigned char KeyScan(); void GlobalvarInit(); void T0Init(); void TimeRun(); unsigned char KeyScan(); void Command(); void T0IntSvr() interrupt 1 using 1 { // 1, 4ms定时初值 TL0 = (65536-2000)%256; TH0 = (65536-2000)/256; switch(mode) { case 0: disptmp=LED[buffer[pos]];

51单片机带字库液晶12864ds1302数字时钟c源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C 源程序(无按键修改功 能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了 这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52 +带字库液晶 12864(ST7920)+DS1302实时时钟) 实现功能: 简单,数字时钟 +日期(以后会不断完美)。 C 语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端 口设置 */ sbit SCK=P3A 6; sbit SDA=P3A4; sbit RST = P3A5; bit ReadRTC_Flag; /* 12864 端口定义 */ #define LCD_data P0 sbit LCD_RS = P2A4; sbit LCD_RW = P2A5; sbit LCD_EN = P2A 6; //液晶使能控制 sbit PSB 二卩2八1; //并口控制 //DS1302 时钟 //DS1302 IO // DS1302 复位 //读DS1302全局变量 //带字库液晶 12864数据口 // 寄存器选择输入 // 液晶读/写控制

sbit RES=P2A3; uchar code dis1[] = {"电子设计天地"};// 液晶显示的汉字uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'};unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};〃秒分时日月周年09-10-19 16:07:00 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位 code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address ); void Read_RTC(void);//read RTC void Set_RTC(void); //set RTC void InitTIMER0(void);//inital timer0 /***************************************************************** **//*

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

广东石油化工学院 《51单片机原理与实践》课程设计报告 学院计算机与电子信息学院 专业 班级 学号 姓名 指导教师 课程成绩 完成日期 2010年12月27日

数码管时钟电路的设计 一、设计目的: 通过这次课程设计掌握单片机系统的基本设计步骤及设计思路,掌握汇编语言的用法及各种指令的含义,比较熟练的运用指令进行单片机系统的设计的,熟悉用KEIL软件进行汇编语言的汇编,以及把代码写入实验板中,观测代码结合实际的运行结果后进行调整,体会到编程的分析问题、确定算法、画程序流程图、编写程序、程序功能模块化的优点的各各步骤。 二、设计要求: LED数码管时钟电路采用24h计时方式,时、分、秒用六位数码管显示。该电路采用AT89C2051单片机,使用3V电池供电,只使用一个按键开关即可进入调时、省电(不显示LED数码管)和正常显示三种状态。 三、设计实验内容: 1. 硬件的设计 其采用AT89C51单片机应用设计,LED显示采用动态扫描方式实现,P0口输出段码数据,P2口输出位码数据,P1.1、P1.2接按钮开关。为了提供LED数码管的驱动电流,采用6MHz晶振。 2. 系统总体分析 系统主要包含四大模块:显示模块、时间计时模块、模式切换模块和模式设置模块。

●显示模块:主要由主循环负责。内存中开辟了一段8字节的内存空间, 用作数据显示的字符缓冲区。主循环不断将缓冲区中的字符呈现至数码管。 ●时间计时模块:电子钟的核心模块,记录了时间的时、分、秒信息。 ●模式切换模块(MODE):切换电子钟的设置模式,包括时设置、分设置、 秒设置、闹铃开关设置、闹铃时设置和闹铃分设置。相关数据被设置时将闪烁显示。 ●模式设置模块(CONFIG):通过判断设置模式(MODE),执行相应的设置。 如时、分、秒的增1以及闹铃开关的变换。 另外,主循环还负责扫描键盘,检测相应键是否被按下,若MODE键被按下则在特定单元中登记该功能,并启动定时器1,然后返回继续执行显示功能。在定时器1中断时,被登记的功能正式执行。期间用时约10ms,用以消除机械抖动。 主循环流程图大致如下: 图(一)主循环流程图 定时器1中断服务程序流程图如下:

C51单片机实现电子闹钟

课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电子闹 钟功能的设计 学院:电子与信息工程学院 专业:通信工程 小组成员:

电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭 个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。 一.电子闹钟简介 我们设计的电子闹钟是以MCS51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。 简易闹钟具有以下功能: 1.时钟能准确地走时,并可以通过数码管进行显示 2.复位后可以进行当前时间的设置 3.可以随意设置闹钟时间,闹钟会在设置时间响铃 整个系统的任务要求: 1)输入数字按键的功能。 保证数字的输入。 2)复位电路的功能。 所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间); 3)显示电路的功能。 当输入数字时显示24小时时间功能。 4)闹铃功能 设置闹铃的时间后.能按设置好的时间准时闹铃。 二.系统方案的设计要求 根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用 AT89C51为内核显示设计方案。 先进行系统的整体规划确定整个系统的功能,然后按照每个功能的具体要求,进行各个模块的实物设计并逐个调试,待全部通过后,进行整个系统 的联调,最终实现一个完整的系统。 整个系统的设计步骤如下: 在单片机最小系统的基础上,完成按键电路和复位电路的设计。 完成显示电路、数字按键、单片机时钟电路。

单片机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。

51单片机数码管电子时钟C程序

//**单片机stc89c52, 8位共阴数码管12M晶振 //*******P0 位选,P2 段选❖******// #include 〃reg52・ h〃 #define uchar unsigned char #define uint unsigned int uchar 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. 5ms uint i; uint j; for (i=0;i

51-数字时钟-89C52-单片机C语言程序

数字时钟89C52 单片机C语言程序 STC89C52| /************** 【数字时钟】****************/ /****【功能】1、时间显示2、秒表3、闹钟4、日期显示都可以设置****/ #include /*包含器件配置文件*/ #define uchar unsigned char /*宏定义字符型数据整型数据*/ #define uint unsigned int uchar code H[] = {0x0f, 0x07, 0x0b, 0x0d, 0x0e}; /*按键【P3】端口断码用于按键*/ char Code[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; /*显示【0 1 2 3 4 5 6 7 8 9】数字的数码管的段码*/ uchar code C[] = {0x0, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; /*列扫描控制LED1位2位3位4位5位6位7位8位*/ uchar MON[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; uchar A; uchar BIN=0; /* 【BIN】作为倒计时开始的标志*/ uchar hour = 0; /* 定义[时][分][秒] */ uchar min = 0; uchar sec = 0; uint shi=12; uint fen=30; uchar Mmin=0; uchar Msec=30; uchar M0=0; uchar m=0; uchar year=9; uchar month=7; uchar month2; uchar day=19; uchar set1 = 1; /* set1=1 是调节时分秒set1=2时时调节年月日set=3时事调节闹钟*/ uchar set2 = 1; /* set2=1时是调节【时】位set2=2时事调节【分】位*/ uint x = 0; /* x 每【0.01s】自加一*/ void Delay(uint k);

51单片机数字时钟的实现程序

数字时钟的显示(不可设置) #include #include #include unsigned char code table[11]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09,0xff}; //这里的数组放的是0-9的显示编码和全灭的编码 int flag=0;m=0;n=0;k=0;dpt=0;s=0; intdpbuf[4]={0,0,0,0}; sbit dp0=P2^4; //分别控制4个数码管的开和关 sbit dp1=P2^5; sbit dp2=P2^6; sbit dp3=P2^7; void display(); void display() { TH0=0xee; //5mS TL0=0x00; if(dpt<3) dpt++; else dpt=0; //动态显示计数器 P0 = table[dpbuf[dpt]]; switch(dpt) { case 0: dp1 = dp2 = dp3 = 1; dp0=0; break; case 1: dp0 = dp2 = dp3 = 1; dp1=0; break; case 2: dp0 = dp1 = dp3= 1; dp2=0; break; case 3: dp0 = dp1 = dp2 = 1; dp3=0; } } void Timer0() interrupt 1 //通过中断来循环扫描,实现动态显示{ TH0=0xee; //5ms TL0=0; if(k>200) { k=0; s++; } if(flag==0) { k++;

51单片机时钟程序设计

51单片机时钟程序设计 51单片机时钟程序设计是基于51单片机的一种程序,用于控制和显示时间的各个参数,如小时、分钟、秒等。在计时、计数、算术运算、控制输出、中断处理等领域都起到 重要的作用。本文将简单介绍51单片机时钟程序设计的基本框架和其实现方法。 1. 硬件准备 在进行51单片机时钟程序设计之前,需要先准备好相关的硬件,包括51单片机芯片、晶振、LCD液晶显示屏等。其中晶振是时钟源,用来产生稳定的时钟信号,LCD液晶显示屏则用于显示时钟相关信息。 2. 时钟程序的设计框架 (1)初始化程序:此步骤的主要作用是设置相关的寄存器和标志位,为后续程序的正常运行做好准备。 (2)计时程序:此步骤的主要作用是对秒、分、时等时间参数进行计数,并将结果存储到相应的寄存器里。 (3)中断程序:此步骤的主要作用是设置中断触发条件和相应的处理程序,用来处理一些紧急事件。 (4)显示程序:此步骤的主要作用是将计时程序的结果以数字形式显示到LCD液晶显示屏上,同时可以进行一些特殊字符的显示。 (5)调试程序:此步骤的主要作用是用于调试程序代码,检测是否存在问题,比如程序写错了等等。 3. 时钟程序的实现方法 (1)初始化程序 初始化程序是开发52单片机时钟程序的第一步,可以根据实际需求进行相应的设置。在本程序中,初始化程序需要进行以下设置: a. 定义输入输出端口; b. 配置定时器; c. 设置中断源; d. 初始化LCD液晶显示屏等相关参数;

(2)计时程序 计时程序是时钟程序的核心,其主要作用是计算并更新当前的时间参数。在本程序中,计时程序需要进行以下操作: a. 设置定时器的时钟源和计数频率; b. 定义中断触发条件; c. 设置中断处理程序并对时间参数进行计数,并存储到相应的寄存器里; d. 根据时间参数更新液晶显示屏的显示内容。 (3)中断程序 中断程序主要用于响应一些紧急事件,比如硬件异常、按键输入等。在52单片机时钟程序中,中断程序需要以下操作: a. 定义中断触发条件; b. 检测中断源; c. 判断中断类型,并调用相应的处理程序; d. 清除中断标志位。 (4)显示程序 a. 清空LCD液晶显示屏; b. 将时间参数转换为数字格式,并存储到相应的缓存区里; c. 将数字格式的时间参数显示到液晶显示屏上。 (5)调试程序 调试程序主要用于程序的调试和测试,通过将程序的输出结果与预期结果进行比较, 确定程序是否正确。在52单片机时钟程序中,调试程序需要进行以下操作: a. 输出调试信息到串口; b. 将时间参数输出到LED指示灯; c. 使用示波器检测程序的运行状态。 4. 总结

【单片机】c51数字时钟(带年月日显示)

【单片机】c51数字时钟(带年月日显示)显示当前时间:9点58分34秒(第一个零表示闹钟未开启)

当前日期:10年4月六日 摘要:本设计以单片机为核心,LED数码管动态扫描显示。采用矩阵式键盘输入能任意修改当前时间日期和设定闹钟时间。具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能 说明 系统的功能选择由7个按键完成。 其中P3.0,P3.1分别对应调整当前时间的时和分, P3.2为外部中断0,控制闹钟功能的开启/关闭(开启时数码管第一位显示字母’c’)

P3.3用作外部中断1,当前时间的显示与闹铃时间显示切换,闹钟显示时按 P3.0,P3.1可进行闹钟时分的设定,此时,led1灯灭。闹铃时间到切闹钟开关开启时,闹铃响一分钟。 P3.5\P3.6\P3.7对年月日进行调整(第一次按P3.5,就进入了年月日的显示,现在就可对日期进行调整)。按P3.1回到当前时间的显示状态。 整点到时:报警对应小时的次数。 程序如下: #include #include #include #define uchar unsigned char #define uint unsigned int uchar data keyvalue; //查到的键值 uchar data keys; //转换出的数字 uchar dis[8]; uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x 39,0xf7}; // 0 1 2 3 4 5 6 7 8 9 - 灭灯 c n sbit 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; //闹钟、小时寄存单元

基于C51的电子钟设计

基于AT89C51单片机的电子钟设计 1 系统电路设计 1.1 系统总体设计思路 此设计原理框图如下所示,电路包括四个局部:单片机,键盘,锁存及显示电路,掉电保护电路。 图1.1 单片机实现数码管显示电子钟总框图 对于各局部: (1)单片机发送的信号经过锁存电路最终在数码管上显示出来。 (2)单片机通过输出各种电脉冲信号来驱动控制各局部正常工作。 (3)掉电保护电路保证系统掉电时时钟不会停顿。 (4)为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正数码管上显示的时间。 1.2 工作原理 设计的电路主要由四大模块构成:掉电保护电路,单片机控制电路,显示电路以及校正电路。 本设计采用C语言程序设计,使单片机控制数码管显示年、月、日、时、分、秒,当秒计数计满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0〞规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进展校正。时计数器计满24小时后自动向日计数器进一,日计数器需判断平年、闰年和大月、小月,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位。设计采用的是年、月、日、时、分、秒显示,单片机对数据进展处理同时在数码管上显示。 2 单元电路设计 2.1 单片机电路设计 本设计采用AT89C52单片机进展设计,它是一种低功耗,高性能的CMOS8位微处理器,内部有8K字节的程序存储器和256字节的数据存储单元,32个I/O 端口,3个16位定时/计数器,8个中断源。 时钟电路是单片机系统的心脏,它控制着单片机的工作节奏。本设计采用内部时钟方式,12MHz的石英晶体振荡器。电路图如下

手把手教学51单片机 - 第四节 动态数码管,用6位数码管做一个时钟

手把手教学51单片机| 第四节动态数码管,用6位数码管做一个时钟 1.利用定时器做一个流水灯的程序//流水灯从上到下一次点亮,然后让全部灯闪烁两次,依次循环#include #define uchar unsigned char #define uint unsigned int uchar temp,a; void Time0_delay(); void main() { temp=0xfe; P1=temp; while(1) { Time0_delay(); temp=_crol_(temp,1); P1=temp; if(temp==0x7f) { for(a=0;a #define uchar unsigned char #define uint unsigned int uint n; uint sec, min, hour; sbit dula=P2^6; sbit wela=P2^7; uchar code table_dula[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; uint time[6]={0,0,0,0,0,0}; void reset()//初始化函数{ sec=0;//自定义时间min=0; hour=0; TMOD=0x01; EA=1; ET0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; } void delay(uint z) { uchar x,y; for(x=z;x>0;x--) for(y=50;y>0;y--); } void main() { reset(); while(1) { //h 十位

基于C51单片机的多功能电子时钟设计(完美实现版)

作业名: 单片机课程设计报告——电子时钟****: *** 学生姓名: lycaner 班级: 北京交通大学电子信息工程学院自动化 学号: XXXXXXXX

电子时钟实验报告 一,实验目的 1. 学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。 2. 设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟 二,实验要求 A.基本要求: 1. 在4位数码管上显示当前时间。显示格式“时时分分” 2. 由LED闪动做秒显示。 3. 利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响, 按停止键使可使闹玲声停止。 4.实现秒表功能(百分之一秒显示) B.扩展部分: 1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整) 2.音乐闹铃(铃音可选择,闹铃被停止后,闪烁显示当前时刻8秒后,或按键跳入正常时间显示状态) 3.定时功能(设定一段时间长度,定时到后,闪烁提示) 4.倒计时功能(设定一段时间长度,能实现倒计时显示,时间长减到0时,闪烁提示) 5.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调) 三,实验基本原理 利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。 为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。

C51单片机实现电子闹钟

C51单片机实现电子闹钟

课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电子 闹钟功能的设计 学院:电子与信息工程学院 专业:通信工程 小组成员:

电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。 一.电子闹钟简介 我们设计的电子闹钟是以MCS 51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。 简易闹钟具有以下功能: 1.时钟能准确地走时,并可以通过数码管进行显示 2.复位后可以进行当前时间的设置 3.可以随意设置闹钟时间,闹钟会在设置时间响铃 整个系统的任务要求: 1)输入数字按键的功能。 保证数字的输入。 2)复位电路的功能。 所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间); 3)显示电路的功能。 当输入数字时显示24小时时间功能。 4)闹铃功能 设置闹铃的时间后.能按设置好的时间准时闹铃。 二.系统方案的设计要求 根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用AT89C51为内核显示设计方案。

实际要用到5个按键,受空间限制仿真电路中只画出4个。 单片机管脚资源分配: P0口为数码管段选信号输出口。 P3口为数码管位选信号输出口。 P1.0、P1.1、P1.2、P1.3、P1.4为键盘的输入信号。 P3.6为蜂鸣器信号的输出口。 下面分别介绍各个电路。 (1)数码管驱动及显示电路 本设计采用8位7段共阳极数码管用来显示时间。为了将时间在LED数码管上显示可采用动态显示法。通过对每位数码管的依次扫描,使对应数码管亮;同时向该数码管送对应的字码使其显示数字。由于数码管扫描周期很短,而且人眼有视觉暂留效应,所以数码管看起来总是亮的从而实现了数字的同时显示。 数码管主要包括位选和段选信号线。位选是用来选通数码管的,只有位选信号有效该数码管才会亮并显示要现实的数字;段选是选择数码管7段的那一笔亮,从而显示不同的数字。 本设计中单片机P0口输出段选数据,P3口输出位选数据。 数码管与单片机相连的电路如下图所示:

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

主题:51单片机4位数码管秒表代码 内容: 1. 介绍51单片机 51单片机是一种通用的单片机系列,广泛应用于各种电子设备中。它具有稳定性好、成本低、易于编程等优点,因此备受电子爱好者和专业工程师的青睐。 2. 4位数码管秒表 4位数码管秒表是一种常见的电子计时器,通过LED数码管显示出当前的时间,可以用于各种计时应用,比如比赛计时、实验计时等。 3. 代码编写 以下是一段简单的51单片机4位数码管秒表代码: ```c #include #include // 数码管位选端口 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++) {

单片机4位数码管电子时钟

单片机4位数码管电子时钟 经过几天的努力,第一个51 单片机电子时钟终于出炉了,通过4 位数码管来显示时间,系统晶振11.0592MHZ,仿真图中用二极管代替时钟冒号闪烁,非门代替三极管,让仿真速度与真实速度达到一致,本设计用了6 个按钮来对时间及闹钟时间的调节、关闭,p3.2 接时间分加1 按钮,p3.3 接时间时加1 按钮,p3.4 接闹钟时间与当前时间切换按钮,按住不放显示闹钟的时间,闹钟初始化为00:00,放开按钮则显示当前时间,p3.5 接闹钟加1 按钮,p3.6 接闹钟 时加1 按钮,p3.7 接关闭闹钟按钮有没有人会问1hei 本程序已经通过软件仿真和硬件制作. 程序源代码:org 0000h ajmp main ;调至主程序org 000bh ;T0 中断入口地址 ljmp inti0 org 001bh ;T1 中断入口地址ljmp inti1 org 0030hmain:mov tmod,#11h ; 设T0、T1 为模式1 mov ie,#8ah ;开T0、T1 中断允许mov th0,#4ch ;赋T0 50ms 初值mov tl0,#00h mov th1,#4ch ;赋T1 50ms 初值mov tl1,#00h mov sp,#60h ;设 置堆栈指针mov r0,#20 ; T0 50ms 计数20 次mov 31h,#00 ;时间秒初始化mov 32h,#00 ;时间分初始化mov 33h,#00 ;时间时初始化mov 38h,#00 ;闹钟分初始化 mov 39h,#00 ;闹钟时初始化setb tr0 ;启动T0 setb tr1 ;启动T1loop:lcall display ; 调用时间显示子程序lcall key ;调用时间调节按键子程序lcall keynz ;调用闹钟 按键子程序ajmp loopinti0:push psw ;保护现场push acc clr ea ;关中断mov th0,#4ch ;重赋50ms 初值mov tl0,#00h djnz r0,out ;对50ms 计数判断mov r0,#20 ;重 赋50ms 计数值inc 31h ;秒加1 cpl p2.2 ;P2.2 取反输出mov a,31h cjne a,#60,out ;判 秒是否加到60,没有加到中断返回mov 31h,#00 ;秒加到60,对秒清零inc 32h ;分 加1 mov a,32h cjne a,#60,out ;判分是否加到60,没有加到就中断返回mov 32h,#00 ;分加到60,对分清零inc 33h ;时加1 mov a,33h cjne a,#24,out ;判时是

51单片机数码管显示时钟程序

51单片机数码管显示时钟 程序(总7页) 本页仅作为文档封面,使用时可以删除 This document is for reference only-rar21year.March

//#include#include<> #define uchar unsigned char #define uint unsigned int sbit 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工作方式1 TH0=(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(); }

c51单片机外接四个数码管时钟显示汇编

;p0端口接数码显示p0.0-a.....p0.7-h ;p1.0-p1.3接位选p1.0-第4个数码管.....p1.3-第1个 ;p2.0-p2.3接列...p2.4-p2.6接行 qq equ 26h qq1 equ 28h x equ 30H y equ 32H z0 equ 34H ;数码显示最高位 z1 equ 36H ; 数码显示次高位 key equ P2 ;键盘控制 key1 equ p3.2 ;时分调整控制键 org 0000h ajmp main org 000bh ljmp td0 org 0100h main: mov tmod,#01h ;初始化 mov tl0,0b0h mov th0,3ch setb ea setb et0 mov r0,#00 mov r1,#00 mov r2,#00 mov r3,#00 mov r4,#00 mov r5,#00 mov r6,#00 mov r7,#00 mov x,#00 mov y,#00 mov z0,#00 mov z1,#00 mov dptr,#tab setb tr0 ;--------------------------------------- main1: call a1 ;判断是否有键按下,, jz main2 ;无键按下,跳main2, call b1 ;有键按下,扫描按键确定哪一个被按下,call c0 ;把对应按键设置键码, main2: jnb key1,guang

ljmp main4 guang:call delay jnb key1,guang1 ljmp main4 guang1:inc r7 jnb key1,$ main4: call xianshi cjne r0,#20,main1 ;一秒定时 mov r0,#00 cpl p3.0 inc r5 cjne r5,#60,main1 ;秒 mov r5,#00 inc r1 cjne r1,#10,main1 ;分个位 mov r1,#00 inc r2 cjne r2,#6,main1 ;分十位 mov r2,#00 inc r3 cjne r6,#1,main3 cjne r3,#2,main1 ;时十位 mov r3,#00 mov r4,#00 ljmp main1 main3: cjne r3,#10,main1 ;时个位 mov r3,#00 inc r4 inc r6 ljmp main1 ;主程序循环 ;----------------------------------------------------- a1:mov key,#0fH ;判断键按下mov a ,key anl a ,#0fh cjne a,#0fh,a2 ;有键按下跳转 mov a,#0 ;无键按下跳转a2:ret b1:mov b,#7fh ;判断哪一个键b2: mov a,b

相关文档
相关文档 最新文档