搜档网
当前位置:搜档网 › 单片机电子钟表、闹钟程序

单片机电子钟表、闹钟程序

单片机电子钟表、闹钟程序
单片机电子钟表、闹钟程序

51单片机电子日历程序代码:

/****************************************************************************/ /* 电子日历,有时间显示、闹铃、日期、秒表及键盘设置功能*/

/* 功能键A: 设置位数字+1 闹钟模式下为闹钟开关秒表模式下为记时开关*/

/* 功能键B: 设置位数字-1 闹钟模式下为闹钟开关*/

/* 功能键C:正常模式及设置模式及设置位选择秒表模式下为清零键*/

/* 功能键D:在四种工作模式下切换设置闹钟开关*/

/* */

/* */

/****************************************************************************/ #include

#include

/*******这里设置程序初始化时显示的时钟时间*********/

#define SET_HOUR 12 /*设置初始化小时*/

#define SET_MINUTE 00 /*设置初始化分钟*/

#define SET_SECOND 00 /*设置初始化秒数*/

/*************************系统地址****************************/

#define BASE_PORT 0x8000 /*选通基地址*/

#define KEY_LINE BASE_PORT+1 /*键盘行线地址*/

#define KEY_COLUMN BASE_PORT+2 /*键盘列线地址*/

#define LED_SEG BASE_PORT+4 /*数码管段选地址*/

#define LED_BIT BASE_PORT+2 /*数码管位选地址*/

#define LED_ON(x) XBYTE[LED_BIT]=(0x01<#define LED_OFF XBYTE[LED_SEG]=0x00 /*LED显示空*/

/**************在设置模式下对秒分时的宏定义*****************/

#define SECOND 0 /*对应数码管右边两位*/

#define MINUTE 1 /*对应数码管中间两位*/

#define HOUR 2 /*对应数码管左边两位*/

/********************定义四种工作模式***********************/

#define CLOCK clockstr /*时钟模式*/

#define ALART alartstr /*闹钟模式*/

#define DATE datestr /*日期模式*/

#define TIMER timerstr /*秒表模式*/

/****************以下是所有子函数的声明*********************/

void sys_init(void); /*系统的初始化程序*/

void display(void); /*动态刷新一次数码管子程序*/

void clockplus(void); /*时间加1S的子程序*/

void update_clockstr(void); /*更新时间显示编码数组*/

void update_alartstr(void); /*更新闹钟时间的显示编码数组*/

void update_datestr(void); /*更新日期显示编码数组*/

void update_timerstr(void); /*更新秒表时间的显示编码数组*/

void deley(int); /*延时子程序*/

void update_dispbuf(unsigned char *); /*更新显示缓冲区*/

unsigned char getkeycode(void); /*获取键值子程序*/

void keyprocess(unsigned char); /*键值处理子程序*/

unsigned char getmonthdays(unsigned int,unsigned char);/*计算某月的天数子程序*/

/*功能键功能子函数*/

void Akey(void); /*当前设置位+1 ;开关闹钟;开关秒表*/

void Bkey(void); /*当前设置位-1 开关闹钟*/

void Ckey(void); /*设置位选择秒表清零*/

void Dkey(void); /*切换四种工作模式*/

/**********************全局变量声明部分*********************/ unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

/*从0~9的LED编码*/

unsigned char ledchar[3]={0x5c,0x54,0x71}; /*o n f 开关显示*/

//unsigned char key[24]={ /* 键值代码数组对应键位:*/

// 0x70,0x71,0x72,0x73,0x74,0x75, /* 7 8 9 A TRACE RESET*/

// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON */

// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */

// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5}; /* 0 F E D EXEC NEXT */

struct{ /*时钟时间结构体变量,用于存储实际的时钟*/ unsigned char s;

unsigned char m;

unsigned char h;

}clock={SET_SECOND,SET_MINUTE,SET_HOUR};

struct{ /*闹铃时间结构体变量*/

unsigned char m;

unsigned char h;

}alart={SET_MINUTE,SET_HOUR};

struct{ /*日期结构体变量*/

unsigned int year;

unsigned char month;

unsigned char day;

}date={6,1,1};

struct{ /*秒表时间结构体变量*/

unsigned char ms;

unsigned char s;

unsigned char m;

}timer={0,0,0};

unsigned char dispbuf[6]; /*显示缓冲区数组*/

unsigned char clockstr[6]; /*时钟时间显示的数码管编码数组,存放可以直接显示的时钟*/ unsigned char alartstr[6]; /*闹钟显示的数码管编码数组*/

unsigned char datestr[6]; /*日期显示的数码管编码数组*/

unsigned char timerstr[6]; /*秒表显示的数码管编码数组*/

unsigned int itime=0,idot; /*定时器0中断计数*/

unsigned char itime1=0; /*定时器1中断计数*/

sbit P3_1=P3^1; /*外接蜂鸣器的管脚*/

/***************标志位**************/

bdata bit IsSet=0; /*设置模式标志位0:正常走时(时钟);1:设置模式*/ bdata bit Alart_EN=0; /*闹铃功能允许位0:禁止闹铃;1:允许闹铃*/

bdata bit IsBeep=0; /*响铃标志位0:未响铃;1:正在响铃*/

unsigned char SetSelect=0; /*在设置模式IsSet=1时,正在被设置的位,对应上面的宏*/ unsigned char *CurrentMode;

/*标志当前正设置的功能,如CurrentMode=CLOCK或CurrentMode=ALART等*/

void timerplus(void);

/**************************函数部分*************************/

void main(void)

{

sys_init();

while(1)

{

XBYTE[KEY_COLUMN,0x00]; /*给键盘列线赋全零扫描码,判断是否有键按下*/ while((XBYTE[KEY_LINE]&0x0f)==0x0f)

/*检测是否有键按下,无则一直进行LED的刷新显示*/

{

if(Alart_EN&&(clock.h==alart.h)&&(clock.m==alart.m))

{IsBeep=1;} /*闹钟时间到,置闹钟标志位*/

else

{

IsBeep=0; /*不是闹钟时间,清零闹钟*/

P3_1=0;

}

display();

}

keyprocess(getkeycode()); /*有键按下时得到键值,并送入键值处理程序*/

display(); /*可要可不要*/

}

}

