搜档网
当前位置:搜档网 › 单片机日历时钟与键盘显示程序设计报告

单片机日历时钟与键盘显示程序设计报告

单片机日历时钟与键盘显示程序设计报告
单片机日历时钟与键盘显示程序设计报告

日历时钟与键盘显示程序

设计

学院名称:

专业班级:

学生姓名:

学生学号:

指导教师:

一、设计目的:

掌握日历时钟的编程方法,了解SMBus的编程方法。进一步掌握T0计数器的用法和中断服务的过程。用C51语言设计一个时钟,使其有自动报时和闹铃功能,并且可以通过键盘对当前时间进行校正,可以用键盘设置闹钟时间。

二、设计要求:

1、能在LED显示器上实现正常的时分秒计时

2、能通过键盘输入当前时间,并从该时间开始计时

3、有校时、校分功能

4、有报时功能,通过指示灯表示

5、有闹时功能,闹时时间可以设定,通过指示灯表示

三、流程图:

HD7279流程图

3530流程图

四、源程序:

1、HD7279芯片功能:

HD7279是一片具有串行接口的,可用于驱动8位共阴极式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。

HD7279内部含有译码器,可直接接受BCD码或者16进制码,并同时具有两种译码方式,此外还有消隐、闪烁、左移、右移、段寻址等多种控制指令。 HD7279具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口。

2.LED数码管工作原理及显示码:

图1 这是一个7段两位带小数点 10引脚的LED数码管

图2 引脚定义

每一笔划都是对应一个字母表示 DP是小数点.

数码管分为共阳极的LED数码管、共阴极的LED数码管两种。下图例举的是共阳极的LED数码管,共阳就是7段的显示字码共用一个电源的正。led数码管原理图示意:

图3 引脚示意图

从上图可以看出,要是数码管显示数字,有两个条件:1、是要在VT端(3/8脚)加正电源;2、要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。这样才能显示的。

共阳极LED数码管的内部结构原理图:

a b c d e f g dp

VT

图4 共阳极LED数码管的内部结构原理图

共阴极LED数码管的内部结构原理图:

VT

a b c d e f g dp

图5 共阴极LED数码管的内部结构原理图

LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。

A、静态显示驱动:

静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O埠进行驱动,或者使用如BCD码二-十进位*器*进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5×8=40根I/O埠来驱动,要知道一个89S51单片机可用的I/O埠才32个呢。故实际应用时必须增加*驱动器进行驱动,增加了硬体电路的复杂性。

B、动态显示驱动:

数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp "的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那

个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。

透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。

(1)、HD7279程序

#include

sbit HD7279_DA T=P1^7; //数据线SDA

sbit HD7279_CLK=P1^6; //时钟线SCL

sbit HD7279_CS=P1^5; //片选CS,低电平有效

/******信号设置宏定义******/

#define NOSELECT7279 P5|=0x80 //片选置1,未选中

#define SELECT7279 P5&=~(0x80) //片选清0,选中

#define Set7279DA T HD7279_DA T=1 //数据线置1

#define Clr7279DA T HD7279_DA T=0 //数据线清0

#define Set7279CLK HD7279_CLK=1 //时钟线置1

#define Clr7279CLK HD7279_CLK=0 //时钟线清0

/******函数的声明******/

void Delay1ms(unsigned char T); //延时T毫秒

void Delay1s(unsigned char T); //延时T秒

void Delay1us(unsigned char T); //延时T微秒

/******仿真I2C总线时序发送一字节******/

void Send7279Byte(unsigned char ch)

{

char i;

SELECT7279; //使能HD7279A

Delay1us(50); //延时50us

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

{if(ch&0x80) //按位输出字节数据

Set7279DA T;

else

Clr7279DA T;

Set7279CLK;

ch=ch<<1; //待发数据左移

Delay1us(8);

Clr7279CLK;

Delay1us(8);

}

Clr7279DA T; //数据信号SDA清0

}

//******仿真I2C总线时序接收一字节******//

unsigned char Receive7279Byte(void)

{

unsigned char i,ch=0;

Set7279DA T; //数据信号SDA置1

Delay1us(50);

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

{Set7279CLK;

Delay1us(8);

ch=ch<<1; //接收数据左移1位

if(HD7279_DA T)

ch+=1; //接收1位数据

Clr7279CLK;

Delay1us(8);

}

Clr7279DA T; //数据信号SDA清0

return ch;

}

//******让第No位7段数码管闪烁******//

void FlashLED(unsigned char No)

{

unsigned char i;

Send7279Byte(0x88); //发送闪烁指令

i=0x01;

while(No)

{ i=i<<1; //将1移到第No位

No--;

}

Send7279Byte(~i); //0闪烁、1不闪烁

NOSELECT7279;

}

//******HD7279A左移命令******//

void MoveLeft(void)

{

Send7279Byte(0xA1); //发左移指令

NOSELECT7279;

}

//******采用不译码方式显示时数字0到F的段码******// unsigned char code BdSeg[]={

0x7e,0x30,0x6d,0x79, //0 1 2 3

0x33,0x5d,0x5f,0x70, //4 5 6 7

0x7f,0x7b,0x77,0x1f, //8 9 a b

0x4e,0x3d,0x4f,0x47, //c d e f

0x00,0x01}; //' '和'_'

//******显示指针DispBuf所指6个单元数据******//

void DispLED(unsigned char *DispBuf,unsigned char ShowDot) {

char i,ch;

ShowDot--;

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

{ch=DispBuf[i]; //取一字符

if((ch>='a')&&(ch<='f'))

{ch-='a';

ch+=0xa; //转换成数组序号

}

if((ch>='A')&&(ch<='F'))

{ch-='A';

ch+=0xa;

}

Send7279Byte(0x90+5-i); //发送显示命令及位置

if(ch==' ') //发送命令的第2字节Send7279Byte(0x00);

Else

{

if(ch=='-')

Send7279Byte(0x01);

else

{ //查表显示

if(ShowDot==i) //小数点处理

Send7279Byte(0x80|BdSeg[ch&0x0f]);

else

Send7279Byte(BdSeg[ch&0x0f]);

}

}

}

NOSELECT7279; //停止选中

}

