可以显示温度的万年历程序(已在PD1000开发板上运行)

可以显示温度的万年历程序(已在PD1000开发板上运行)
可以显示温度的万年历程序(已在PD1000开发板上运行)

//1602+18b20+ds1302程序

// 程序名称:1602+18b20+ds1302程序

// 实验目的:综合应用lcd1602,ds18b20,ds1302

// 连接方法:将LCD1602液晶屏插到J9端子上引脚朝下

// JP8与JP5 用8p排线连接

// 描述:液晶显示当前时间(可调整),温度(精度可调)

// K1设置键 K2递增键 K3递减键

// 版本:PD1000开发板

// 作者:青岛普爱特

// 日期:2011.02.28

//注:(1):主芯片STC89C52RD 使用12M晶振

// (2):Keil uV3 3.30编译运行通过

// (3):本例程在 PD1000 开发板平台上成功运行通过

// (4):青岛普爱特版权所有,只供学习参考,不得应用于商业用途.

// (5):公司网站:https://www.360docs.net/doc/533675689.html, 淘宝网店:https://www.360docs.net/doc/533675689.html,

#include

#include

#include

#define uchar unsigned char

//功能引脚定义

sbit set= P1^0; //设置调整按键

sbit up = P1^1; //加键

sbit down =P1^2; //减键

sbit LCM_RS= P2^5; //l602定义引脚

sbit LCM_RW= P2^6;

sbit LCM_E =P2^7;

#define LCM_Data P0

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

uchar id,timecount,dipsmodid;

bit lmcinit_or_not; //是否需要清屏标志位“1”为需要“0”为不需要

bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志void Disp_line1(void); //显示屏幕第一行

void Disp_line2(void); //显示屏幕第二行

void id_case1_key();

void Disp_mod0(void);

//*********** DS1302 时间显示定义部分

sbit T_IO =P3^4;

sbit T_RST=P3^5;

sbit T_CLK=P3^6;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

void Set(uchar,uchar); //根据选择调整相应项目

void RTInputByte(uchar); /* 输入 1Byte */

uchar RTOutputByte(void); /* 输出 1Byte */

void W1302(uchar, uchar); // 向DS1302写入一个字节

uchar R1302(uchar); // 从DS1302读出一个字节

void Set1302(unsigned char * ); // 设置时间

bit sec,min,hour,year,mon,day,weekk; //闪烁标志位

//初始化后设置为:11年02月28日星期1 08点11分59秒

unsigned char inittime[7]={0x59,0x11,0x08,0x28,0x02,0x11,0x01};

// 秒分钟小时日月年星期

//***** 18B20温度显示定义部

sbit DQ=P3^7; //18B20 接P3.7口

typedef unsigned char byte;

typedef unsigned int word;

Read_Temperature(char,char);

void mychar(void);

byte ow_reset(void);

byte read_byte(void);

void write_byte(char val);

void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应 // 0.5, 0.25, 0.125

//******* 1602LCD驱动 ********************************************************** void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC);

unsigned char ReadStatusLCM(void);

void LCMInit(void);

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void);

void Delay400Ms(void);

unsigned char code week[]={"Week."};

void main(void)