void sys_init(void) /*******系统初始化******/

{

TMOD=0x22; /*定时器0和1都设置为工作方式2,基准定时250×2=500us=0.5ms*/ TH0=6; /*定时器0中断服务用来产生1秒时钟定时及闹钟蜂鸣器蜂鸣脉冲*/

TL0=6; /*定时器1中断服务留给秒表使用,产生1/100秒定时*/

TH1=6;

TL1=6;

ET0=1;

ET1=1;

EA=1;

TR0=1;

update_clockstr(); /*初始化时钟显示编码数组*/

update_alartstr(); /*初始化闹钟显示编码数组*/

update_datestr(); /*初始化日期显示编码数组*/

update_timerstr(); /*初始化秒表显示编码数组*/

update_dispbuf(clockstr); /*初始化显示缓冲数组*/

CurrentMode=CLOCK; /*默认的显示摸式为时钟*/

P3_1=0; /*蜂鸣器接线引脚复位*/

}

void timer0(void) interrupt 1 using 1 /*定时器0中断服务器,用来产生1秒定时*/

{

itime++;

if(itime==1000)

{

if(IsSet) /*在设置模式下,对正在设置的位闪烁显示*/

{

dispbuf[SetSelect*2]=0; /*对正在设置的位所对应的显示缓冲区元素赋0,使LED灭*/ dispbuf[SetSelect*2+1]=0;

}

if(IsBeep) P3_1=!P3_1; /*闹钟模式时,产生峰鸣器响脉冲*/

if(CurrentMode==CLOCK)

{

dispbuf[2]=dispbuf[2]&0x7f;

dispbuf[4]=dispbuf[4]&0x7f;

}

}

if(itime==2000) /*两千次计数为1S 2000×0.5ms=1s*/

{

itime=0; /*定时1s时间到,软计数清零*/

clockplus(); /*时间结构体变量秒数加1 */

update_clockstr(); /* 更新时钟时间显示编码数组*/

if(CurrentMode!=TIMER) update_dispbuf(CurrentMode);

/* 用时间编码数组更新显示缓冲区*/

}

}

void timer1(void) interrupt 3 using 2 /*定时器1中断服务器,用来产生1/100秒定时*/ {

idot++;

if(++itime1==20) /*20*0.5ms=10ms*/

{

itime1=0;

timerplus();

update_timerstr();

if(CurrentMode==TIMER)

{

update_dispbuf(timerstr);

dispbuf[2]=dispbuf[2]&0x7f; /*关闭小数点的显示*/

dispbuf[4]=dispbuf[4]&0x7f;

if(idot<1000) /*闪烁显示小数点*/

{

dispbuf[2]=dispbuf[2]|0x80;

dispbuf[4]=dispbuf[4]|0x80;

}

else

{

dispbuf[2]=dispbuf[2]&0x7f;

dispbuf[4]=dispbuf[4]&0x7f;

}

}

}

if(idot==2000) idot=0;

}

/*功能模块子函数*/

void clockplus(void) /*时间加1s判断分,时子函数*/

{

if(++clock.s==60) /*秒位判断*/

{

clock.s=0;

if(++clock.m==60) /*分位判断*/

{

clock.m=0;

if(++clock.h==24) /*时位判断*/

{

clock.h=0;

if(++date.day==(getmonthdays(date.year,date.month)+1))

{

date.day=1;

if(++date.month==13) date.month=1;

}

}

}

}

}

void timerplus() /*秒表1/100秒位加1,判断秒、分子程序*/

{

if(++timer.ms==100)

{

timer.ms=0;

if(++timer.s==60)

{

timer.s=0;

if(++timer.m==60)

{

timer.m=0;

}

}

}

}

void update_clockstr(void) /*更新时钟显示代码数组clockstr*/

{

clockstr[0]=led[clock.s%10]; /*给元素0赋相应数码管显示编码,编码序号是秒数的个位*/ clockstr[1]=led[(int)(clock.s/10)];

/*给元素1赋相应数码管显示编码,编码序号是秒数的十位*/

clockstr[2]=led[clock.m%10]; /*以下类推*/

clockstr[3]=led[(int)(clock.m/10)];

clockstr[4]=led[clock.h%10];

clockstr[5]=led[(int)(clock.h/10)];

}

void update_alartstr(void) /*更新闹钟显示代码数组alartstr*/

{ /*右边两位显示闹钟状态on:闹钟开启;of:闹钟关闭*/

if(Alart_EN) alartstr[0]=ledchar[1]; /*闹钟开:显示字母n*/

else

alartstr[0]=ledchar[2]; /*闹钟关:显示字母f*/

alartstr[1]=ledchar[0]; /*显示字母o*/

alartstr[2]=led[alart.m%10]; /****前面四位显示闹钟设置的时间,时,分***/

alartstr[3]=led[(int)(alart.m/10)];

alartstr[4]=led[alart.h%10];

alartstr[5]=led[(int)(alart.h/10)];

}

void update_datestr(void) /*更新日期显示代码数组datestr*/

{

datestr[0]=led[date.day%10];

datestr[1]=led[(int)(date.day/10)];

datestr[2]=led[date.month%10];

datestr[3]=led[(int)(date.month/10)];

datestr[4]=led[date.year%10];

datestr[5]=led[(int)(date.year/10)];

}

void update_timerstr(void) /*更新秒表显示代码数组timerstr*/

{

timerstr[0]=led[timer.ms%10];

timerstr[1]=led[(int)(timer.ms/10)];

timerstr[2]=led[timer.s%10];

timerstr[3]=led[(int)(timer.s/10)];

timerstr[4]=led[timer.m%10];

timerstr[5]=led[(int)(timer.m/10)];

}

void display(void) /*刷新显示六位LED一次*/

{

unsigned char i;

for(i=0;i<6;i++)

{

LED_ON(i); /*选通相应位*/

XBYTE[LED_SEG]=dispbuf[i]; /*写显示段码*/

deley(50); /*延时显示*/

LED_OFF; /*写LED全灭段码*/

}

}

void update_dispbuf(unsigned char *str)

/*更新显示缓冲区子函数,参数为要用来更新缓冲区的源字符数组的首地址*/