/******读取按键值******/

unsigned char GetKeyV alue(void)

{

unsigned char KeyV alue;

if(P17==1) return -1; //无键按下

Send7279Byte(0x15); //发读键盘命令

KeyV alue=Receive7279Byte();

NOSELECT7279;

return KeyV alue;

}

//***等待按键释放,此处采用比较器硬件检测,也可以用软件延时实现***// void WaitKeyOff(void)

{

while (!(CPT1CN&0x40));

}

//******显示任意长整型数据******//

void DispV alue(unsigned long xx)

{

unsigned char buf[6];

buf[0]=(xx%1000000)/100000; //最高位

buf[1]=(xx%100000)/10000;

buf[2]=(xx%10000)/1000;

buf[3]=(xx%1000)/100;

buf[4]=(xx%100)/10;

buf[5]=(xx%10); //最低位

DispLED(buf,0); // 调用显示函数

}

//**从键盘读取6位数据,格式是HHMMSS,所读数据转换成长整型**// unsigned long InputNum(void)

{

unsigned long Num=0;

unsigned char i=0,KeyV alue,KeyV alue1;

DispLED(" -",0); //输入提示

FlashLED(0); //第一位闪烁

Delay1s(1);

while(1)

{

KeyV alue=GetKeyV alue();

if(i==6)

{

FlashLED(8); //数据输入完成,关闪烁

return Num;

}

if((KeyV alue>=0)&&(KeyV alue<=9)) //只接收十进制的0到9

{

i++;

Send7279Byte(0xC8); //发送方式1译码显示命令

Send7279Byte(KeyV alue); //发送命令第2 字节

MoveLeft(); //显示左移

Send7279Byte(0x90);

Send7279Byte(0x01);

NOSELECT7279;

WaitKeyOff();

Num*=10; //转换成十进制

Num+=KeyV alue;

}

}

}

(2)、与S—3530A有关的代码和延时函数代码

#include

#include //_crol_()循环左移头文件

//*****宏定义***** //

#define WRITE 0x00 //SMBus写命令

#define READ 0x01 //SMB读命令

//******S—3530A命令类型****** //

#define CLOCK3530_ADDRESS_RESET 0x60 //时间值复位命令,1个ACK

#define CLOCK3530_ADDRESS_STA TUS 0x62 //状态寄存器读取,2个ACK

#define CLOCK3530_ADDRESS_DA TEHOUR 0x64 //时间读取年份开始,8个ACK #define CLOCK3530_ADDRESS_HOUR 0x66 //时间读取,从小时开始,4个ACK #define CLOCK3530_ADDRESS_INT1 0x68 //中断1频率设置,3个ACK

#define CLOCK3530_ADDRESS_INT2 0x6A //中断2频率设置,3个ACK

//******SMBus状态:MT=主发送器、MR=主接收器******//

#define SMB_BUS_ERROR 0x00 //(所有模式)总线错

#define SMB_START 0x08 //(MT&MR)开始条件已发送

#define SMB_RP_START 0x10//(MT&MR)重复开始条件已发送#define SMB_MTADDACK 0x18//(MT)从地址+W已发送,收到ACK

#define SMB_MTADDNACK 0x20 //(MT)从地址+W已发送,收到NACK #define SMB_MTDBACK 0x28 //(MT)数据字节已发送,收到ACK

#define SMB_MTDBNACK 0x30 //(MT)数据字节已发送,收到NACK

#define SMB_MTARBLOST 0x38 //(MT)竞争失败

#define SMB_MRADDACK 0x40 //(MR)从地址+R已发送,收到ACK

#define SMB_MRADDNACK 0x48 //(MR)从地址+R已发送,收到NACK

#define SMB_MRDBACK 0x50 //(MR)数据字节已收到,ACK已发出

#define SMB_MRDBNACK 0x58 //(MR)数据字节已收到,NACK已发出

//******引用的全局变量声明******//

union

{

unsigned char ClockString[7];

struct RealClock

{

unsigned char Y ear,Month,Day,Week,Hour,Minute,Second;

}RT;

}RealTime; //实时时间

unsigned char xdata NowTime[7],Timer[2]; //当前时间,用于当前时间的设置unsigned char xdata Y ear,Month,Day,Week,Hour,Minute,Second;

char COMMAND; //发送的命令(从地址+R/W)

unsigned char *I2CDataBuff; //I2C总线数据缓冲区指针

unsigned char KeyV alue;

char BYTE_NUMBER; //需发送的字节数

bit SM_BUSY; //SMBus总线忙标志

unsigned char Count1ms; //延时时间(单位为毫秒)

//*****对所调用其他文件中函数的声明*****//

void Send7279Byte(unsigned char ch);

unsigned char GetkeyV alue(void);

void FlashLED(unsigned char No);

unsigned long InputNum(void);

void DispV alue(unsigned long xx);

unsigned char GetkeyV alue(void);

//*****时钟初始化*****//

void SYSCLK_Init(void)

{

int i;

OSCXCN=0x67; //外部晶振22.1184MHz

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

while(!(OSCXCN & 0x80)); //等待外部晶振稳定

OSCICN=0x88; //选择外部晶振系统时钟源,允许时钟丢失检测

}

//*****端口初始化*****//

void PORT_Init(void)

{

XBR0 = 0x07; //允许SMBus、SPI0和UART0

XBR1 = 0x00;

XBR2 = 0x44; //使能交叉开关和弱上拉

}

//*****定时器T0初始化*****//

void Timer0_Init (void)

{

CKCON|=0x8; //T0按系统时钟频率计数

TMOD|=0x1; //T0方式1

Count1ms=10; //停止T0

TR0=0;

TH0=(-SYSCLK/1000)>>8; //定时1ms的时间常数

TL0=-SYSCLK/1000;

TR0=1; //启动T0

IE|=0x2; //开T0中断

}

//*****定时器T0中断服务程序(每隔1ms中断1次)*****// void Timer0_ISR (void) interrupt 1

{

TH0=(-SYSCLK/1000)>>8; //重新装入初值

TL0=-SYSCLK/1000;

if(Count1ms) Count1ms--; //定时时间减1

}

//*****延时Tus(软件实现)*****//