{

Delay400Ms(); //启动等待,等LCM讲入工作状态

LCMInit(); //LCM初始化

Delay5Ms(); //延时片刻(可不要)

mychar();

TMOD=0x01;

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

EA=1;

TR0=1;

ET0=1;

W1302(0x90,0xa5);

W1302(0x8e,0x80); //写保护,禁止写操作

adjust_res(0x5f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125

while(1)

{

Disp_mod0(); //温度时间显示界面

}

}

//显示时间界面

void Disp_mod0(void)

{

if(lmcinit_or_not==1)

{LCMInit();

lmcinit_or_not=0;

}

if ((up|down)==0) //初始化

{

Delay5Ms();

if ((up|down)==0) Set1302(inittime);

}

if (set==0) // 设置和选择项目键

{

Delay5Ms();

if(set==0){id++;if(id>7) id=0;}

while(set==0);

}

switch(id)

{

case 0:

sec=0;

Disp_line1(); Disp_line2();

break;

case 1://年

year=1;

Disp_line1(); Disp_line2(); id_case1_key();

break;

case 2://月

year=0;mon=1;

Disp_line1(); Disp_line2(); id_case1_key();

break;

case 3://日

mon=0;day=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 4://星期

day=0;weekk=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 5://小时

weekk=0;hour=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 6://分钟

hour=0;min=1;

Disp_line1(); Disp_line2();

id_case1_key();

break;

case 7://秒

min=0;sec=1;

Disp_line1(); Disp_line2(); id_case1_key();

break;

}

}

//中断入口,冒号闪烁

void t0(void) interrupt 1 using 0

{

TH0=(65535-50000)/256; //50ms定时

TL0=(65535-50000)%256;

timecount++;

if(timecount>9)

{

timecount=0;

flag=~flag;

}

}

//id为1时的下一级选择

void id_case1_key()

{

if (up==0) //增加

{

Delay5Ms();

if(up==0) Set(id,0);

if(id!=7) while(up==0);

}

if (down==0) //减少

{

Delay5Ms();

if(down==0) Set(id,1);

if(id!=7) while(down==0);

}

}

//根据选择调整相应项目并写入DS1302

void Set(uchar sel,uchar sel_1)

{

signed char address,item;

signed char max,mini;

if(sel==7) {address=0x80; max=0;mini=0;} //秒

if(sel==6) {address=0x82; max=59;mini=0;} //分钟

if(sel==5) {address=0x84; max=23;mini=0;} //小时

if(sel==3) {address=0x86; max=31;mini=1;} //日

if(sel==2) {address=0x88; max=12;mini=1;} //月

if(sel==1) {address=0x8c; max=99;mini=0;} //年

if(sel==4) {address=0x8a; max=7; mini=1;} //星期

item=R1302(address+1)/16*10+R1302(address+1)%16;

if (sel_1==0) item++; else item--;

if(item>max) item=mini;

if(item

W1302(0x8e,0x00); //允许写操作

W1302(address,item/10*16+item%10);

W1302(0x8e,0x80); //写保护,禁止写操作

}

//屏幕显示第一行时间和温度void Disp_line1(void)

{

Read_Temperature(10,0); //温度显示

//冒号闪烁

if(flag==0)

{DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);}

else

{DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}

if(sec==1) //秒闪烁标志位

{

if(flag==1)

{

DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒

DisplayOneChar(8,0,R1302(0x81)%16+0x30);

}

else

{

DisplayOneChar(7,0,0x20); //显示秒

DisplayOneChar(8,0,0x20);

}

}

else

{

DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒

DisplayOneChar(8,0,R1302(0x81)%16+0x30);

}

if(min==1) //分钟闪烁标志位

{

if(flag==1)

{

DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟 DisplayOneChar(5,0,R1302(0x83)%16+0x30); }

else

{

DisplayOneChar(4,0,0x20); //显示分钟 DisplayOneChar(5,0,0x20);

}

}

else

{

DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟

DisplayOneChar(5,0,R1302(0x83)%16+0x30);

}

if(hour==1) //小时闪烁标志位

{

if(flag==1)

{

DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时 DisplayOneChar(2,0,R1302(0x85)%16+0x30);

}

else

{

DisplayOneChar(1,0,0x20); //显示小时

DisplayOneChar(2,0,0x20);

}

}

else

{

DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时 DisplayOneChar(2,0,R1302(0x85)%16+0x30);

}

}

// 屏幕显示第二行日期和星期

void Disp_line2(void)

{

DisplayOneChar(3,1,0x2f); //显示固定字符

DisplayOneChar(6,1,0x2f);

DisplayListChar(10,1,week);

if(year==1) //年闪烁标志位

{

if(flag==1)

{

DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年 DisplayOneChar(2,1,R1302(0x8d)%16+0x30);

}

else

{

DisplayOneChar(1,1,0x20); //显示年

DisplayOneChar(2,1,0x20);

}

}

else

{

DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年 DisplayOneChar(2,1,R1302(0x8d)%16+0x30);

}

if(mon==1) //月闪烁标志位

{

if(flag==1)

{

DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月 DisplayOneChar(5,1,R1302(0x89)%16+0x30);

}

else

{

DisplayOneChar(4,1,0x20); //显示月

DisplayOneChar(5,1,0x20);

}

}

else

{

DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月

DisplayOneChar(5,1,R1302(0x89)%16+0x30);

}

if(day==1) //日闪烁标志位

{

if(flag==1)

{

DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日

DisplayOneChar(8,1,R1302(0x87)%16+0x30);

}

else

{

DisplayOneChar(7,1,0x20); //显示日

DisplayOneChar(8,1,0x20);

}

}

else

{

DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日

DisplayOneChar(8,1,R1302(0x87)%16+0x30);

}

if(weekk==1) //星期闪烁标志位

{

if(flag==1)

{

DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期 }

else

{

DisplayOneChar(15,1,0x20); //显示星期

}

}

else

{

DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期

}

}

//********* LCM1602驱动程序 ***************

//写数据

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //检测忙

LCM_Data = WDLCM;

LCM_RS = 1;

LCM_RW = 0;

LCM_E = 0; //若晶振速度太高可以在这后加小的延时

LCM_E = 0; //延时

LCM_E = 1;

}

//写指令

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{

if (BuysC) ReadStatusLCM(); //根据需要检测忙

LCM_Data = WCLCM;

LCM_RS = 0;

LCM_RW = 0;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

}

//读状态

unsigned char ReadStatusLCM(void)

{

LCM_Data = 0xFF;

LCM_RS = 0;

LCM_RW = 1;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

while (LCM_Data & Busy); //检测忙信号

return(LCM_Data);

}

//LCM初始化

void LCMInit(void)

{

LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1); //关闭显示

WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); // 显示光标移动设置

WriteCommandLCM(0x0C,1); // 显示开及光标设置

}

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;

X |= 0x80; //算出指令码

WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码

WriteDataLCM(DData);

}

//按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {

unsigned char ListLength,j;

ListLength = strlen(DData);

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

if (X <= 0xF) //X坐标应小于0xF

{

for(j=0;j

{

DisplayOneChar(X, Y, DData[j]); //显示单个字符

X++;

}

}

}

//5ms延时

void Delay5Ms(void)

{

unsigned int TempCyc = 5552;

while(TempCyc--);

}

//400ms延时

void Delay400Ms(void)

{

unsigned char TempCycA = 5;

unsigned int TempCycB;

while(TempCycA--)

{

TempCycB=7269;

while(TempCycB--);

};

}

/********DS1302读写程序**************/

/********************************************************************

函数名:RTInputByte()

功能:实时时钟写入一字节

说明:往DS1302写入1Byte数据 (内部函数)

入口参数:d 写入的数据

返回值:无

***********************************************************************/ void RTInputByte(uchar d)

{

uchar i;

ACC = d;

for(i=8; i>0; i--)

{

T_IO = ACC0; /*相当于汇编中的 RRC */

T_CLK = 1;

T_CLK = 0;

ACC = ACC >> 1;

}

}

/********************************************************************

函数名:RTOutputByte()

功能:实时时钟读取一字节

说明:从DS1302读取1Byte数据 (内部函数)

入口参数:无

返回值:ACC

设计:zhaojunjie 日期:2002-03-19

修改:日期:

***********************************************************************/ uchar RTOutputByte(void)

{

uchar i;

for(i=8; i>0; i--)

{

ACC = ACC >>1; /*相当于汇编中的 RRC */

ACC7 = T_IO;

T_CLK = 1;

T_CLK = 0;

}

return(ACC);

}