{

dispbuf[0]=str[0]; /*将要更新的源字符数组内容COPY至dispbuf数组,用作显示缓冲区*/ dispbuf[1]=str[1];

dispbuf[2]=str[2]|0x80; /*默认把时位和分位后面的小数点显示出来,根据需要再取舍*/ dispbuf[3]=str[3];

dispbuf[4]=str[4]|0x80;

dispbuf[5]=str[5];

}

void deley(int i) /*延时子函数*/

{

while(i--);

}

unsigned char getkeycode(void) /*键盘扫描子程序,返回获得的键码*/

{

unsigned char keycode; /*键码变量,一开始存行码*/

unsigned char scancode=0x20; /*列扫描码*/

unsigned char icolumn=0; /*键的列号*/

display(); /*用刷新数码管显示的时间去抖*/

XBYTE[KEY_COLUMN]=0x00;

keycode=XBYTE[KEY_LINE]&0x0f; /*从行端口读入四位行码*/

while((scancode&0x3f)!=0) /*取scancode的低六位,只要没变为全0,则执行循环*/

{

XBYTE[KEY_COLUMN]=(~scancode)&0x3f; /*给列赋扫描码,第一次为011111*/ if((XBYTE[KEY_LINE]&0x0f)==keycode) break; /*检测按键所在的列跳出循环*/

scancode=scancode>>1; /*列扫描码右移一位*/

icolumn++; /*列号加1*/

}

keycode=keycode<<4; /*把行码移到高四位*/

keycode=keycode|icolumn; /*由行码和列码组成键码*/

//等待按键放开

XBYTE[KEY_COLUMN]=0x00;

while((XBYTE[KEY_LINE]&0x0f)!=0x0f) display();

return keycode;

}

void keyprocess(unsigned char keycode) /*键值处理函数*/

{

switch (keycode)

{

case 0x73: Akey();

break;

case 0xB3: Bkey();

break;

case 0xD3: Ckey();

break;

case 0xE3: Dkey();

break;

default: break;

}

update_dispbuf(CurrentMode);

}

unsigned char getmonthdays(unsigned int year,unsigned char month)/*得到某月的天数*/ {

unsigned char days;

switch (month)

{

case 4:

case 6:

case 9:

case 11:days=30;

break;

case 2: if(year%4==0) days=29;

else days=28;

break;

default:days=31;

break;

}

return days;

}

/*功能键子函数部分*/

void Akey(void) /*对当前设置位进行加一操作,如果设置秒位,则给秒位清零*/ {

if(!IsSet) return; /*如果不是设置模式退出*/

if(CurrentMode==TIMER) /*秒表模式下启,闭走时切换*/

{ TR1=!TR1;

return;

}

switch (SetSelect)

{

case SECOND:if(CurrentMode==CLOCK)

{

clock.s=0; /*如果当前被设置位是秒位,则清零秒位*/

update_clockstr();

}

if(CurrentMode==ALART)

{ /*当前模式是闹钟模式则,切换闹钟的开关*/

Alart_EN=!Alart_EN;

update_alartstr();

}

if(CurrentMode==DATE)

{

if(++date.day==(getmonthdays(date.year,date.month)+1)) date.day=1;

update_datestr();

}

if(CurrentMode==TIMER)

{

TR1=!TR1;

}

break;

case MINUTE:if(CurrentMode==CLOCK)

{

if(++clock.m==60) clock.m=0; /*如果当前被设置分位,则分位加1*/ update_clockstr();

}

if(CurrentMode==ALART)

{

if(++alart.m==60) alart.m=0;

update_alartstr();

}

if(CurrentMode==DATE)

{

if(++date.month==13)

date.month=1;

// ++date.year;

update_datestr();

}

break;

case HOUR: if(CurrentMode==CLOCK)

{

if(++clock.h==24) clock.h=0; /*如果当前被设置时位,则时位加1*/ update_clockstr();

}

if(CurrentMode==ALART)

{

if(++alart.h==24) alart.h=0;

update_alartstr();

}

if(CurrentMode==DATE)

{

if(++date.year==100) date.year=0;

update_datestr();

}

break;

default: break;

}

update_dispbuf(CurrentMode);

}

void Bkey(void)

/*对当前设置位进行减一操作,如果设置秒分,则给秒位清零,类比Akey()函数*/ {

if(!IsSet) return;

switch (SetSelect)

{

case SECOND:if(CurrentMode==CLOCK)

{

clock.s=0;

update_clockstr();

}

if(CurrentMode==ALART)

{

Alart_EN=!Alart_EN;

update_alartstr();

}

if(CurrentMode==DATE)

{

if(--date.day==0x00) date.day=getmonthdays(date.year,date.month);

update_datestr();

}

break;

case MINUTE: if(CurrentMode==CLOCK)

{

if(--clock.m==0xff) clock.m=59;

update_clockstr();

}

if(CurrentMode==ALART)

{

if(--alart.m==0xff) alart.m=59;

update_alartstr();

}

if(CurrentMode==DATE)

{

if(--date.month==0x00) date.month=12;

update_datestr();

}

break;

case HOUR: if(CurrentMode==CLOCK)

{

if(--clock.h==0xff) clock.h=23;

update_clockstr();

}

if(CurrentMode==ALART)

if(--alart.h==0xff) alart.h=23;

update_alartstr();

}

if(CurrentMode==DATE)

{

if(--date.year==0xffff) date.year=99;

update_datestr();

}

break;

default: break;

}

update_dispbuf(CurrentMode);

}

void Ckey(void) /*正常走时模式和设置模式的切换*/

{

if(CurrentMode==TIMER)

{

TR1=0; /*初始化定时器1设置,停止秒表记时*/

TH1=6;

TL1=6;

timer.ms=0; /*初始化秒表数组*/

timer.s=0;

timer.m=0;

update_timerstr();

}

else

{

if(IsSet==0) /*在非秒表模式下,第一次按下C键进入设置模式,设置时位*/

{

IsSet=1; /*置位标志位,进入设置模式*/

SetSelect=HOUR;

return;

} /*第二次按C键设置分位,第三次按键设置秒位,第四次按键完成退出设置*/

if(SetSelect==0) /*按到第四次,即设置完秒位后,将标志位IsSet置0,完成设置*/ {

IsSet=0; /*复位标志位,进入正常走时模式*/

return;

}

if(SetSelect>0) SetSelect--; /*设置位的标志变量SetSelect=0:时位1:分位2:秒位*/ }

}