void Delay1us(unsigned char T)

{

while(T)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

--T;

}

}

//*****延时Tms(定时器T0实现)*****//

void Delay1ms(unsigned char T)

{

Count1ms=T;

while(Count1ms); //在T0中断服务程序中减1

}

//*****延时Ts(定时器T0实现)*****//

void Delay1s(unsigned char T)

{

while(T)

{

Delay1ms(200);

Delay1ms(200);

Delay1ms(200);

Delay1ms(200);

Delay1ms(200);

T--;

}

}

//*****定时器T3初始化)*****//

void Timer3_Init(void)

{

TMR3RLL = 0xff; //定时25ms的时间常数

TMR3RLH = 0x69;

TMR3L = 0xff;

TMR3H = 0x69;

TMR3CN = 0x00; //清零T3溢出标志、12分频计数、禁止T3

EIE2 |=0x01; //开T3中断

TMR3CN |=0x04; //启动T3

}

//*****定时器T3中断服务程序*****//

void Timer3_ISR(void) interrupt 14

{

SM_BUSY = 0;

ENSMB=0; //ENSMB短暂清0后置1,复位SMBus

ENSMB=1;

}

//****复位S—3530A*****//

void ResetRealClock(void)

{

while(SM_BUSY) //等待SMBus空闲

SM_BUSY = 1; //置SMBus忙标志

SMB0CN = 0x44; //使能SMBus,应答类型为ACK

BYTE_NUMBER = 0; //命令字节数,1字节

COMMAND = (CLOCK3530_ADDRESS_RESET | READ);

STA=1; //开始发送

Timer3_Init(); //允许T3工作以保证通信不超时

while(SM_BUSY); //等待发送完成

TMR3CN &= 0x82; //禁止T3

}

//*****写S—3530A内部实时数据寄存器(年、月、日、星期、时、分、秒)*****//

void SetRealClock(void)

{

while(SM_BUSY);

SM_BUSY = 1;

SMB0CN = 0x44;

BYTE_NUMBER = 7; //命令字节数,8字节

COMMAND = (CLOCK3530_ADDRESS_DA TEHOUR | WRITE);

RealTime.ClockString[0]=Y ear;

RealTime.ClockString[1]=Month;

RealTime.ClockString[2]=Day;

RealTime.ClockString[4]=Hour;

RealTime.ClockString[5]=Minute;

RealTime.ClockString[6]=Second;

I2CDataBuff = &RealTime.ClockString[0]; //数据发送缓冲区

STA = 1; //开始传送

Timer3_Init();

while(SM_BUSY);

TMR3CN &= 0x82;

}

//*读S—3530A实时数据(接收数据放RealTime变量)*//

void GetRealClock(void)

{

while(SM_BUSY);

SM_BUSY = 1;

SMB0CN = 0x44;

BYTE_NUMBER = 7;

COMMAND = (CLOCK3530_ADDRESS_DA TEHOUR | READ);

I2CDataBuff = &RealTime.ClockString[0]; //数据发送缓冲区

STA = 1;

Timer3_Init();

while(SM_BUSY);

TMR3CN &=0x82;

}

//*****读S—3530A状态寄存器程序*****//

unsigned char GetRealClockStatus(void)

{

unsigned char result;

while(SM_BUSY);

SM_BUSY=1;

SMB0CN=0x44;

BYTE_NUMBER=1;

COMMAND=(CLOCK3530_ADDRESS_STA TUS|READ);

I2CDataBuff=&result; //读取结果放在result中

STA=1;

Timer3_Init();

while(SM_BUSY);

TMR3CN&=0x82;

return result;

}

//*****写状态寄存器程序,对S—3530A进行设置******//

void SetRealClockStatus(unsigned char status)

{

while(SM_BUSY);

SM_BUSY=1;

SMB0CN=0x44;

BYTE_NUMBER=1;

COMMAND=(CLOCK3530_ADDRESS_STA TUS|WRITE);

I2CDataBuff=&status; //新设置值送缓冲区

STA=1;

Timer3_Init();

while(SM_BUSY);

TMR3CN&=0x82;

}

//*****将无符号字节数高低位交换*****//

unsigned char revolve(unsigned char val)

{

char i;

unsigned char val1=0;

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

{

if(val&0x1)

val1++;

val1=_crol_(val1,1);

val=_cror_(val,1);

}

val1=_cror_(val1,1);

return val1;

}

//*****时间显示*****//

void DispTime(void)

{

int j;

GetRealClock(); //读取当前时间

Send7279Byte(0x85); //在最高位(第5位)LED显示j=(RealTime.RT.Hour>>4)&0x03; //小时高位

Send7279Byte(j);

Send7279Byte(0x84); //在第4位LED显示

j=RealTime.RT.Hour&0x0f; //小时的低位

Send7279Byte(j);

Send7279Byte(0x83); //在第3位LED显示

j=(RealTime.RT.Minute>>4)&0x0f; //分钟的高位Send7279Byte(j);

Send7279Byte(0x82); //在第2位LED显示

j=RealTime.RT.Minute&0x0f; //分钟的低位

Send7279Byte(j);

Send7279Byte(0x81); //在第1位LED显示

j=(RealTime.RT.Second>>4)&0x0f; //秒钟的高位Send7279Byte(j);

Send7279Byte(0x80); //在第0位LED显示

j=RealTime.RT.Second&0x0f; //秒钟的低位

Send7279Byte(j);

Delay1s(1);

}

//*****SMBus中断服务程序*****//

void SMBUS_ISR(void) interrupt 7