/********************************************************************

函数名:W1302()

功能:往DS1302写入数据

说明:先写地址,后写命令/数据 (内部函数)

调用:RTInputByte() , RTOutputByte()

入口参数:ucAddr: DS1302地址, ucData: 要写的数据

返回值:无

***********************************************************************/ void W1302(uchar ucAddr, uchar ucDa)

{

T_RST = 0;

T_CLK = 0;

T_RST = 1;

RTInputByte(ucAddr); /* 地址,命令 */

RTInputByte(ucDa); /* 写1Byte数据*/

T_CLK = 1;

T_RST = 0;

}

/********************************************************************

函数名:R1302()

功能:读取DS1302某地址的数据

说明:先写地址,后读命令/数据 (内部函数)

调用:RTInputByte() , RTOutputByte()

入口参数:ucAddr: DS1302地址

返回值:ucData :读取的数据

***********************************************************************/ uchar R1302(uchar ucAddr)

{

uchar ucData;

T_RST = 0;

T_CLK = 0;

T_RST = 1;

RTInputByte(ucAddr); /* 地址,命令 */

ucData = RTOutputByte(); /* 读1Byte数据 */

T_CLK = 1;

T_RST = 0;

return(ucData);

}

/********************************************************************

函数名:Set1302()

功能:设置初始时间

说明:先写地址,后读命令/数据(寄存器多字节方式)

调用:W1302()

入口参数:pClock: 设置时钟数据地址格式为: 秒分时日月星期年

7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B

返回值:无

***********************************************************************/ void Set1302(uchar *pClock)

{

uchar i;

uchar ucAddr = 0x80;

W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/

for(i =7; i>0; i--)

{

W1302(ucAddr,*pClock); /* 秒分时日月星期年 */

pClock++;

ucAddr +=2;

}

W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/

}

//*********** 18B20驱动 **************************

//延时

void delay(unsigned int num)

{

while( --num ) ;

}

//复位

byte ow_reset(void)

{

byte presence;

DQ = 0; //拉低总线

delay(29); // 保持 480us

DQ = 1; // 释放总线

delay(3); // 等待回复

presence = DQ; // 读取信号

delay(25); // 等待结束信号

return(presence); // 返回 0:正常 1:不存在

}

//从 1-wire 总线上读取一个字节

byte read_byte(void)

{

byte i;

byte value = 0;

for (i=8;i>0;i--)

{

value>>=1;

DQ = 0;

DQ = 1;

delay(1);

if(DQ)value|=0x80;

delay(6);

}

return(value);

}

//向 1-WIRE 总线上写一个字节

void write_byte(char val)

{

byte i;

for (i=8; i>0; i--) // 一次写一位 {

DQ = 0; //

DQ = val&0x01;

delay(5); //

DQ = 1;

val=val/2;

}

delay(5);

}

//读取和显示温度

Read_Temperature(char xx,char yy) {

unsigned char i,tl_temp;

unsigned int x;

unsigned char ct[8];

union{byte c[2]; int x;}temp;

ow_reset();

write_byte(0xCC); // Skip ROM

write_byte(0x44); // 转换温度

ow_reset();

write_byte(0xCC); //Skip ROM

万年历电子钟设计报告

课程设计报告课程设计名称 SOPC原理及应用专业电子科学与技术 班级电子13-1班 学号 姓名郑航 指导教师冯丽 成绩

2016年1月13日

目录 一、设计目的 (1) 二、设计内容要求 (1) 三、系统软、硬件需求分析 (1) 1. 硬件系统组成规划 (1) 2. 软件系统规划 (2) 四、设计步骤 (3) 3. 新建工程“count_binary” (3) 4. 添加ip核 (4) 5. 添加SDRAM Controller (5) 6. 添加flash (6) 7. 添加外部RAM总线(Avalon三态桥) (7) 8. 添加pio核 (7) 9. 添加cpu核 (8) 10. 添加LCD核 (9) 11. 自动分配基地址并生成系统 (9) 12. 设置顶层模块图 (10) 13. 管脚分配并编译 (11) 14. 启动Nios II IDE,新建工程 (12)

15. 导入设计程序 (12) 16. 编译工程并烧录 (13) 五、设计结果 (14) 六、源程序 (16) 1. 程序......................................... 错误!未定义书签。 2. 程序......................................... 错误!未定义书签。 3. 程序......................................... 错误!未定义书签。 4. 程序 (16) 七、实验心得 (28)

项目基于NiosII系统的电子钟设计 一、设计目的 1.掌握基本的开发流程。 2.熟悉QUARTUS II软件的使用。 3.熟悉NIOS II软件的使用。 4.掌握SOPC硬件系统的搭建和NIOSII软件编程方法。 5.掌握SOPC系统设计方法。 6.进一步了解简单的设置及其编程。 二、设计内容要求 NiosII系统的硬件设计,软件设计,该系统能实现一个电子钟功能。 三、系统软、硬件需求分析 1.硬件系统组成规划 根据系统要实现的功能和开发板配置,本项目中需要用到的Cyclone II开发板上的外围器件有: LCD:电子钟显示屏幕 按钮:电子钟设置功能键 Flash存储器:存储软、硬件程序 SRAM存储器:程序运行时将其导入SRAM 根据所用到的外设和器件特性,在SOPC Builder中建立系统要添加的模块包括:NiosII CPU定时器,按键PIO,LCD,外部RAM总线(Avalon三态桥),

带温度显示的万年历_数码管显示(附电路图和源代码)

设计报告 设计任务: 设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。并能准确计算闰年闰月的显示。设计要求: 通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术所连线路和单片机接口仿真图如图3所示: 图3 仿真按键 4)温度采集部分: DS18B20温度传感器,测温范围-55℃~+125℃,固有测温分辨率0.5℃。独特的单线接口方式,DS18B20在与微处理器