void Dkey(void) /*工作状态切换:时钟、闹钟、日期、秒表*/ {

if(CurrentMode==CLOCK) /*切换至闹钟,同时开关闹钟*/ { CurrentMode=ALART;

Alart_EN=!Alart_EN;

update_alartstr();

return;

}

if(CurrentMode==ALART) /*切换至日期*/

{ CurrentMode=DA TE;

return;

}

if(CurrentMode==DATE) /*切换至秒表,同时关闭设置模式*/ {

CurrentMode=TIMER;

IsSet=0;

return;

}

if(CurrentMode==TIMER) /*切换至时钟*/

{

CurrentMode=CLOCK;

return;

}

}

基于单片机的电子闹钟设计

基于单片机的电子闹钟设计 摘要 本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。 关键词:单片机;led;闹钟;定时器 Abstract This design, adopting AT89C51 chip as the core part with some necessary peripheral circuits, is a simple electronic clock which uses 5V DC as the power supply. Keywords:single chip machine ,in fixed time machine, alarm clock,LED 1 引言 1.1设计目的 此次课程设计是在学习先修课程《单片机原理与系统设计》之后,为加强对学生系统设计和应用能力的培养而开设的综合设计训练环节。本课程设计应结合《单片机原理与系统设计》课程的基础理论,重点强调实际应用技能训练,包括单片机系统设计的软件和硬件两部分。其课程设计任务是使学生通过应用单片机系统设计的基本理论,基本知识与基本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进行设备技术改造和产品开发的能力,培养学生的创新意识,提高学生的动手能力和分析问题、解决问题的能力。 1.2设计要求 结合单片机知识,以AT89C51单片机为核心,利用七段LED数码管实现计时、校时及闹钟功能。 1.3设计方法 以AT89C51单片机为核心,外加晶振电路,使用8个七段数码管显示,LED 采用动态扫描,用74ls245芯片作为驱动电路。通过四个独立按键对时间进行定时、校时,从而实现闹钟提醒功能。 2 设计方案及原理 2.1设计方案 选AT89C51单片机作为系统核心,辅助外部产生时钟信号的晶振电路,再加上四个独立按键作为输入信号,使用8个七段数码管显示时间,芯片74ls245为数码管段选线的驱动,最后用蜂鸣器实现闹铃功能。使用单片机的定时器T0计时时间为50ms,计时20次作为1s的时间基准。第一部分,12MHz的晶振连接至单片机的时钟信号输入端;第二部分,四个独立按键加上四个上拉电阻连接至单片机

单片机电子时钟的设计

单片机电子时钟的设计 ----------- 基于单片机的电子时钟 专业:运算机科学与技术 班级:专升本1班 小组成员:张琴张娜赵慧佩 学号:23 24 25

基于单片机的电子时钟设计 摘要 20世纪末,电子技术获得了飞速的进展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的进展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 现代生活的人们越来越重视起了时刻观念,能够说是时刻和金钱划上了等号。关于那些对时刻把握专门严格和准确的人或事来说,时刻的不准确会带来专门大的苦恼,因此以数码管为显示器的时钟比指针式的时钟表现出了专门大的优势。数码管显示的时刻简单明了而且读 数快、时刻准确显示到秒。而机械式的依靠于晶体震荡器,可能会导致误差。 数字钟是采纳数字电路实现对“时”、“分”、“秒”数字显示的计时装置。数字钟的精度、稳固度远远超过老式机械钟。在这次设计中,我们采纳LED数码管显示时、分、秒,以24 小时计时方式,依照数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。在此次设计中,电路具有显示时刻的其本功能,还能够实现对时刻的调整。数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受宽敞消费的喜爱,因此得到了广泛的使用。 .

目录 第一章绪论 1.1 数字电子钟的背景 (4) 1.2 数字电子钟的意义 (4) 1.3 数字电子钟的应用 (4) 第二章整体设计方案 2.1 单片机的选择 (5) 2.2 单片机的差不多结构 (7) 第三章数字钟的硬件设计 3.1 最小系统设计 (11) 3.2 LED显示电路 (14) 第四章数字钟的软件设计 4.1 系统软件设计流程图 (16) 4.2 数字电子钟的原理图 (19) 第五章系统仿真 5.1 PROTUES软件介绍 (20) 5.2 电子钟系统PROTUES仿真 (21) 第六章调试与功能说明 6.1 硬盘调试 (22) 6.2 系统性能测试与功能说明 (22) 6.3 系统时钟误差分析 (22) 6.4 软件调试问题及解决 (22) 附件:主程序 (23)

51单片机作的电子钟程序及电路图

51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分,计算部分,时钟调整部分构成。 时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。 开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。

以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 中断入口程序 ;; (仅供参考) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ORG 0000H ;程序执行开始地址 LJMP START ;跳到标号START执行 ORG 0003H ;外中断0中断程序入口 RETI ;外中断0中断返回 ORG 000BH ;定时器T0中断程序入口 LJMP INTT0 ;跳至INTTO执行 ORG 0013H ;外中断1中断程序入口

RETI ;外中断1中断返回 ORG 001BH ;定时器T1中断程序入口 LJMP INTT1 ;跳至INTT1执行 ORG 0023H ;串行中断程序入口地址 RETI ;串行中断程序返回 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH ;clr P3.7 ; CLEARDISP: MOV @R0,#00H ; INC R0 ; DJNZ R7,CLEARDISP ; MOV 20H,#00H ;清20H(标志用) MOV 7AH,#0AH ;放入"熄灭符"数据 MOV TMOD,#11H ;设T0、T1为16位定时器 MOV TL0,#0B0H ;50MS定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值 MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOV TH1,#3CH ;50MS定时初值 SETB EA ;总中断开放 SETB ET0 ;允许T0中断 SETB TR0 ;开启T0定时器 MOV R4,#14H ;1秒定时用初值(50M S×20)START1: LCALL DISPLAY ;调用显示子程序 JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序SJMP START1 ;P3.7口为1时跳回START1 SETMM1: LJMP SETMM ;转到时间调整程序SETMM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;T0中断服务程序 INTT0: PUSH ACC ;累加器入栈保护 PUSH PSW ;状态字入栈保护