{

switch(SMB0STA) //根据SMBus不同状态码转不同分支

{

case SMB_START: //主发送器/接收器起始条件已发送

SMB0DA T=COMMAND; //z装入要访问的从器件的地址

STA=0; //手动清除START位

break;

case SMB_RP_START: //主发送器/接收器重复起始条件已发送

SMB0DA T=COMMAND;

STA=0;

break;

case SMB_MTADDACK: //主发送器从地址+W已发送,收到ACK case SMB_MTDBACK: //主发送器数据字节已发送收到ACK

if(BYTE_NUMBER) //数据字节没写完

{SMB0DA T=revolve(*I2CDataBuff); //缓冲区内容送数据寄存器

I2CDataBuff++;

BYTE_NUMBER--;

}

else{ //数据字节已写完,释放总线

STO=1;

SM_BUSY=0;

}

break;

case SMB_MTADDNACK: //主发送器从地址+W已发,收到NACK STO=1; //置位ST0+STA,重试

STA=1;

break;

case SMB_MTDBNACK: //主发送器数据字节已发送,收到NACK STO=1; //置位ST0+STA,重试

STA=1;

break;

case SMB_MTARBLOST: //主发送器竞争失败

STO=1; //不应出现,如果出现重新开始传输过程

STA=1;

break;

case SMB_MRADDACK: //主接收器从地址+R已发送,收到ACK AA=1; //在应答周期发ACK

if(!BYTE_NUMBER)

{

STO=1; //释放SMBus

SM_BUSY=0;

}

break;

case SMB_MRADDNACK: //主接收器从地址+R已发送,收到NACK STA=1;//从器件不应答,发送重复起始条件重试

break;

case SMB_MRDBACK: //收到数据字节,ACK已发送

if(BYTE_NUMBER)// 读SMB0DA T

{

*I2CDataBuff=revolve(SMB0DA T);

I2CDataBuff++;

BYTE_NUMBER--;

}

if(!BYTE_NUMBER) //最后一字节,清楚AA

AA=0;

break;

case SMB_MRDBNACK: //收到数据字节NACK已发送

STO=1; //读操作已完成发送停止条件

SM_BUSY=0; //释放SMBus

break;

default: //本例中其他状态没有意义,通信复位

STO=1;

SM_BUSY=0;

break;

}

SI=0; //清楚中断标志

}

//*****主程序*****;//

void main(void)

{

unsigned char var;

unsigned long CurrentTime=0;

WDTCN=0xde; //关看门狗

WDTCN=0xad;

SYSCLK_Init(); //初始化系统时钟

PORT_Init(); //初始化I/O口

Timer0_Init(); //初始化定时器

CPT1CN|=0x80; //使能比较器1

SM_BUSY=0;

EIE1|=0x0A; //SMBUS中断允许,PCA中断允许

ET0=1; //开定时器0中断

EA=1; //开中断

Delay1ms(25); //7279上电复位的延时时间

Send7279Byte(0xA4); //7279复位

var=GetRealClockStatus(); //读取S—3530A当前状态ResetRealClock(); //复位S—3530A

SetRealClockStatus(0xc2); //设置S—3530A状态

Do //从键盘输入时间,格式HHMMSS

{

CurrentTime=InputNum();

DispV alue(CurrentTime);

NowTime[4]=(unsigned char)((CurrentTime/100000)<<4); //时

CurrentTime=CurrentTime%100000;

NowTime[4]=NowTime[4]|(CurrentTime/10000);

CurrentTime=CurrentTime%10000;

NowTime[5]=(unsigned char)((CurrentTime/1000)<<4); //分

CurrentTime=CurrentTime%1000;

NowTime[5]=NowTime[5]|(CurrentTime/100);

CurrentTime=CurrentTime%100;

NowTime[6]=(unsigned char)((CurrentTime/10)<<4); //秒

CurrentTime=CurrentTime%10;

NowTime[6]=NowTime[6]|CurrentTime;

}

while((NowTime[4]>0x24)|(NowTime[5]>0x59)|(NowTime[6]>0x59)); Hour=NowTime[4];

Minute=NowTime[5];

Second=NowTime[6];

SetRealClock(); //键盘输入时间写入S—3530A

while(1)

{

DispTime(); //显示实时时间

KeyV alue=GetKeyV alue();

if(KeyV alue==10) //按键'A'校时、校分、校秒{

do

{

CurrentTime=InputNum();

DispV alue(CurrentTime);

NowTime[4]=(unsigned char)((CurrentTime/100000)<<4);

CurrentTime=CurrentTime%100000;

NowTime[4]=NowTime[4]|(CurrentTime/10000);

CurrentTime=CurrentTime%10000;

NowTime[5]=(unsigned char)((CurrentTime/1000)<<4);

CurrentTime=CurrentTime%1000;

NowTime[5]=NowTime[5]|(CurrentTime/100);

CurrentTime=CurrentTime%100;

NowTime[6]=(unsigned char)((CurrentTime/10)<<4);

CurrentTime=CurrentTime%10;

NowTime[6]=NowTime[6]|CurrentTime;

}

while((NowTime[4]>0x24)|(NowTime[5]>0x59)|(NowTime[6]>0x59));

Hour=NowTime[4];

Minute=NowTime[5];

Second=NowTime[6];

SetRealClock();

}

if(KeyV alue==11) //按键'B'定时

{do

{

CurrentTime=InputNum();

DispV alue(CurrentTime);

Timer[0]=(unsigned char)((CurrentTime/100000)<<4);

CurrentTime=CurrentTime%100000;

Timer[0]=Timer[0]|(CurrentTime/10000);

CurrentTime=CurrentTime%10000;

Timer[1]=(unsigned char)((CurrentTime/1000)<<4);

CurrentTime=CurrentTime%1000;

Timer[1]=Timer[1]|(CurrentTime/100);

CurrentTime=CurrentTime%100;

}while((Timer[0]>0x24)|(Timer[1]>0x59));

if(Timer[0]>0x11)

Timer[0]=Timer[0]|0x80;

}

if((RealTime.ClockString[4]==Timer[0])&&(RealTime.ClockString[5]==Timer[1])) {P31=0;Delay1ms(30);P31=1;}

if(RealTime.ClockString[5]==0) //整点报时,报时时间长为1分钟

{P30=0;Delay1ms(50);P30=1;} //LED闪烁报时

}

}

五、调试结果

1、通过编译、链接、下载,LED显示管能够正常显示时、分、秒,时钟可以从00:00:00到23:59:59然后再到00:00:00。

2、按A键,能通过键盘输入当前时间,并从该时间开始计时,可以正常校时,校分。

3、当时间到**:59:55时LED显示管开始闪烁进行整点报时,闪烁一分钟。

4、在键盘上按B键,在从键盘键入想要设定的闹钟时间。当时钟时间运行到设定的闹钟时间时,LED显示管连续闪烁一分钟进行闹钟。