连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。DS18B20的采集数据通过DQ传入单片机,单片机读取数据后将数据输出!如图所示 : 程序如下: ReadOneChar(void) { unsigned char i=0;// 定义i用于循环 unsigned char dat = 0;// 读取的8位数据 for (i=8;i>0;i--)//8次循环 { DQ = 0;// 拉低DQ总线开始读时序 dat>>=1;// dat左移一位 DQ = 1; //释放DQ总线 if(DQ)// 如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat 即为读取的数据) //DQ=0,就跳过 dat|=0x80; Tdelay(4);// 延时以完成此次读时序,之后再读下一数据 } return(dat); 返回读取的dat } //写一个字节 WriteOneChar(unsigned char dat) { unsigned char i=0;// for (i=8; i>0; i--)// { DQ = 0;// DQ = dat&0x01;// Tdelay(5);//延时以完成此次读时序,之后再读下一数据

万年历(c++设计)

西安科技大学2009级C++实验报告 创作编号:BG7531400019813488897SX 创作者:别如克* 面向对象技术实验报告 (万年历)

1.实验目的 掌握一种编程工具和面向对象程序设计的基本思想和方法,培养我们学生综合利用某种语言进行程序设计的能力,培养我们学生利用系统提供的功能进行创新设计的能力,培养我们学生充分利用计算机的功能和特点分析实际问题及解决实际问题的能力。 为我们提供一个综合运用所学知识解决实际问题的机会,增强我们学生的实践动手能力和工程实践能力,并培养和锻炼我们学生的自学创新能力。 为了能更好地了解C++语言,因此开设了此次课程设计,程序设计教学课程的目的不是为了单独的课堂学习,而是要让我们学生掌握程序设计的基本思想及方法。一方面,在课程设计过程中,可以明确的指导为什么而学,还能对所学知识得到应用,更重要的是可以让我们学生掌握一些基本函数的用法,从而不在对编程序感到茫然,经过设计,可以让我们熟悉简单程序的设计方法和编写,对程序设计及该门课程设计语言的应用得到理解。 2.功能简介 万年历,输入年份,可以显示出这一年的每个月份和所对应的星期

天,可以查询每一天. 3.流程图 4.代码 #include #include using namespace std; int i,c,day,year,k,a[50]; void f1(int x) //大月 { for( i=0;i<50;i++) a[i]=33; for(i=k-1;i>=0;i--) a[i]='\000'; //1号前均为空格 for(i=k;i<31+k;i++)

电子时钟万年历设计

计算机科学与技术学院硬件课程设计报告

在日常生活中,手表,闹钟是不可或缺的。在实际生活生产活动中,也要考虑时间的因素,如工时的计算,霓虹灯的亮灭。 因为集成电路制造技术的不断提高,出现了高性能、高可靠的集成芯片。电子时钟在工业领域,日常生活中得到了广泛的应用。电子时钟在性能方面具有精度高,实时性好,易于调整等优点。这些使得温度控制系统的研究和开发得到的各方面的广泛关注和支持。 本次课程设计,我利用8254计数芯片,8255芯片,4*4小键盘,12864LCD 液晶显示器,蜂鸣器制作了一个带有闹钟功能的电子时钟万年历。它可以实现由4*4小键盘输入初始时间(包括年月日时分秒星期),利用8254计数,通过程序处理进位,判断闰年,在液晶显示屏上实时显示时间。还可以由小键盘选择不同的闹钟模式,设定闹钟时间。 关键词: 电子时钟; 8255A芯片; 8254芯片; 12864LCD液晶显示器;键盘输入;蜂鸣器;闹钟功能;万年历

1.设计任务与要求...........................................................................6- 1.1实验目的 (6) 1.2具体要求 (6) 2.总体方案与说明...........................................................................6- 2.1使用硬件 (6) 2.1流程设计 (6) 2.1.1系统程序模块 (6) 2.1.1系统流程图 (7) 3.硬件方案 (7) 3.1硬件说明 (7) 3.1.1计数芯片8254 (7) 3.1.2可编程外围接口芯片8255A (8) 3.1.2 128×64字符液晶显示器 (11) 3.2电路原理图与说明 (12) 3.2.1键盘电路 (13) 3.2.2 8254计数电路 (13) 3.2.3 液晶显示电路 (14) 3.3电路连接图 (14) 3.3.1 8254计数芯片 (14) 3.3.2 整体电路 (15) 4.软件方案 (15) 4.1软件主要模块流程图 (15) 4.1.1输入子程序模块流程图 (16) 4.1.2显示子程序模块流程图 (18) 4.1.2闰年子程序模块流程图 (18) 4.1.2蜂鸣器子程序模块流程图 (18) 4.1.2时间进位程序模块流程图 (19) 4.1.2主程序模块流程图 (20) 4.2源程序清单与注释 (21) 5.分析与测试 (38) 6.运行结果 (38) 6.1试验线路图 (39) 6.2实验结果 (39) 6.2.1欢迎界面 (39)

带温度计的万年历

设计课题题目: 带温度计的万年历 一、设计任务与要求 1. 显示准确的北京时间(时、分、秒)及公历日期显示功能(年、月、日); 2. 可通过按键切换年、月、日及时、分、秒的显示状态; 3. 可随时可以调校年、月、日或时、分、秒; 4. 可每次增减一进行时间调节,也可快速增减进行时间调节; 5. 可显示环境温度。 二、系统设计方案 方案一、用主芯片为AT89C51的单片机控制实现,使用单片机内部的定时计数器实现时间的设定,使用按键进行时间的调整和定时,按键有蜂鸣器提示,温度传感器使用DALLAS 公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配处理器等优点。显示时间和温度使用数码管显示。 方案二、用主芯片为STC89C52的单片机控制实现,为了满足单片机系统的实时控制的需求,采用实时钟芯片DS1302,使用按键进行时间的调整和定时,温度传感器使用 DS18B20。显示时间和温度使用LCD1602显示。 方案一片内定时器会导致计时节拍的时间误差,当进行年、月、日的日历计时,定时中断误差扥积累就会很大。使用片内定时器进行计时的时候,单片机始终要处于工作状态。才能维持计时时间,一旦停机或进入待机状态,开机后,计时时间就需要重新设定。为了满足单片机系统的实时钟需求,本设计采用的是方案二,系统框图如图2-1所示。 图2-1 三、单元电路分析与设计 1. 原理分析 1.1主控制器 单片机STC89C52 具有低电压供电和体积小等特点,如图3-1所示。

1.2晶振电路 AT89S52引脚XTAL1和XTAL2与晶体振荡器及电容C1、C2按图3-2所示方式连接。晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz 之间,电容C1、C2取值范围在5~30pF 之间。 根据实际情况,本设计晶振选择频率为12MHZ ,电容选择30pF 如图3-2。经计算得单片机工作的机器周期为:12×(1÷12M )=1us 。振荡器的振荡信号从XTAL2端输入到片内的时钟发生器上。时钟发生器是个二分频的触发器,它将振荡器的信号频率fosc 除以2,向CPU 提供两相时的时钟号。 1.3复位电路 时钟电路工作后, 芯片内部开始进行初始复位,如图3-3 。 1.4 LCD 显示电路 显示器是单片机常用的功能单元之一,显示器的工作是由单片机通过显示接口驱动的。本设计采用的是LCD1602显示电路图如图3-4所示。

单片机课程设计—万年历[1]

郑州轻工业学院 软件学院 单片机与接口技术课程设计总结报告 设计题目:电子万年历 学生姓名: 系别: 专业: 班级: 学号: 指导教师: 2011年12月16日

设计题目: 电子万年历 设计任务与要求: 1、显示年月日时分秒及星期信息 2、具有可调整日期和时间功能 3、增加闰年计算功能 方案比较: 方案一:系统分为主控制器模块、显示模块、按键开关模块,主控制模块采用 AT89C52单片机为控制中心,显示模块采用普通的共阴LED数码管,键输入采用中断实现 功能调整,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,通 过按键盘开关实现对时间、日期的调整。 方案二:系统分为主控模块、时钟电路模块、按键扫描模块,LCD显示模块,电源 电路、复位电路、晶振电路等模块。主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对 时间、日期的操作。 两个方案工作原理大致相同,只有显示模块和时钟电路不同。LED数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少; LCD1602液晶显示屏,显示功 能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说 要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块。DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的 应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具 有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。单片机有定时 器的功能,但时间误差较大,且需要编写时钟程序,因此采用DS1302作为时钟电路。 对比以上方案,结合设计技术指标与要求我们选择了方案二进行设计。

多功能时钟(万年历)设计

多功能时钟(万年历) 设 计 报 告 专业电子信息科学与技术 班级13级电子专升本 姓名韩科峰 学号130522012 考勤成绩设计成绩 调试成绩报告成绩 总成绩

一、课题名称 多功能时钟(万年历)设计 二、内容摘要 美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。 综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 本设计是基于单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。 关键词: 三、设计指标(要求); 1、显示时间、日期由按键选择显示(日期时间可调整)。 2、可设置闹钟功能; 3、制作PC机设置界面软件,由PC机可完成对时钟的各项设置 四、系统框图;

STC12C5A08S2 单片机 DS1302时钟模块 五、各单元电路设计、参数计算和元器件选择 4位共阴极数码管 按键

六、工作原理 DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;DS1302的控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0,位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。 “CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”

电子万年历

河北科技师范学院课程设计说明书 题目: 学院(系): 年级专业: 学号: 学生姓名: 指导教师:

摘要 本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒及星期信息,并具有可调整日期和时间功能。 我选用的是单片机8052来实现电子万年历的功能。该电子万年历能够成功实现时钟运行,调整,显示年月日时分秒及星期,温度等信息。 该电子万年历使用12MHZ晶振与单片机8052相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。所以在该设计与制作中我选用了单片机8052,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, 单片机8052的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。 因此,采用单片机8052原理制作的电子万年历,不仅仅在原理上能够成功实现计时等功能,也更经济,更适用,更符合我们实际生活的需要,对我们大学生来说也更加有用。

电子万年历设计

课程论文论文题目基于单片机的电子万年历设计 课程名称单片机原理及接口技术 专业年级 2014级自动化3班 学生姓名孙宏远贾腾飞 学号 2016年12 月3 日

摘要: 本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。。 关键词:AT89C51单片机,DS1602时钟芯片,LCD1602显示屏。串口通信。 一:引言 本设计的基于单片机控制的电子万年历,具有年、月、日、星期、时、分、秒的显示等功能,实现过程就是由主控制发送信息给DS1302时钟芯片再由时钟芯片反馈给单片机,再由主控制器传送给LCD1602显示屏显示信息。并且可以在键盘设置模块输入修改时间,当键盘设置时间、日期时,单片机主控制根据输入信息,通过串口通信传送给DS1302时钟芯片,DS1302芯片读取当前新信息产生反馈传送给单片机,然后单片机根据控制最后输送显示信息到LCD1602液晶显示屏模块上显示。 二:硬件设计: 2.0.硬件的设计总框图 2.1 DS1032时钟电路 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。芯片如图。 DS1302的内部主要由移位寄存器、指令和控制逻辑、振荡分频电路、实时时钟以及RAM组成。每次操作时,必须首先把CE置为高电平。再把提供地址和命令信息的8位装入移位寄存器。数据在SCLK的上升沿串行输入。无论是读周期还是写周期发生,也无论传送方式是单字节还是多字节,开始8位将指定内部何处被进行访问。在开始 8个时钟周期把含有地址信息的命令字装入移位寄存器之后。紧随其后的时钟在读操作时输出数据。 2.2 LCD1602与AT89C52的引脚接线 LCD1602采用总线式与单片机相连,AT89c52的P1口直接与液晶模块的数据总线D0~D7相连;P2 口的0,1,2脚分别与液晶模块的RS、RW、E脚相连。滑动变阻器用于调整液晶显示的亮度。电路如图

万年历C语言课程设计(内附程序)

石家庄铁道大学课程设计 C语言课程设计 万年历 单位电气与电子工程学院(系) 班级 学号 学生姓名 指导教师 完成日期 2013 年7 月 8日

摘要 本课程设计报告介绍的是C语言实习中的万年历项目。该报告共分五章,第一章介绍选题意义,也就是我选择万年历作为课题项目的理由。第二章是系统的分析,包括系统概述,系统的构成,其中包括各个模块功能的分析介绍,该章节的最后介绍了各部分的功能,即组成程序的各个函数的功能介绍。第三章是系统的实现,即为各个功能的实现而服务的十个自定义函数的流程图,通过这十个流程图,您可以快速地明白程序功能的实现过程。第四章是总结,即本人在设计万年历程序过程中的心得,以及在整个程序设计过程中我的工作过程,也体现了我的设计思路。第五章是参考文献,在这里我主要查阅了《C程序设计(第三版)》中的C函数附表,另外有几处欠缺的知识,我借鉴了另一本书上的相关部分。第六章,也是最后一章,我把整个程序的源代码及其注释附上。由于本人水平所限,程序也不可能很完美,必定有一些漏洞和拖沓,还请谅解。好了,从这里开始,我将与你们分享我我在整个万年历程序设计中的所做所想。

目录 1.选题的意义 (4) 2.系统的分析 (5) 2.1系统概述 (5) 2.2系统的构成 (5) 2.3各模块的功能 (5) 2.4系统的运行环境 (5) 3.系统实现 (6) 4.总结 (11) 5.参考文献 (12) 6.附录(程序源代码) (13)

第一章 选题的意义 (1)通过万年历的设计,使我们掌握软件开发过程的问题分析、系统设计、程序编写、测试等基本方法和技能。 (2)通过万年历的设计,熟练掌握C语言中的分支、循环、数组、函数、文件操作等的综合运用。 (3)通过万年历的设计,可以培养独立思考、综合运用所学有关相应知识的能力,更好地巩固《C程序设计》课程中的所学内容。 (4)通过万年历的设计,可以强化自己的动手编程能力,更加深刻地感受C语言的优点。 (5)万年历与我们的生活联系密切,通过万年历的设计,我们可以感受知识与实践相结合的乐趣。

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

一、项目介绍与设计目的 基于单片机的电子时钟万年历为实现电子万年历的功能,采用单片机STC89C51,辅助以必要的外围电路,用C语言编写程序,并进行模块化设计而成的电子万年历系统.它通过LCD能正确显示年、月、日、周日、时、分、秒等,具有功能稳定,精确度高和可调的特点。 二、设计方案 1.项目环境要求 1.1时钟芯片选择 方案一:不使用芯片,采用单片机的定时计数器 这种方法原理是利用单片机芯片的定时器来产生固定的时间,模拟时钟的时, 分,秒。如:利用AT80C52芯片,定时器用工作方式1,每50ms产生一个中断,循环20次,即1s周期。每一个周期加1,那么1min为60个周期,1h就是60*60=3600个周期,一天就是3600*24=86400个周期。 此方法优点是可以省去一些外围的芯片,但这种方法只能适用于一些要求不是十分精确,不做长期保留的场合。 方案二:并行接口时钟芯片 DS12887 特点:采用单片机应用系统并行总线(三总线)扩展的接口电路,采用这种接口电路具有操作速度快,编程方便的优点。 但是对于80C52单片机来说,低位地址线要通过锁存器输出,还要地址译码器,而且并行口芯片的体积相对较大。 方案三:串行接口时钟芯片DS1302 芯片主特性: (1)实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力,还有闰年调整的能力

(2)31 8 位暂存数据存储RAM (3)串行 I/O 口方式使得管脚数量最少 (4)宽范围工作电压2.0 5.5V (5)工作电流 2.0V 时,小于300nA (6)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式 (7)8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配 (8)简单 3 线接口 (9)与 TTL 兼容Vcc=5V (10)可选工业级温度范围-40~+85 优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。 所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。 图2 DS1302管脚图 1.2显示模块选择 方案一:LED数码管显示 数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。目前单片机数码管普通采用动态显示。编程简单,但只能显示

万年历时钟电路设计报告word精品

阿坝师范学院 万年历设计报告姓名:李朝林 学号:20156045 班级:电子信息工程02班

阿坝师范学院物理与电子科学系 目录 1?设计任务与要求 (2) 2?主要器件讨论与选择 (2) 3.设计原理 (3) 4?单元电路设计 (3) 4.1显示电路 (3) 4.2时分秒设计............................................. .4 4.3星期天数设计 (5) 4.4闰年平年判断电路 (6) 4.5二月与大小月判断电路 (9) 4.6天数置数信号 (10) 4.7校正电路 (11) 4.8秒脉冲电路 (11) 5.完整的电路设计原理图 (12) 6.电路调试过程与方法 (13) 7.实验心得体会与总结 (13) 1. 设计任务与要求 用数字集成电路设计万年历电子钟逻辑电路 指标如下: 1)设计一个能直接显示“年”“月”“日”、“星期”、“时”、 “分”、“秒”的十进制万年历时钟显示器。 2)具有校时的功能,可分别对“年”、“月”、“日”、“星期”、 “时” “分” “秒”进行单独校时。 2. 主要器件讨论与选择 主要器件中显示模块选用74SEG_BCD数码管显示8421bcd码,计数模块统一选用74LS160作为计数芯片;74LS160具有同步置数异步清零功能,同时在有时钟脉冲的情况下进行加计数,无论采用同步置数还是异步清零都可以实现60s、60m、24h置数清零功能。因此