51单片机实现的音乐闹钟程序代码

功能描述:产品可以显示时间和日期,时间格式为 hh mm ss 日期格式为 yy.mm.dd 时间和日期轮流显示。时间显示5S 日期显示3S。 可以设置5个闹铃,闹铃音乐可以设置两种:毛驴和童年。 三个按键对时间和闹铃进行设置,六个LED进行显示。 计时采用DS1307。继电时间不丢失,设置过的闹铃也不丢失。 闹铃音乐由单片机的两个定时器去产生频率实现。 部分程序如下: //************************************************* //************************************************ //*********************************************** //程序名:DS1307 时钟程序 //功能描述:用六个八段LED 轮流显示时间 // 和日期。有6个闹钟。上电时从DS1307中读出 // 当前时间、日期、闹钟。 // // // // // #include #include #define uchar unsigned char #define uint unsigned int #define LED P2 #define LEDBit P0 #define nop _nop_(>

#define LightCount 40 #define LightMax 80 sbit SCL=P3^1。 sbit SDA=P3^0。 sbit ModeKey=P1^0。 sbit UpKey=P1^1。 sbit DownKey=P1^2。 sbit Speak=P3^6。 code uchar LCD_NUM[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}。 //0x25, //uchar Clock[]={0x88,0x88,0x88}。 code uint Music_Sound_Long1[]={4,8,4,8,8,4,8,4,4,4, /*童年*/ 8,4,8,4,4,4,4,4,16,4, 4,8,4,4,4,4,4,8,4,4, 4,8,4,4,4,4,4,4,16,4, 4,8,4,4,4,4,4,8,4,4, 4,8,4,4,4,4,4,4,16,4, 8,4,8,4,4,4,8,8,4,4, 4,4,4,4,4,4,4,4,4,16, 4,8,4,8,8,4,8,4,4,4, 8,4,8,4,4,4,4,4,16,4, 8,4,8,8,4,8,4,4,4,8, 4,8,4,4,4,4,4,16,0}, Music_Sound_Long2[]={4,4,4,4,4,4,4,4,4,4, /*小毛驴*/ 4,4,16,4,4,4,4,4,4 ,4, 4,4,4,4,4,8,4,4,4,4, 4,4,4,4,4,4,4,4,4,16, 4,4,4,4,2,2,2,2,4,4, 4,4,4,4,16,0}, Music_Sound_Tone1[]={379,379,379,379,425,477,477,477,425,477, 568,637,637,637,568,637, 425,379,477,719, 637,63 7,719,637,568,568,506,568,568,568, 637,477,477,477,477,568,477,568,637,719, 637,637,719,637,568,568,506,568,568,568, 637,477,477,477,477,568,568,477,851,318,

基于51单片机的万年历的设计

单片机课程实训SCM PRACTICAL TRAINING

目录 第一部分课程设计任务书 (1) 一、课程设计题目 (1) 二、课程设计时间 (1) 三、实训提交方式 (1) 四、设计要求 (1) 第二部分课程设计报告 (2) 一、单片机发展概况 (2) 二、MCS-51单片机系统简介 (2) 三、设计思想 (3) 四、硬件电路设计 (3) 1. 总体设计 (3) 2. 晶振电路 (4) 3. 复位电路 (4) 4. DS1302时钟电路 (5) 5. 温度采集系统电路 (5) 6. 按键调整电路 (6) 7. 闹钟提示电路 (6) 五、软件设计框图 (7) 六、程序源代码 (8) 1. 主程序 (8) 2. 温度控制程序 (11) 3. 日历设置程序 (13) 4. 时钟控制程序 (18) 5. 显示设置程序 (20) 七、结束语 (23) 八、课程设计小组分工 (23) 九、参考文献 (23)

第一部分课程设计任务书 一、课程设计题目 用中小规模集成芯片设计制作万年历。 二、课程设计时间 五天 三、实训提交方式 提交实训设计报告电子版与纸质版 四、设计要求 (1)显示年、月、日、时、分、秒和星期,并有相应的农历显示。(2)可通过键盘自动调整时间。 (3)具有闹钟功能。 (4)能够显示环境温度,误差小于±1℃ (5)计时精度:月误差小于20秒。

第二部分课程设计报告 一、单片机发展概况 单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段: 第一阶段(1976-1978):初级单片机微处理阶段。该时期的单片机具有 8 位CPU,并行 I/O 端口、8 位时序同步计数器,寻址范围 4KB,但是没有串行口。 第二阶段(1978-1982):高性能单片机微机处理阶段,该时期的单片机具有I/O 串行端口,有多级中断处理系统,15 位时序同步技术器,RAM、ROM 容量加大,寻址范围可达 64KB。 第三阶段(1982-至今)位单片机微处理改良型及 16 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。 二、MCS-51单片机系统简介 MCS-51系列单片机产品都是以Intel公司最早的典型产品8051为核心构成的。MCS-51单片机由CPU 、RAM 、ROM 、I/O接口、定时器/计数器、中断系统、内部总线等部件组成。8051单片机的基本性能有: ◆8位CPU; ◆布尔代数处理器,具有位寻址能力; ◆128B内部RAM,21个专用寄存器; ◆4KB内部掩膜ROM; ◆2个16位可编程二进制加1定时器/计数器; ◆32个(4×8位)双向可独立寻址的I/O口; ◆1个全双工UART(异步串行通信口); ◆5个中断源,两级中断结构; ◆片内振荡器及时钟电路,晶振频率为1.2MHz~12MHz; ◆外部程序/数据存储器寻址空间均为64KB; ◆111条指令,大部分为单字节指令; ◆单一+5V电源供电,双列直插40引脚DIP封装。

基于单片机电子闹钟的设计