六、心得体会

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

#include #define uchar unsigned char #define uint unsigned int //----端口定义--- sbit ACC_7=ACC^7; sbit RST1=P2^5; sbit IO=P2^6; sbit SCLK=P2^7; sbit k1=P3^2; sbit k2=P3^3; sbit k3=P2^2; sbit k4=P2^3; //uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 数码的位选,左到右 uchar tab_1302[7]={45,50,11,19,1,1,15}; uchar tab_time[8]={0,0,10,0,0,10,0,0}; //时间 uchar tab_day[8]={0,0,10,0,0,10,0,0,}; //年月日 uchar tab_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //0 1 2 3 4 5 6 7 8 9 - {"0123456789-"} ////////////=============函数声明============//////////////// void display_time(); void delayms(uint); void display_day(); void ds1302(); //获取DS1302的时间 void ds1302_init(); //DS1302的初始化 void write1302(uchar,uchar); //指定地址向DS1302写数据 uchar read1302(uchar); //指定地址向DS1302读数据 void ds1302(); void int0_init(); /////////=======中断初始化=======/////////// void int0_init() { EX0=1;

显示年历C课程设计报告

目录 一、设计任务,目的与要求.............................错误!未指定书签。 1.设计内容: ................................................错误!未指定书签。 2.设计目的: ................................................错误!未指定书签。 3.设计要求: ................................................错误!未指定书签。 二、概要设计 .....................................................错误!未指定书签。 1.需求分析: ................................................错误!未指定书签。 2.设计流程: (3) 1设计要求:...........................................错误!未指定书签。 2总体设计:...........................................错误!未指定书签。 三、运行结果及分析.........................................错误!未指定书签。 1.程序运行测试: ........................................错误!未指定书签。 2.进入程序菜单: ........................................错误!未指定书签。 3.1号键功能: .............................................错误!未指定书签。 3.2号键功能: .............................................错误!未指定书签。 4.3号键功能: .............................................错误!未指定书签。 5.0号键功能: .............................................错误!未指定书签。 四、源代码 (6) 一、设计任务,目的与要求 1.设计内容: 年历显示功能要求:

简单51单片机数字时钟设计

题目:简单51单片机数字时钟设计 院系: 物理与电气工程学院 专业:自动化专业 班级:10级自动化 姓名:苏吉振 学号:2 老师:李艾华

引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。 目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS 化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。 单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。 单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。 数字钟是采用数字电路实现对时,分,秒数字显示的计时装置,广泛用于个 人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

最全最好的课程设计-51单片机电子日历时钟( 含源程序)

LED日历时钟课程设计 院系: 班级: 姓名: 学号: 指导教师: 2012 年06 月16 日

目录

摘要 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习、应用,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达学习、设计、开发软、硬件的能力。 第一章前言 数字电子钟具有走时准确,一钟多用等特点,在生活中已经得到广泛的应用。虽然现在市场上已有现成的电子钟集成电路芯片,价格便宜、使用也方便,但是人们对电子产品的应用要求越来越高,数字钟不但可以显示当前的时间,而且可以显示期、农历、以及星期等,给人们的生活带来了方便。另外数字钟还具备秒表和闹钟的功能,且闹钟铃声可自选,使一款电子钟具备了多媒体的色彩。单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。 时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。 AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k B ytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

基于单片机的电子日历

设计任务书 设计题目: 电子万年历 设计要求:显示范围:2001-2099;日月正常显示,并能识别闰年闰月;时间采用24 小时制。显示格式:日期按照年月日排列,如2006 年12 月20 日显示为:20061220;时间按时分秒排列,如 12 点 30 分 55 秒显示为 12:30:55。 显示位数:16位 7段 LED数码管作正常显示和节电显示。

目录 摘要 (1) 前言 (2) 1概论 (3) 1.1概述 (3) 1.2单片机的发展历程 (3) 1.3时钟日历的特性 (3) 2系统原理与硬件设计 (5) 2.1硬件选择 (5) 2.2AT89C51 单片机简介 (6) 2.3时钟芯片介绍 (12) 2.4LED 简介 (18) 2.574LS154 简介 (20) 2.6ULN2003 简介 (20) 3软件设计 (22) 3.1主程序 (22) 3.2读取时间的子程序 (24) 3.3显示刷新子程序 (27) 4调试过程及数据分析 (30) 4.1硬件调试 (30) 4.2软件调试 (30) 4.3K EI L 调试 (31) 4.4试验箱调试 (31) 结论 (32) 致谢 (33) 参考文献 (34)

附录 A: (35)

摘要 本次设计采用时钟日历芯片 DS12887,这种时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新在计算机汇编语言的驱动下每秒自动进行一次,但不需程序干预其输出状态。此外,这种时钟芯片带有锂电池做后备电源,具备永不停止的计时功能和可编程方波输出功能,可用作实时测控系统的采样信号等。这种时钟芯片内部还带有非易失性RAM,可用来存放需长期保存但有时也需变更的数据。本次设计中的LED 数码管电子时钟电路采用24 小时制记时方式,日期和时间用16 位数码管显示。设计采用 AT98C51单片机,使用 5V电源供电,并且在按键的作用下可以进入省电(不显示LED 数码管)和正常显示两种状态。 本次设计采用AT89C51单片机的扩展芯片和UNL2003芯片做驱动,由多块LED数码管构成的显示系统,与传统的基于8/16位普通单片机的LED显示系统相比较,本系统在不显著地增加系统成本的情况下,可支持更多的LED数码管稳定显示。 关键词:时钟芯片、AT89C51、时钟日历

基于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硬件电路设计

电子时钟单片机【完整版】

烟台南山学院 单片机课程设计题目电子时钟 姓名: 所在学院 所学专业: 班级: 学号: 指导教师: 完成时间:

随时代的发展,生活节奏的加快,人们的时间观念愈来愈强;随自动化、智能化技术的发展,机电产品的智能度愈来愈高,用到时间提示、定时控制的地方也会愈来愈多,因此,设计开发数字时钟具有良好的应用前景。 由于单片机价格的低成本、高性能,在自动控制产品中得到了广泛的应用。本设计利用Atmel公司的AT89S52单片机对电子时钟进行开发,设计了实现所需功能的硬件电路,应用汇编语言进行软件编程,并用实验板进行演示、验证。 在介绍本单片机的发展情况基础上,说明了本设计实现的功能,以及实验板硬件情况,并对各功能电路进行了分析。主要工作放在软件编程上,用实验板实现时间、日期、定时及它们的设定功能,详细对软件编程流程以及调试进行了说明,并对计时误差进行了分析及校正,提出了定时音与显示相冲突问题及解决方案。实验证明效果良好,可以投入使用。 本次仿真设计的目的就是让同学们在理论学习的基础上,通过完成一个涉及MCS—51单片机都种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排版调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。在本学期的开始我们进行了计算机工程实践,在实践中我们以微机原理与接口技术课程中所学知识为基础,设计了电子时钟系统。本系统为多功能数字钟的系统。本设计以单片机AT89c51为控制核心,选用DS1302串行时钟芯片,RT1602液晶显示器实现液晶显示当前时间、日期、星期。本电子时钟具有日期、时、分、秒的显示、调整功能,采用的时间制式为24小时制,时间显示格式为时(十位、个位)、分(十位、个位)、秒(十位、个位)。 关键词:单片机 AT89S52 电子时钟汇编语言

本科毕业设计--基于51单片机的电子日历设计

成都电子机械高等专科学校成教院毕业设计(论文) 论文题目:基于51单片机的电子日历设计 教学点:重庆科创职业学院 指导老师:张忠雨职称:讲师 学生姓名:聂燕学号: 2011700558 专业:应用电子技术 成都电子机械高等专科学校成教院制 2012 年 3 月 9 日

成都电子机械高等专科学校成教院毕业设计(论文)任务书 题目:基于51单片机的电子日历设计 任务与要求: 通过单片机设计电子日历数码管正常显示阳历、阴历日期,显示的格式为年-月-日,利用外部按键的操作实现阳历和阴历之间的 转换,实现阴历和阳历显示的暂停、运行等功能。 时间:2011年12月15日至2012 年3月15日共12 周教学点:重庆科创职业学院 学生姓名:聂燕学号:2011700558 专业:应用电子技术 指导单位或教研室: 指导教师:张忠雨职称:讲师 成都电子机械高等专科学校成教院制

毕业设计(论文)进度计划表

摘要 设计以单片机AT89C51为核心部件的电子日历,利用74LS245作为驱动器,74LS138作为译码器使用,六个七段数码管均采用共阴极的方式,P0口作为段选码输出口,P2口作为位选码输出口。 本次设计的题目是基于单片机的电子日历设计,可以正常的显示年、月、日,还可以利用外部按键实现阴历和阳历之间的转换以及暂停等功能。电子日历具有性能稳定、精确度高、成本低、易于产品化,以及方便、实用等特点。适用于家庭、公司、机关等众多场所。为人们的日常生活、出行安排提供了方便,成为人们日常生活中不可缺少的一部分。 本次设计可分为两部分:硬件系统、软件系统。 硬件系统包括:AT89S51单片机、74LS245驱动器、74LS138译码器、RC复位电路、+5V直流电源电路、去抖电路、动态显示扫描电路。 软件系统主要有单片机的编程构成。 关键词:单片机,日历,位码,段码,显示

c语言课程设计报告--万年历,最详细

C语言课程设计报告 -----万年历 设计人:贾伟涛 学号:2013010912 班级:13电信应电班 指导老师:张伟 日期:2014年6月9日

内容提要 通过大一下学期对C语言的学习,了解到了很多C语言的相关知识。学习的过程虽然有很多困惑,但是当自己能够独立的看懂和独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。我虽然可以看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对c语言的兴趣。 C语言是近年在国内外得到迅速推广应用的一种机器语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写各种软件。 在这次的课程设计中我将把日常生活中最经常接触的——日历的查询,利用C语言的程序编成一个简单的万年历查询系统。通过这个小小的系统可以实现很多功能。在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。在不断的调试中最终才获得最为完整的程序。接下来就是我的C语言课程设计的具体内容来了,大家拭目以待吧!

目录 一、系统功能和数据说明----------------------- 二、问题分析--------------------------------- 三、程序总体设计及功能结构框图--------------- 四、程序流程图------------------------------- 五、源程序代码------------------------------- 六、使用说明--------------------------------- 七、个人心得--------------------------------- 八、参考文献---------------------------------

基于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();

基于stc51单片机的LCD1602显示时间_的电子万年历(显示当前温度)

1 课设所需软件简介 1.1 Keil uVision4的简要介绍 2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。新版本支持更多最新的ARM芯片,还添加了一些其他新功能。 2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。 Keil C51开发系统基本知识Keil C51开发系统基本知识 1. 系统概述 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。 2. Keil C51单片机软件开发系统的整体结构 C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

单片机课程设计 电子日历时钟显示器设计

目录 1.题目设计要求 (1) 2.开发平台简介 (1) 3.系统硬件设计 (2) 3.1设计原理 (2) 3.2器件的功能与作用 (2) 3.2.1 MCS51单片机AT89C51 (2) 3.2.2复位电路 (3) 3.2.3晶振电路 (4) 3.2.4 DS1302时钟模块 (4) 3.2.5 引脚功能及结构 (4) 3.2.6 DS1302的控制字节 (5) 3.2.7 数据输入输出(I/O) (5) 3.2.8 DS1302的寄存器 (6) 3.2.9 液晶显示LCD1602 (6) 3.2.10 串行时钟日历片DS1302 (8) 4.系统软件设计 (10) 4.1程序流程 (10) 4.2程序代码 (10) 5.系统仿真调试 (20) 5.1仿真原理图设计 (20) 5.2仿真运行过程 (21) 5.3仿真运行结果 (21) 6.总结 (21) 7.参考文献 (22)