[在此处键入] 数字电子技术万年历设计报告 74LS160是一个不错的选择。本次仿真通过 74LS160作为时分秒年月 日星期置数,通过秒计数的置数信号作为分计时的脉冲 cp ,取反作 为分计时的使能端,依次向高位进位达到显示目的。 通过闰年、平年、大月、小月、二月的判断电路来控制天计数的 多少。 校时电路,校时选用74LS74触发器作为跳变信号;74LS244存储 信号。起作用的只有一个,当校时有效时计时电路无效。 3. 设计原理 原理图如下: 万年加时种星示器框采禺P 4. 单元电路设计 4.1显示电路 振荡器 呈期廿数 楼时电路? 译码显示电路疋* 千 百 十个

万年历阴历星期温度

#include #include #include #define uchar unsigned char #define uint unsigned int sbit CLK=P1^1; //DS1302时钟线 sbit SDA=P1^0; // DS1302数据线 sbit RST=P1^2; //DS1302复位线 sbit RS=P2^0;//数据/指令选择端口 sbit RW=P2^1;//读写端口 sbit EN=P2^2;//使能端口 sbit K1=P3^4; // 选择 sbit K2=P3^5; // 加 sbit K3=P3^6; // 减 sbit K4=P3^7; // 确定 uchar tCount=0;//一年中每个月的天数,2月的天数由年份决定 uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; uchar *WEEK[]={"sun","mon","tus","wen","thu","fri","sat"};//周日,周一到周六 uchar LCD_DSY_BUFFER1[]={"Date 00-00-00 "}; //LCD显示缓冲 uchar LCD_DSY_BUFFER2[]={"Time 00-00-00 "}; uchar DateTime[7]; //所读取的日期时间 char Adjust_Index=-1; //当前调节的时间:秒,分,时,日, uchar Change_Flag[]="-MHDM-Y"; uchar Read_LCD_State();//读LCD状态 void LCD_Busy_Wait();//判忙 void Write_LCD_Data(uchar dat);//写数据 void Write_LCD_Command(uchar cmd);//写命令 void Init_LCD();//LCD初始化 void Set_LCD_POS(uchar p);//设置显示位置 void Display_LCD_String(uchar p,uchar *s);//写字符串 void DelayMS(uint x)//延时 { uchar i; while(x--) for(i=0;i<120;i++); } uchar Read_LCD_State()//读LCD状态 { uchar state;