西南石油大学 单片机课程设计 学院: 电气信息学院 专业年级: 通信工程2013级 姓名: 王昕铃 学号: 课题:基于单片机的定时闹钟设计 指导老师: 邓魁 日期: 2016 年 6月 30日 前言 20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高。同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。所以有必要制作一个定时系统。随时提醒这些容易忘记时间的人。而钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等等。所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。 随着生活水平的提高,人们越来越追求人性化的事物。传统的时钟已不能满足人们的需求。而现代的时钟不仅需要模拟电路技术和数字电路技术而且更需要单片机技术,增加数字钟的功能。利用软件编程尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,减小因元器件精度不够引起的误差,但是数字钟还是可以改进和提高如选用更精密的元器件。但与机械式时钟相比已经具有

更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。 数字钟通过数字电路实现时、分、秒。数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。 多功能数字钟的应用非常普遍。由单片机作为数字钟的核心控制器,通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。通过键盘可以进行校时、定时等功能。输出设备显示器可以用液晶显示技术和数码管来显示技术。 本系统利用单片机实现具有计时、校时等功能的数字时钟,是以单片机AT89C51为核心元件同时采用LED数码管显示器动态显示“时”、“分”、“秒”的现代计时装置。另外具有校时功能,秒表功能,和定时器功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。 摘要 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而51单片机是各单片机中最为典型和最有代表性的一种。 本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。在硬件方面,除了CPU外,使用八个七段LED数码管来进行显示,LED采用的是动态扫描显示,使用74LS245芯片进行驱动。通过LED能够较为准确地显示时、分、秒。四个简单的按键实现对时间的调整。软件方面采用C语言编程。整个电子钟系统能完成时间的显示、调时、校时和三组定时闹钟的功能。 选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。介绍并使用Keil单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真。 关键词:单片机,定时器,中断,闹钟,LED

基于单片机的电子闹钟的设计说明

课程设计报告 课程名称:单片机课程设计 题目:多功能电子表 学院:环境与化学工程系:过程装备与测控工程 专业:测控技术与仪器 班级:测仪111 学号: 5801211040 学生:白金成 起讫日期: 2012-12-28~2013-1-7 指导教师:大勇、俊清、熊剑

单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而51单片机是各单片机中最为典型和最有代表性的一种。 本设计以AT89C52芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的闹钟,它由5V直流电源供电。在硬件方面,除了CPU外,使用1602液晶显示时钟的时间,并通过所写程序控制在某个时间点蜂鸣器的响应,即完成闹钟的功能,该闹钟设有4个独立按键,时间调整按键、闹钟调整按键和两个时间加减按键。软件方面采用C语言编程。整个闹钟系统能完成时间的显示、调时和定时闹钟的功能。 选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。介绍并使用KEIL单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真。 关键词:AT89C52单片机定时器中断闹钟

一、设计任务、要求 (4) 1.1、设计任务: (4) 1.2、设计要求: (4) 二、方案总体设计 (5) 2.1、显示模块 (5) 2.2、实时时间计算模块 (5) 2.3、按键控制模块 (5) 2.4、声音报警模块 (5) 2.5、总体设计: (5) 三、硬件设计 (7) 3.1、单片机最小系统 (7) 3.1.1、时钟信号的产生 (7) 3.1.2、复位电路 (7) 3.2、液晶显示模块 (8) 3.2.1、1602液晶引脚图及连线电路 (8) 3.2.2、一般1602字符型液晶显示器实物图 (8) 3.3、矩阵键盘 (8) 3.4、蜂鸣器电路 (9) 3.5、电源指示灯部分 (9) 3.6、STC89C52芯片 (9) 3.7、整体电路原理图 (10) 3.8、Lockmaster硬件电路 (11) 四、程序流程图 (12) 五、系统仿真与调试 (14) 5.1、Proteus仿真原理图 (14) 5.2、实物图 (16) 5.3、使用说明 (16) 六、设计总结及心得体会 (17) 附录: (18)

基于51单片机的电子时钟设计源程序

#include unsigned char DispBuf[6]; //时间显示缓冲区 unsigned char Disdate[6]; //日期显示缓冲区 unsigned char DisSec[6]; //秒表缓冲区 struct //设定时间结构体 { unsigned char Hour; unsigned char Min; unsigned char Sec; }Time; struct //设定日期结构体 { unsigned char Year; unsigned char Month; unsigned char Days; }Date; struct //设定毫秒结构体 { unsigned char Minite; unsigned char Second; unsigned char MilliSec; }Millisecond; unsigned char point=0; unsigned char point1=0; unsigned char point2=0; unsigned char Daymount; unsigned char Daymount1; unsigned char T0_Int_Times=0; //中断次数计数变量 unsigned char Flash_flag=0; //闪烁标志,每半秒闪烁 unsigned char Flash_flag1=0; //闪烁标志,每半秒闪烁 unsigned char DisPlay_Back=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致 unsigned char DisPlay_Back1=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致 unsigned char i,j; unsigned char SetMillisecond; //启动秒表 code unsigned char LEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80}; //数码管显示代码 code unsigned char ErrorLEDCode[]={0x01,0xe7,0x12,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80};//绘制错误图纸的数码管显示代码 void DisPlayBuf(); void ChangeToDispCode(); void ChangeToDispCode1(); void changedate(); // 调日期 void displaydate(); // 显示日期 void makedays(); //确定每个月的日期 void runSec();

基于51单片机电子闹钟的设计

前言 20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高。同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。所以有必要制作一个定时系统。随时提醒这些容易忘记时间的人。而钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等等。所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。 随着生活水平的提高,人们越来越追求人性化的事物。传统的时钟已不能满足人们的需求。而现代的时钟不仅需要模拟电路技术和数字电路技术而且更需要单片机技术,增加数字钟的功能。利用软件编程尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,减小因元器件精度不够引起的误差,但是数字钟还是可以改进和提高如选用更精密的元器件。但与机械式时钟相比已经具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。 数字钟通过数字电路实现时、分、秒。数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。 多功能数字钟的应用非常普遍。由单片机作为数字钟的核心控制器,通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。通过键盘可以进行校时、定时等功能。输出设备显示器可以用液晶显示技术和数码管来显示技术。 本系统利用单片机实现具有计时、校时等功能的数字时钟,是以单片机AT89C51为核心元件同时采用LED数码管显示器动态显示“时”、“分”、“秒”的现代计时装置。另外具有校时功能,秒表功能,和定时器功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。