1.题目设计要求 通过串行日历时钟芯片DS1302生成当前日期和是时间,通过IO口传输到AT89c52芯片中,然后再将AT89c52接收到的数据输出到LCD上。要求LCD上显示的日期和时间与当前系统时间保持一致。 2.开发平台简介 2.1系统仿真平台Proteus Proteus软件是由英国Labcenter Electronics公司开发的EDA工具软件,已有近20年的历史,在全球得到了广泛应用。Proteus软件的功能强大,它集电路设计、制版及仿真等多种功能于一身,不仅能够对电工、电子技术学科涉及的电路进行设计,还能够对微处理器进行设计和仿真,并且功能齐全,界面多彩。和我们手头其他的电路设计仿真软件,他最大的不同即它的功能不是单一的。另外,它独特的单片机仿真功能是任何其他仿真软件都不具备的。 2.2软件开发平台Keil C Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。Keil C51生成的目标代码效率之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

简易日历课程设计报告(VB)

简易日历设计报告 学院班级学号姓名成绩 一、设计思路 1.要达到的目的 ①能够窗体加载自动提取并显示当前日期。 ②能够选择1960-2060之间的任一年份。 ③选择某一日期后,添加边框。 ④在窗体下方显示所选择的日期及其星期。 ⑤单击确定或“Enter”后显示所选日期。 ⑥单击“退出”或单击“Esc”键退出关闭窗。 ⑦根据所选年份和月份,确定显示天数的个数。 ⑧日期和星期对齐。 ⑨在日历提示一些固定节假日。 ⑩判断生肖,并用图片的形式显示出来。 2.关键问题的解决 ①利用数组向下拉列表框中填充项目,调整标签显示数据。 ②利用时间函数取得当前日期和星期,并显示在文本框中,根据日期调整列表框种显示的项目。 ③选择某一标签后,改变其边框,其他标签无边框。 ④单击项目时从下拉列表框中取得与月份和年份对应的值储存在变量中,单击标签取得日期数值,按 下确定。按钮将其合并为日期,利用函数计算星期,调整格式显示在文本框中。 ⑤选择月份和年份后,于28,29,30,31组合并调整为日期格式,与日期型匹配,看是否存在。 ⑥根据某天是否存在更改标签隐藏属性。 ⑦根据星期数移动数组调整标签caption属性,使星期与日期对齐。 ⑧将节日与其提示信息存在文本中,当当前日期与文件中相同时,用消息提示框显示提示信息。 ⑨利用图片加载,实现生肖判断。

二、模块之间的调用关系,或程序流程图 Form load Command2 Fillcbomonth 三、部分程序关键源代码及注释 Dim day1 As Integer Private Sub Cbomonth_Click() Labeldate.Caption = "" Labeljr.Caption = "" Labelweek = "" 注释:仅有月份的变化不足以计算出星期,故使labelweek为空Call setday Call lblnumber_Click(selectedate - 1) End Sub Private Sub Cboyear_Click() Labeldate.Caption = "" Labelweek.Caption = "" Labeljr.Caption = "" 注释:仅有年份的变化不足以计算出星期,故使labelweek为空 Call Cbomonth_Click End Sub Private Sub Command1_Click() Dim month1 As Integer, year1 As Integer, date1 As String month1 = cbomonth.ListIndex + 1 year1 = Cboyear.ListIndex + 1960 day1 = CInt(Format(Now, "dd")) date1 = (Str(month1) + "/" + Str(day1) + "/" + Str(year1)) yanzheng = Str(year1) + "年" + Str$(month1) + "月" + Str(day1) + "日" If yanzheng <> Labeldate.Caption Then Labeldate.Caption = "" Labeljr.Caption = "" End If

51单片机电子时钟设计报告

电子时钟实验报告 全部代码在文档末尾:51单片机,LCD1602液晶显示屏平台下编程实现,可直接编译运行 目录: 一,实验目的 (1) 二,实验要求 (2) 三,实验基本原理 (2) 四,实验设计分析 (2) 五,实验要求实现 (3) A.电路设计 (3) 1. 整体设计 (3) 2. 分块设计 (4) 2.1 输入部分 (4) 2.2 输出部分 (5) 2.3 晶振与复位电路 (5) B.程序设计 (6) B.1 程序总体设计 (6) B.2 程序主要模块 (6) 五.实验总结及感想 (8) 一,实验目的 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以电子钟是以其小巧,价格低廉,走时精度高,使用方便,

功能多,便于集成化而受广大消费的喜爱,得到了广泛的使用。 1. 学习8051定时器时间计时处理、按键扫描及LCD液晶显示的设计方法。 2. 设计任务及要求利用实验平台上LCD1602液晶显示屏,设计带有闹铃功能的数字时钟 二,实验要求 A.基本要求: 1. 在LCD1602液晶显示屏上显示当前日期,时间。 2. 利用按键可对时间及闹玲进行设置,并可显示设置闹玲的时间。闹玲时间到蜂鸣器发出 声响,一分钟后闹铃停止。 B.扩展部分: 1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整)实现年月日时分秒的调整,星期准确的随着日期改变而改变进行显示。 2.定时功能(设定一段时间长度,定时到后,闹铃提示) C.可扩展部分: 1.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调) 2.可进行备忘录提示,按照年月日,可在设定的某年某月进行闹铃提示。 三,实验基本原理 利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.05s中断一次并当作一个计数,设定定时1秒的中断计数初值为20,每中断一次中断计数初值加1,当减到20时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了,是否一天到了,是否一个月到了,是否一年到了。 将时间在LCD液晶屏上显示,降低了程序的编写难度。LCD的固定显示特性是我们省去了数码管的动态扫描显示。 四,实验设计分析 针对要实现的功能,采用AT89S52单片机进行设计,AT89S52 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结

基于单片机及时钟芯片DS1302的电子时钟设计

目录 摘要 一、引言 (1) 二、硬件电路设计 (2) 2.1 主要芯片 (2) 2.1.1 微处理器 (2) 2.1.2 DS1302简介 (4) 2.1.3 DS1302引脚说明 (5) 2.1.4 74ls245简介及引脚说明 (5) 2.2 时钟硬件电路设计 (6) 2.2.1 时钟电路设计 (7) 2.2.2 整点报时功能 (8) 2.2.3 硬件原理图 (9) 三、proteus和keil软件仿真及调试 (9) 3.1 电路的仿真 (9) 3.2 软件调试 (9) 四、C语言程序 (10) 五、参考文献 (13)