电子万年历的设计与实现

毕业设计(论文)任务书 题目:电子万年历的设计与实现 任务与要求: 设计一以单片机为核心控制的万年历,具有多项显示和控制功能。要求:准确计 时,以数字形式显示当前年月日、星期、时间; 具有年月日、星期、时间的设置和调整功能;自行设计所需直流电源 时间: 2010年9 月 27 日至 2010 年 11 月 23 日共 8 周 所属系部:电子工程系

摘要 随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。 而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。因为它的有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式LED数码管显示的日历钟逐渐受到人们的欢迎。LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。所以,电子万年历无论作为比赛题目还是练习题目都是很有价值。 关键词:单片机;万年历 1

目录 1 概述 (5) 1.1单片机原理及应用简介 (5) 1.2系统硬件设计 (6) 1.3结构原理与比较.............................. 错误!未定义书签。2系统总体方案及硬件设计......................... 错误!未定义书签。 2.1系统总体方案................................ 错误!未定义书签。 2.2硬件电路的总体框图设计 (12) 2.3硬件电路原理图设计 (12) 3软件设计 (13) 3.1主程序流程图 (13) 3.2显示模块流程图 (14) 4P ROTEUS软件仿真 (15) 4.1仿真过程 (15) 4.2仿真结果 (16) 5课程设计体会 (17) 参考文献 (18) 附录:源程序代码附 (18) 结束语 (25) 2