单片机数字时钟带闹钟

计算机硬件综合课程 设计报告 课目: 学院: 班级: 姓名: 指导教师: 目录

1 设计要求 功能需求 设计要求 2 硬件设计及描述 总体描述 系统总体框图 Proteus仿真电路图3 软件设计流程及描述 程序流程图 函数模块及功能 4 心得体会 附:源程序

1设计要求 1.1功能需求 (1)实现数字时钟准确实时的计时与显示功能; (2)实现闹钟功能,即系统时间到达闹钟时间时闹铃响; (3)实现时间和闹钟时间的调时功能; (4)刚启动系统的时候在数码管上滚动显示数字串(学号)。 1.2设计要求 (1)应用MCS-51单片机设计实现数字时钟电路; (2)使用定时器/计数器中断实现计时; (3)选用8个数码管显示时间; (4)使用3个按钮实现调时间和闹钟时间的功能。按钮1:更换模式(模式0:正常显示时间;模式1:调当前时间的小时;模式 2;调当前时间的分钟;模式3:调闹钟时间的小时;模式4: 调闹钟时间的分钟);按钮2:在非模式0下给需要调节的时 间数加一,但不溢出;按钮3:在非模式0下给需要调节的时 间数减一,但不小于零; (5)在非0模式下,给正在调节的时间闪烁提示; (6)使用扬声器实现闹钟功能; (7)采用C语言编写程序并调试。

2 硬件设计及描述 2.1总体描述 (1)单片机采用AT89C51型; (2)时间显示电路:采用8个共阴极数码管,P1口驱动显示数字,P2口作为扫描信号; (3)时间设置电路:、、分别连接3个按键,实现调模式,时间加和时间减; (4)闹钟:口接扬声器。 2.2系统总体框图 2.3Proteus仿真电路图

基于51单片机的电子时钟的设计

目录 0 前言 (1) 1 总体方案设计 (2) 2 硬件电路设计 (2) 3 软件设计 (5) 4 调试分析及说明 (7) 5 结论 (9) 参考文献 (9) 课设体会 (10) 附录1 电路原理 (12) 附录2 程序清单 (13)

电子时钟的设计 许山沈阳航空航天大学自动化学院 摘要:传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求。 单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。而51系列的单片机是各单片机中最为典型和最有代表性的一种。,本次设计提出了系统总体设计方案,并设计了各部分硬件模块和软件流程,在用C语言设计了具体软件程序后,将各个模块完全编译通过过后,结果证明了该设计系统的可行性。该设计给出了以AT89C2051为核心,利用单片机的运算和控制功能,并采用系统化LED显示模块实时显示数字的设计方案,适当地解决了实际生产和日常生活中对计时高精确度的要求,因此该设计在现代社会中具有广泛的应用性。 关键字:AT89C2051,C语言程序,电子钟。 0前言 利用51单片机开发电子时钟,实现时间显示、调整和闹铃功能。具体要求如下: (1)按以上要求制定设计方案,并绘制出系统工作框图; (2)按要求设计部分外围电路,并与单片机仿真器、单片机实验箱、电源等正确可靠的连接,给出电路原理图; (3)用仿真器及单片机实验箱进行程序设计与调试;

(4)利用键盘输入调整秒、分和小时时刻,数码管显示时间; (5)实现闹钟功能,在设定的时间给出声音提示。 1总体方案设计 该电子时钟由89C51,BUTTON,1602 LCD液晶屏等构成,采用晶振电路作为驱动电路,利用单片机内部定时计数器0通过软件扩展产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。闹钟和时钟的时分秒的调节是由一个按键控制,而另外一个按键控制时钟和闹钟的时间的调节。 图1 系统结构框图 该电子时钟由STC89C51,BUTTON,1602 LCD液晶屏等构成,采用晶振电路作为驱动电路,晶振电路的晶振频率为12MHZ,使用的定时器/计数器工作方式0,通过软件扩展产生的一秒定时,达到时分秒的计时,60秒为一分钟,60分钟为一小时,24小时为一天,又重00:00:00开始计时。没有按键按键按下时,时钟正常运行,当按下调节时钟按键K1,就会关闭时钟,当按下闹钟按键K3时时钟就会进入设置时间界面,但是时钟不会停止工作,按K2键,,就可以对时钟和闹钟要设置的时间进行调整。 2硬件电路设计

基于51单片机实现的简单闹钟设计

【摘要】众所周知闹钟对我们日常生活来讲是一个很重要的工具,因而我利用单片机AT89C52制作一个简单的倒计时定时闹钟。本设计利用单片机的内部中断资源和按键的基本使用方法构思而成。利用按键设定需要定时的时间长短,利用中断设置20次中断定义一秒,然后利用程序设计时间倒数。并使用4个8段数码管显示分和秒,并且定时结束后使用电铃警示。硬件系统利用proteus仿真,在仿真中就能观察到系统的实际运行情况。 【关键字】 单片机AT89C51 倒计时定时中断 protues仿真 一、设计项目简介 基于51单片机进行简单闹钟设计。四位数码管从左往右分别代表十分位,分位,十秒位,秒位。按动对应按键能增加各个位的数值,按动开始计时按键能开始倒计时。 二、硬件设计 1.总体设计思路 控制芯片使用比较熟悉的AT89C52单片机芯片,数码管使用四位相连的8段共阴数码管,并且使用74HC573锁存器控制数码管的显示。在定时过程使用s1控制十分位,s2控制分位,s3控制十秒位,s4控

制秒位,s5开始倒计时。 基本思路设计如下: 2. AT89C52芯片介绍 80C52是INTEL 公司MCS-51系列单 片机中基本的产品,它采用INTEL 公司可靠的CHMOS 工艺技术制造的 高性能8 位单片机,属于标准的MCS-51的HCMOS 产品。它结合了HMOS 的高速和高密度技术及CHMOS 的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。 80C52内置8位中央处理单元、256字节内部数据存储器RAM 、8k 片内程序存储器(ROM )32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡

基于ATC单片机定时闹钟设计