电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。 本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。 本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。 关键词:电子钟;多功能;AT89C52;时钟芯片

一、引言 时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。 1.1 多功能电子时钟研究的背景和意义 20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂容易使人忘记当前的时间。然而遇到重大事情的时候,一旦忘记时间,就会给自己或他人造成很大麻烦。平时我们要求上班准时,约会或召开会议必然要提及时间;火车要准点到达,航班要准点起飞;工业生产中,很多环节都需要用时间来确定工序替换时刻。所以说能随时准确的知道时间并利用时间,是我们生活和工作中必不可少的[1]。 电子钟是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛应用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、0按时自动打铃、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

毕业设计:基于单片机的电子日历时钟

一课程设计题目:电子日历时钟 二实现的功能: 基本功能: (1)显示北京时间,并且能够校准时间; (2)程序使用汇编语言; (3)显示的时、分、秒之间以及年、月、日间以小数点分隔;(4)显示公历日期,并且能够校准日期; 发挥功能: (5)运动秒表; (6)闹钟功能; (7)自动整点报时。 三课程设计的目的: 课程标志性内容的设计理解和综合运用,对所学内容进行一次实操,学以致用。 四、设计方案说明 1、硬件部分 (1)采用6位LED数码管显示日期或者时间。 (2)显示器的驱动采用“动态扫描驱动”,且采用“一键多用”的设计方案,系统电路大为简化。使用小数点表示闹 钟设置状态; (3)电路连接使用PCB,使电路连接简洁美观

2、软件部分 (1)“时钟”基准时间由单片机内部的定时中断提供,考虑因素:定时时间是“秒”的整除数,且长短适宜。最长不 能超过16位定时器的最长定时时间;最短不能少于中断服 务程序的执行时间。基准时间越短,越有利于提高时钟的 运行精确度。基准时间定为0.05秒。 (2)用一个计数器对定时中断的次数进行计数,由基准时间为0.05秒知计数值为20即可实现实现“秒”定时,同理 进行“分”﹑“时”定时,以及“日”﹑“月”﹑“年” 定时。 (3)LED 数码管显示器采用“动态扫描驱动”考虑问题:驱动信号的维持时间必须大于“起辉时间”(电流大起辉时间 短),而驱动信号的间歇时间必须小于“余辉时间”(电流 大余辉时间长),但驱动电流大小受硬件电路能力和LED 数码管极限功耗的制约。 (4)动态扫描显示方式在更新显示内容时,考虑到因LED数码管余辉的存在可能会造成显示字符的模糊,所以新内容 写入显示器之前将所有的LED数码管熄灭。 (5)关于自动识别“月大﹑月小”和“平年﹑润年”问题的考虑 a)月大和月小 2月另外计算;

Java万年历课程设计报告

Java课程设计 设计题目:万年历 系别:计算机科学与工程学院 专业:信息管理与信息系统 学号: 1100340116 姓名:岑少兵 指导教师:汪华澄 时间: 2013-6-29

目录 摘要 (3) 系统功能结构图 (3) 1 系统模块设计 (4) 1.1 需求设计 (4) 1.2 开发和运行环境 (4) 1.3 功能设计 (4) 2 万年历详细设计思路 (4) 2.1 程序设计思路 (5) 2.2 程序运行主界面 (5) 2.3 流程图 (6) 3 各模块功能实现及代码说明 (6) 3.1 MainFramel类 (6) 3.2 Lunar类 (14) 3.3 national类 (22) 3.4 SetClock类 (26) 4 小结 (34) 5 参考文献 (34)

基于Myeclipse的万年历 摘要:万年历是日常生活中不可或缺的小工具,用万年历我们可以准确地查到当前,以后或是过去的日期,极大地方便了我们的生活。在万年历上添加了显示本地时间以后会更加准确地显示时间。无论是对于我们学生还是上班族或是自由职业者需要经常查看和查找万年历来规划自己将要做得一些事情,或是回忆在过去的时间里已经做过的事情,使之更加有利于提升我们的学习或是工作进度。 系统功能结构图:主要描述系统要实现的各个模块的功能。

1系统模块设计 1.1需求分析 本程序的要求为:1.使用图形用户界面 2.能够实现日期与星期的查询 3.能够显示农历 4.能够查看世界时间 5.能够添加闹钟 1.2 开发和运行环境 开发工具:Myeclipse 运行环境: windows 7 1.3功能设计 本程序要构建的万年历程序,其功能有以下几个方面: (1)通过 (2)提供年份、月份的下拉形式菜单来选择年份和月份。 (3)通过Lunar类实现农历日期。 (4)通过national类实现世界时间。 (5)能以月历形式显示日期与星期。 (6)通过SetClock类来实现闹钟功能。 (7)通过点击世界时间按钮查询世界时间 (8)通过点击闹钟按钮设置闹钟 (9)显示系统当前时间和日期。 (10)显示作者信息。 2万年历详细设计思路 2.1程序设计思路 1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数S=1,

51单片机的电子时钟设计

基于51单片机的电子时钟设计 摘要:本文介绍了基于51单片机的电子时钟的设计,从硬件和软件两个方面给出了具体实现过程。该时钟的设计采用功能分块的思想方法,将硬件电路划分为开关电路,显示驱动电路和数码管电路等若干独立模块,而软件的实现则由闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等组成。文中给出了各个模块的电路图,并用Proteus的ISIS软件对电子时钟系统的各个功能进行了仿真,并给出了相应的仿真结果图像。 关键词:单片机;电子时钟;键盘控制 Electronic Clock Design Based on 51 Single-chip *** Shandong Institute of Business and Technology , 264005 Abstract:This paper introduces the electronic clock design based on 51 single-chip microcomputer, and it provides us specific implementation process from aspects of hardware and software. This clock is designed by the method of function blocks. In hardware, it’s circuit is divided into switch block, display drive block and digital control block. However, the software consist of the program of alarm clock, time display, date display, stopwatch display, time adjust, timing adjustment, the alarm clock adjustment, time delay and so on. Circuit diagrams of each module is also given and the corresponding simulation image of this clock produced by software of Proteus is also showed in this paper. Key words:single chip microcomputer; electronic clock;Keyboard control 一,引言 1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,

相关主题