单片机电子万年历含程序

CHANGZHOU INSTITUTE OF TECHNOLOGY 科研实践 项目名称:电子万年历设计 二级学院:电子信息与电气工程学院 专业:电气工程及其自动化班级: 10 电二 学生姓名:祝学东学号: 指导教师:庄志红职称:副教授 起止时间: 2013年12月9日—2013年12月20日 摘要 本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒、星期,并具有可调整日期和时间功能。 该电子万年历使用12MHZ晶振与单片机AT89C52相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。 AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

lcd数显温度万年历电波钟

外观尺寸:29cm(宽)*18.5cm(高) 可挂可摆,背面有挂孔,可挂在墙上,也可以安装随机配送的支架摆放在台面上。 电子说明书地址:https://www.360docs.net/doc/533675689.html,/item.htm?spm=a1z09.5.0.4 0&id=16362908718 功能特点: 1、时间显示:时:分:秒,12/24小时制可选 2、日历显示:日/月 3、星期显示:英文简写 4、温度显示:摄氏或华摄,范围:0℃-50℃(32℉-122℉),分辨率:0.1℃。 5、闹铃功能:可设置1个闹铃时间。 6、特殊日期提醒功能:可设置三个特殊日期提醒。 使用电源:两节AA电池(不配送电池),超省电,两节电池可使用一年以上。 使用说明: 一、信号自动同步: 当时钟正确装上电池后,稍等几秒,自动开始接收日本发射的无线电校时信号,接收过程中屏幕右上角显示一个闪动的信号接收塔标识。当接收到正确的时间信号后,接收塔标识停止闪动并自动同步时间和日历信息,时钟每天会定时进行接收,无须人工干预。如果接收不成功,时钟仍可以作为一个高精度石英钟使用。 时钟在接收信号的过程(接收塔标识闪动)中无法进行其他功能的操作,如果需要进行其它设置或取消接收,须按下‘+’键退出接收状态。为了达到最好的接收效果,应将时钟远离其它用电器至少在1-2米以上,并可以适当转动时钟位置以获取最佳接收效果。 二、信号手动同步: 在正常的时钟显示模式,长按‘+’键,强制进入信号接收状态,此时收塔标识闪动,接收过程与自动同步一样。 三、手动设定时钟、日历: 在正常的时钟显示模式,长按‘CLK/CAL’键,进入时间日历设置界面,当前设置项目闪动,通过短按‘+,-’键调整数值,再短按‘CLK/CAL’确认并进入下一设置项目。设置项目顺序:12/24时制—小时—分钟—年—月—日—时区。 四、每日闹钟设置: 在正常的时钟显示模式,长按‘ALARM’键,进入闹铃设置界面,通过短按按‘+,-’键输入每天的闹铃时间,最后按‘ALARM’键确认。 在正常的时钟显示模式,短按‘-’键可以开启和关闭闹铃功能,当闹铃响时,按任意键都可以关闭闹铃。 五、特殊日期提醒设置:

C语言程序设计 万年历程序

#include"stdio.h" int mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31}; int judge(int year,int month) { if(month==1||month==3||month==5||month==7||month==8||month==10||month ==12) return(1); else if(month==2) { if(year%4!=0||year%100==0&&year%400!=0) return(2); else return(3); } else return(4); } void show2() { int year,i,j,a,n,m,k; char ** p; char * week[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; char*month[]={"January","February","March","April","May","June","July","Augu st","September","October","November","December"}; printf("please inter the year:"); scanf("%d",&year); printf("\n"); printf("the calendar of the year%d.",year); printf("\n"); a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7; for(i=0;i<12;i++) { n=judge(year,i+1); p=month+i; printf("%s\n",*p); printf("\n"); for(j=0;j<7;j++) {p=week+j; printf("%6s",*p);}

电子万年历设计(基于AT89C51单片机和DS1302时钟芯片)1

随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。 二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步…… 我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。 本设计为软件,硬件相结合的一组设计。在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。基本的要了解一些主要器件的基本功能和作用。 除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。AT89C51是由ATMEL 公司推出的一种小型单片机。95年出现在中国市场。其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。 本文介绍了基于AT89C51单片机设计的电子万年历。 首先我们在绪论中简单介绍了单片机的发展与其在中低端领域中的优

基于51单片机带温度显示的液晶万年历

摘要 在寒假期间我用一周时间完成了这个液晶万年历,它可以显示年月日、时分秒、以及温度(可上下限报警),可以对时间进行加一或减一调整,并加入了闰、平年时间调整,方便可行,已经调试成功。考虑到成本和方便,本作品采用了STC89c52和DS18B20,计时用的是51单片机自带的十六位定时器/计数器T0,尽管对时间进行了误差调整但是还是有一定的误差,考虑到学校后改用DS1302时钟芯片,进一步减小误差。温度显示精度达到0.1摄氏度。 关键词:单片机 DS18B20 万年历温度 1.硬件工作介绍 (1)上电自动复位及手动复位电路 STC89c52单片机的RST端外部复位有两种操作方式:上电自动复位和按键手动复位。本设计用上电自动复位以及手动复位下结合的方式外接电路(见附图)。 (2)时钟振荡电路 作品中采用12M晶振,其连接方法如图所示,其中电容的值都为22pF。(3)1602液晶显示接口 1602采用标准的16脚接口(见附图),其中: 第1脚:GND为地电源 第2脚:VCC接5V正电源 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。 第15脚:VCC 第16:GND (4)键盘 键盘是通过S3(P3.2),S4(p3.3),S5(p3.4)对时钟进行调整,其S3选择要调整的对象如时,分,日,月等等,并在液晶屏上显示所选的对象。S4对所选中

电子万年历

第一章绪论 1.1设计背景 从改革开放开始,电子工业已成为科技创新的重要领域,我国的电子产业也在新世纪开始高速发展,无论是产业结构,产业规模和技术水平都有了十分明显的进步和提升,而且电子产品在各个领域都有开创性的发展,使我们的生活变得更加智能化,为我国经济的发展做出了杰出的贡献。其中,单片机的大规模使用为我们的生活创造了极大的便利,可以说无时无刻不在影响着我们的生活。何为单片机,单片机全名为单片微控制器,它的结构组成就是将微型计算机的基本功能部件全都集成在一个半导体芯片上。尽管仅仅是一个芯片,但从单片机的构成和功能的角度来看充分具备一个计算机系统的中央处理功能。最重要的优点是,单片机体积小巧,可以任意嵌入到任何符合条件的应用系统中作为中央处理器进行指挥决策,是系统实现完全的智能化。当今世界,单片机已经无时无刻不在我们生活的周边存在,各类电子产品几乎都以单片机作为主控核心,通过单片机的控制使之更加智能快速,使我们的生活更加舒畅和方便。正是随着日常周边科学技术的进步,人们对待生活用品的要求也在逐步提高,时钟亦是如此,从古至今,人们对时间的概念就非常重视,从日晷到摆钟,经历了百年的发展,如今,人们对时钟的要求不仅仅是能够知道时间,还需要能够知道日期,星期,节气,天气情况等等,以便于满足人们对生活的各种需要,由此电子万年历就诞生了,正是因为电子万年历功能的多样性,使它在应用在各种场合,人们对它的需求量也就却来越大,电子万年历的发展空间也越来越广阔,成为了一项重要的产业。 1.2设计的目的及意义 中国从古至今就有重视时间的好传统,农民通过日照和鸡叫开始一天的劳作,商人通过古老的计时工具来确认是否应该开门迎客,学士知道时间后则开始一天的读书学习,这种传统一直绵延至今。当今社会,人们的生活节奏飞快,在工作中讲究快速和效率,需要在最短的时间内完成最合理的工作要求,所以人们通常需要在最短的时间内了解到最丰富的信息,人们不满足于只能看到此时此刻的时间信息,还需要了解过去和未来几天内的时间情况,包括农历,天

相关文档
最新文档