塔里木大学信息工程学院 《单片机原理与外围电路》课程论文 题目:单片机定时闹钟设计 姓名:海热古丽·依马木 学号: 15 班级:计算机15-1班

摘要:本设计是单片机定时闹钟系统,不仅能实现系统要求的功能,而且还有附加功能,即还能设定和修改当前所显示的时间。?本次设计的定时闹钟在硬件方面就采用了AT89C51芯片,用6位LED数码管来进行显示。LED用P0口进行驱动,采用的是动态扫描显示,能够比较准确显示时时—分分—秒秒。通过S1、S2、S3、和S4四个功能按键可以实现对时间的修改和定时,定时时间到喇叭可以发出报警声。在软件方面采用汇编语言编程。整个定时闹钟系统能完成时间的显示,调时和定时闹钟、复位等功能,并经过系统仿真后得到了正确的结果。 关键词:单片机、AT89C51、定时闹钟、仿真? Abstract:T his design is a single-chip timing alarm system, can not only realize the function of system requirements, and there are additional functions, which can set up and modify the display time. Timing alarm clock this design adopts the AT89C51 chip on the hardware side, with 6 LED digital tube to display. LED P0 export driven, by using dynamic scanning display, can accurately display always - sub - seconds seconds. Through the S1, S2, S3, and S4 four function keys can be achieved on the time changes and timing, timing to the horn can send out alarm sound. Using assembly language programming in the software. The timing clock system has functions of time display, timing and timing alarm clock, reset and other functions, and the system simulation to obtain correct results. Keywords: single chip microcomputer, AT89C51, alarm clock,

基于51单片机电子闹钟的设计(1)

单片机原理与接口技术课程设计题目:多功能电子闹钟 院系:电气与电子工程系 专业:电气工程及其自动化 班级:电气工程1503 姓名: 学号: 指导教师: 二零一七年十二月

多功能电子闹钟 摘要 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而51单片机是各单片机中最为典型和最有代表性的一种。 本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。在硬件方面,除了CPU外,使用八个七段LED数码管来进行显示,LED采用的是动态扫描显示,使用74LS245芯片进行驱动。通过LED能够较为准确地显示时、分、秒。四个简单的按键实现对时间的调整。软件方面采用C语言编程。整个电子钟系统能完成时间的显示、调时、校时和三组定时闹钟的功能。 选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。介绍并使用Keil 单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真。 关键词:单片机定时器中断闹钟 LED

目录 第1章方案的选择和论证 (1) 1.1单片机型号的选择 (1) 1.2按键的选择 (1) 1.3显示器的选择 (1) 1.4计时部分的选择 (1) 1.5发音部分的设计 (2) 1.6显示器驱动电路 (2) 1.7电源的选择 (2) 第2章数字电子钟的设计原理和方法 (3) 2.1设计原理 (3) 2.2硬件电路的设计 (3) 2.2.1 AT89C51单片机简介 (3) 2.2.2 键盘电路的设计 (3) 2.2.3 段码驱动电路 (4) 2.2.4 蜂鸣器驱动电路 (4) 2.3软件部分的设计 (5) 2.3.1 主程序部分的设计 (5) 2.3.2 中断定时器的设置 (5) 2.3.3 闹钟子函数 (6) 2.3.4 计时函数 (6) 2.3.5 键盘扫描函数 (8) 2.3.6 时间和闹钟的设置 (8) 第3章实验结果 (10) 总结 (11) 致谢 (12) 参考文献 (13) 附录 (14)

51单片机简易可调的数码管电子钟程序

#include sbit KEY1=P3^0; sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit LED=P1^2; code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0-9 unsigned char StrTab[8]; //定义缓冲区 unsigned char minute=30,hour=12,second; //定义并且初始化值12:30:00 void delay(unsigned int cnt)//延时函数 { while(--cnt); } void Displaypro(void) { StrTab[0]=tab[hour/10]; //显示正常时间 StrTab[1]=tab[hour%10]; StrTab[2]=0xBF; StrTab[3]=tab[minute/10]; StrTab[4]=tab[minute%10]; StrTab[5]=0xBF; StrTab[6]=tab[second/10]; StrTab[7]=tab[second%10]; } main()//主函数 { TMOD |=0x01;//定时器0 10ms in 12M crystal 用于计时 TH0=0xd8; TL0=0xf0; ET0=1; TR0=1; TMOD |=0x10; //定时器1用于动态扫描 TH1=0xF8; TL1=0xf0; ET1=1; TR1=1; EA =1; Displaypro();

单片机大全程序电子闹钟

电子闹钟课程设计 摘要:本课程设计主要是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。 硬件设计的主要任务是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。 合理的软件结构是设计出一个性能优良的单片机应用性系统软件的基础,因此必须充 1 2. 3. 而 本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。

电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示,报警电路, 芯片选用AT89C51 单片机。 系统框图: 四.硬件设计 1.单片机AT89C51 AT89C51是一个低电压,高性能CMOS型 8位单片机,片内含4KB的可反复擦写的Flash 只读程序存储器(ROM)和128 B的随机存取数据存储器(RAM),器件采用ATMEL公司的高 8 Array位器和 内置功能 实 的I/O 几个特殊管脚: XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平。 2.时钟电路 单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。本系统中AT89C51单片机采用内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHz~12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳 定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。时钟电路

51单片机数码管时钟程序

本人初学51,编写简单时钟程序。仅供参考学习 #include #define uint unsigned int #define uchar unsigned char Uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1 }; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0xef}; void delay(uint); unsigned long i,num,t=1; void main() { TMOD=0X01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; TR0=1; while(1) { num=i/20;//i为秒位 if(i==1728000)//一天大概是这个秒吧,,,应该是,呵呵。就是世间到24时就归零。 i=0; //也可用下面这个部分来代替上面的。 /*if(i==20) { i=0; num++; if(num==5184000) num=0; }*/ //num=9; P2=7;//P2口为数码管控制端,我的是38译码器控制,就直接对其赋值来控制时,分,秒的显示; P0=table[i%100%10]; delay(t); P2=6; P0=table[i%100/10]; delay(t); P0=table_d[(num%60)%10]; P2=5; delay(t); P0=table[(num%60)/10]; P2=4;

相关主题