基于stc12c5a60s2和OLED的电子万年历源码.h

基于stc12c5a60s2和OLED的电子万年历源码.h
基于stc12c5a60s2和OLED的电子万年历源码.h

Main.c :

#include "stc12c5a60s2.h"

#include "DS1302.h"

#include "DS18B20.h"

#include "OLED.h"

#include "Key.h"

#include "EEPROM.h"

extern unsigned char Second,Minute,Hour,Date,Month,Year,Week;

void T0_init()

{

TMOD=0x01;

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

EA=1;

ET0=1;

TR0=1;

Time_Dis();

}

void main()

{

LCD_Init();

DS1302_Init();

LCD_Fill(0xff); //全亮

LCD_CLS(); //lcd复位

Delay(10);

DS18B20_Rst();

DS1302_timeread();

Time_Init();

T0_init();

while(1)

{

Change_Dat();

}

}

void timer() interrupt 1

unsigned char i;

i++;

TR0=0;

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

DS1302_timeread();

READ_18B20_Temperature();

if(i==15)

{

i++;

Time_Dis();

Temperature();

}

if(i==30)

{

i=0;

Compare_colock();

}

TR0=1;

}

Oled.c:

#include "stc12c5a60s2.h"

#include "OLED.h"

#include "code.h"

sbit LCD_SCL=P3^4; //时钟D0(SCLK)

sbit LCD_SDA=P3^5; //D1(MOSI)数据

sbit LCD_RST=P3^6; //复位

sbit LCD_DC =P3^7; //数据/命令控制

/*********************LCD 延时1ms************************************/

void LCD_DLY_ms(unsigned int ms)

{

unsigned int a;

while(ms)

{

a=1800;

while(a--);

}

return;

}

/*********************LCD写数据************************************/ void LCD_WrDat(unsigned char dat)

{

unsigned char i=8;

LCD_DC=1;

for(i=0;i<8;i++) //发送一个八位数据

{

LCD_SCL=0;

LCD_SDA=dat&0x80;

LCD_SCL=1;

dat<<=1;

}

}

/*********************LCD写命令************************************/

void LCD_WrCmd(unsigned char cmd)

{

unsigned char i=8;

LCD_DC=0;

for(i=0;i<8;i++) //发送一个八位数据

{

LCD_SCL=0;

LCD_SDA=cmd&0x80;

LCD_SCL=1;

cmd<<=1;;

}

}

/*********************LCD 设置坐标************************************/ void LCD_Set_Pos(unsigned char x, unsigned char y)

{

LCD_WrCmd(0xb0+y);

LCD_WrCmd(((x&0xf0)>>4)|0x10);

LCD_WrCmd((x&0x0f)|0x01);

}

/*********************LCD全屏************************************/ void LCD_Fill(unsigned char bmp_dat)

{

unsigned char y,x;

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

{

LCD_WrCmd(0xb0+y);

LCD_WrCmd(0x01);

LCD_WrCmd(0x10);

for(x=0;x

LCD_WrDat(bmp_dat);

LCD_DLY_ms(10);

}

}

/*********************LCD复位************************************/

void LCD_CLS(void)

{

unsigned char y,x;

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

{

LCD_WrCmd(0xb0+y);

LCD_WrCmd(0x01);

LCD_WrCmd(0x10);

for(x=0;x

LCD_WrDat(0);

}

}

/*********************LCD初始化************************************/

void LCD_Init(void)

{

LCD_SCL=1;

LCD_RST=0;

LCD_DLY_ms(50);

LCD_RST=1; //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕LCD_WrCmd(0xae);//--turn off oled panel

LCD_WrCmd(0x00);//---set low column address

LCD_WrCmd(0x10);//---set high column address

LCD_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) LCD_WrCmd(0x81);//--set contrast control register

LCD_WrCmd(0xcf); // Set SEG Output Current Brightness

LCD_WrCmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置0xa1正常

LCD_WrCmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置0xc8正常

LCD_WrCmd(0xa6);//--set normal display

LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)

LCD_WrCmd(0x3f);//--1/64 duty

LCD_WrCmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)

LCD_WrCmd(0x00);//-not offset

LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency

LCD_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec

LCD_WrCmd(0xd9);//--set pre-charge period

LCD_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

LCD_WrCmd(0xda);//--set com pins hardware configuration

LCD_WrCmd(0x12);

LCD_WrCmd(0xdb);//--set vcomh

LCD_WrCmd(0x40);//Set VCOM Deselect Level

LCD_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)

LCD_WrCmd(0x02);//

LCD_WrCmd(0x8d);//--set Charge Pump enable/disable

LCD_WrCmd(0x14);//--set(0x10) disable

LCD_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)

LCD_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)

LCD_WrCmd(0xaf);//--turn on oled panel

LCD_Fill(0x00); //初始清屏

LCD_Set_Pos(0,0);

}

/***************功能描述:显示6*8一组标准ASCII字符串显示的坐标(x,y),y为页范围0~7****************/

void LCD_P6x8Str(unsigned char x, y,unsigned char ch[])

{

unsigned char c=0,i=0,j=0;

while (ch[j]!='\0')

{

c =ch[j]-32;

if(x>126){x=0;y++;}

LCD_Set_Pos(x,y);

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

LCD_WrDat(F6x8[c][i]);

x+=6;

j++;

}

}

/*******************功能描述:显示8*16一组标准ASCII字符串显示的坐标(x,y),y 为页范围0~7****************/

void LCD_P8x16Str(unsigned char x, y,unsigned char ch[])

{

unsigned char c=0,i=0,j=0;

while (ch[j]!='\0')

{

c =ch[j]-32;

if(x>120){x=0;y++;}

LCD_Set_Pos(x,y);

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

LCD_WrDat(F8X16[c*16+i]);

LCD_Set_Pos(x,y+1);

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

LCD_WrDat(F8X16[c*16+i+8]);

x+=8;

j++;

}

}

/*****************功能描述:显示16*16 只用于显示“星期”2字****************************/

void LCD_YMD8x16Ch(unsigned char x, y, N)

{

unsigned char wm=0;

unsigned int adder=16*N; //

LCD_Set_Pos(x , y);

for(wm = 0;wm < 8;wm++) //

{

LCD_WrDat(YMD_Num[adder]);

adder += 1;

}

LCD_Set_Pos(x,y + 1);

for(wm = 0;wm < 8;wm++) //

{

LCD_WrDat(YMD_Num[adder]);

adder += 1;

}

}

/*****************功能描述:显示16*16 只用于显示“星期农历月”等字****************************/

void LCD_Day16x16Ch(unsigned char x, y, N)

{

unsigned char wm=0;

unsigned int adder=32*N; //

LCD_Set_Pos(x , y);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Day16x16[adder]);

adder += 1;

}

LCD_Set_Pos(x,y + 1);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Day16x16[adder]);

adder += 1;

}

}

/*****************功能描述:显示16*16用于显示农历月份****************************/

void LCD_Nongli(unsigned char x, y, N)

{

unsigned char wm=0;

unsigned int adder=32*N; //

LCD_Set_Pos(x , y);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Nongli[adder]);

adder += 1;

}

LCD_Set_Pos(x,y + 1);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Nongli[adder]);

adder += 1;

}

}

/*****************功能描述:显示16*16 只用于显示“星期”2字****************************/

void LCD_Week(unsigned char x, y, N)

{

unsigned char wm=0;

unsigned int adder=32*N; //

LCD_Set_Pos(x , y);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_Week[adder]);

adder += 1;

}

LCD_Set_Pos(x,y + 1);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_Week[adder]);

adder += 1;

}

}

/*****************功能描述:显示16*16数据幼圆****************************/ void LCD_Num16x16(unsigned char x, y, N)

{

unsigned char wm=0;

unsigned int adder=32*N; //

LCD_Set_Pos(x , y);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_yy[adder]);

adder += 1;

}

LCD_Set_Pos(x,y + 1);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_yy[adder]);

adder += 1;

}

}

/*****************功能描述:显示32*32点阵0~9数字时分秒部分****************************/

void LCD_Num32x32(unsigned char x, y, N)

{

unsigned char wm=0;

unsigned int adder=64*N; //改成char型就会溢出,只能是64要不然会乱128显示也会乱

LCD_Set_Pos(x,y);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_yy1[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+1);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_yy1[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+2);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_yy1[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+3);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_yy1[adder]);

adder += 1;

}

}

/*****************功能描述:显示32*32点阵显示的坐标(x,y),y为页范围0~7****************************/

void LCD_colon32x32(unsigned char x, y,N)

{

unsigned char wm=0;

unsigned int adder=64*N; //改成char型就会溢出,只能是64要不然会乱128显示也会乱

LCD_Set_Pos(x,y);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_colon[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+1);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_colon[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+2);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_colon[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+3);

for(wm = 0;wm < 16;wm++) //

{

LCD_WrDat(Num_colon[adder]);

adder += 1;

}

}

/*****************功能描述:显示64*32点阵显示的坐标(x,y),y为页范围0~7****************************/

void LCD_Num64x32(unsigned char x, y, N) //分四次写入

{

unsigned char wm=0;

unsigned int adder=128*N; //

LCD_Set_Pos(x,y);

for(wm = 0;wm < 32;wm++) //

{

LCD_WrDat(Num_yy2[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+1);

for(wm = 0;wm < 32;wm++) //

{

LCD_WrDat(Num_yy2[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+2);

for(wm = 0;wm < 32;wm++) //

{

LCD_WrDat(Num_yy2[adder]);

adder += 1;

}

LCD_Set_Pos(x,y+3);

for(wm = 0;wm < 32;wm++) //

{

LCD_WrDat(Num_yy2[adder]);

adder += 1;

}

}

Eeprom.c:

#include "stc12c5a60s2.h"

#include "string.h"

#include "intrins.h"

#include "EEPROM.h"

#define IAP_ADDRESS 0X0000 //第一扇区初始地址,总共2

void Delay_us(unsigned int j)

{

while(j--);

}

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

关EEPROM函数

**************************************************/ void IAP_EEPROM_Close()

{

IAP_CONTR=0; //关闭IAP控制寄存器

IAP_CMD=0; //关闭IAP命令寄存器

IAP_TRIG=0; //关闭IAP命令触发寄存器

IAP_ADDRH=0x00; //IAP 第一扇区地址

IAP_ADDRL=0x00;

}

/************************************************* EEPROM写函数

*************************************************/ void Write_Eeprom_Byte(unsigned int Add,unsigned char Dat) {

IAP_CONTR=0x83; //开启IAP功能,设置等待时间

IAP_CMD=0x02; //设置IAP为写状态

IAP_ADDRL=Add;

IAP_ADDRH=Add>>8;

IAP_DATA=Dat;

IAP_TRIG=0x5A;

IAP_TRIG=0xA5;

Delay_us(25);

IAP_EEPROM_Close();

}

/************************************************* EEPROM的读函数

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

unsigned char Read_Eeprom_Byte(unsigned int Add)

{

unsigned char Dat;

IAP_CONTR=0x83; //开启IAP功能,设置等待时间

IAP_CMD=0x01; //设置IAP为读状态

IAP_ADDRL=Add;

IAP_ADDRH=Add>>8;

IAP_TRIG=0x5A;

IAP_TRIG=0xA5;

Delay_us(25);

Dat=IAP_DATA;

IAP_EEPROM_Close();

return(Dat);

}

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

清除EEPROM 的值

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

void IAP_EEPROM_Clear(unsigned int Add)

{

IAP_CONTR=0x83; //最高位是ISP功能允许位

IAP_CMD=0x03; //写入字节擦出命令对扇区进行擦除

IAP_ADDRL=Add;

IAP_ADDRH=Add>>8;

IAP_TRIG=0x5A;

IAP_TRIG=0xA5; //操作命令触发寄存器

Delay_us(25);

IAP_EEPROM_Close();

}

Ds1320.c:

#include "stc12c5a60s2.h"

#include "DS1302.h"

#include "OLED.h"

#include "nongli.h"

sbit RST_1302=P0^4;

sbit CLK_1302=P0^6;

sbit IO_1302=P0^5;

unsigned char Second=0,Minute=0,Hour=0,Date=0,Month=0,Year=0,Week=0; unsigned char aa,bb,cc;

/*************写一个字节1302****************/

void DS1302_writebyte(unsigned char Dat)

{

unsigned char i,temp;

temp=Dat;

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

{

IO_1302=Dat&0x01;

CLK_1302=0;

CLK_1302=1;

Dat=Dat>>1;

}

}

/**************读一个字节*****************/ unsigned char DS1302_readbyte()

{

unsigned char i,temp;

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

{

if(IO_1302&0x01==1)

temp=temp+0x80;

CLK_1302=1;

CLK_1302=0;

temp=temp>>1;

}

return(temp);

}

/*************向1302寄存器中写入数据*********/ void DS1302_writeadd(unsigned char Add,unsigned char Dat) {

CLK_1302=0;

RST_1302=1;

DS1302_writebyte(Add);

DS1302_writebyte(Dat);

CLK_1302=1;

RST_1302=0;

}

/**************从1302寄存器中读取数据********/ unsigned char DS1302_readadd(unsigned char Add) {

unsigned char temp;

CLK_1302=0;

RST_1302=1;

DS1302_writebyte(Add);

temp=DS1302_readbyte();

CLK_1302=1;

RST_1302=0;

return(temp);

}

/*************1302初始化*********

在向ds1302写入数据的时候,可以为十六进制不用转换,

但要将此数读出就必须转换,否则会出错!

***/

void DS1302_Init()

{

RST_1302=0;

CLK_1302=0;

DS1302_writeadd(0x8e,0x00);

DS1302_writeadd(0x80,0x13);//向DS1302内写秒寄存器80H写入初始秒数据DS1302_writeadd(0x82,0x13);//向DS1302内写分寄存器82H写入初始分数据DS1302_writeadd(0x84,0x13);//向DS1302内写小时寄存器84H写入初始小时数据DS1302_writeadd(0x8a,0x05);//向DS1302内写周寄存器8aH写入初始周数据DS1302_writeadd(0x86,0x17);//向DS1302内写日期寄存器86H写入初始日期数据DS1302_writeadd(0x88,0x05);//向DS1302内写月份寄存器88H写入初始月份数据DS1302_writeadd(0x8c,0x13);//向DS1302内写年份寄存器8cH写入初始年份数据DS1302_writeadd(0x8e,0x80);

}

/**********十进制转十六*******************/

unsigned char BCD_Decimal(unsigned char bcd)

{

unsigned char Decimal;

Decimal=bcd>>4;

return(Decimal=Decimal*10+(bcd&=0x0f));

}

/**************十六进制转十进制************/

unsigned char Dec_BCD(unsigned char Dec)

{

unsigned char BCD;

BCD=(Dec)/10*16+(Dec)%10;

return(BCD);

}

/*************时间读取函数*****************/

void DS1302_timeread()

{

Second=BCD_Decimal(DS1302_readadd(0x81));

Minute=BCD_Decimal(DS1302_readadd(0x83));

Hour= BCD_Decimal(DS1302_readadd(0x85));

cc= DS1302_readadd(0x87); //ri

bb= DS1302_readadd(0x89); //yue

aa= DS1302_readadd(0x8d); //nian

Date= BCD_Decimal(cc);

Month= BCD_Decimal(bb);

Year= BCD_Decimal(aa); // Week= BCD_Decimal(DS1302_readadd(0x8b));

}

void Time_Init()

{

LCD_P8x16Str(0,0,"20 - - ");

LCD_Day16x16Ch(16*5,0,0); //星

LCD_Day16x16Ch(16*6,0,1); //期

LCD_Day16x16Ch(16*0,6,2); //农//6行显示正常

LCD_Day16x16Ch(16*1,6,3); //历

LCD_Day16x16Ch(16*3,6,4); //显示月字

LCD_Day16x16Ch(16*6,6,5); //温度计图标

}

void Nongli_Dis()

{

(century,aa,bb,cc); //公历转农历

if (Month_moon==1) {LCD_Nongli(16*2,6,0);} //第7行显示第4列显示“正”月if (Month_moon==2) {LCD_Nongli(16*2,6,1);}

if (Month_moon==3) {LCD_Nongli(16*2,6,2);}

if (Month_moon==4) {LCD_Nongli(16*2,6,3);}

if (Month_moon==5) {LCD_Nongli(16*2,6,4);}

if (Month_moon==6) {LCD_Nongli(16*2,6,5);}

if (Month_moon==7) {LCD_Nongli(16*2,6,6);}

if (Month_moon==8) {LCD_Nongli(16*2,6,7);}

if (Month_moon==9) {LCD_Nongli(16*2,6,8);}

if (Month_moon==10){LCD_Nongli(16*2,6,9);}

if (Month_moon==11){LCD_Nongli(16*2,6,10);}

if (Month_moon==12){LCD_Nongli(16*2,6,11);}

if (Date_moon==1) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,13);} //初一if (Date_moon==2) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,1);} //初二if (Date_moon==3) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,2);}

if (Date_moon==4) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,3);}

if (Date_moon==5) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,4);}

if (Date_moon==6) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,5);}

if (Date_moon==7) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,6);}

if (Date_moon==8) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,7);}

if (Date_moon==9) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,8);}

if (Date_moon==10) {LCD_Nongli(16*4,6,12); LCD_Nongli(16*5,6,9);} //初十

if (Date_moon==11) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,13);} //十一if (Date_moon==12) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,1);}

if (Date_moon==13) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,2);} //十三if (Date_moon==14) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,3);}

if (Date_moon==15) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,4);}

if (Date_moon==16) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,5);}

if (Date_moon==17) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,6);}

if (Date_moon==18) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,7);}

if (Date_moon==19) {LCD_Nongli(16*4,6,9); LCD_Nongli(16*5,6,8);}

if (Date_moon==20) {LCD_Nongli(16*4,6,14);LCD_Nongli(16*5,6,9);} //廿十

if (Date_moon==21) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,13);}

if (Date_moon==22) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,1);}

if (Date_moon==23) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,2);} //廿三if (Date_moon==24) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,3);}

if (Date_moon==25) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,4);}

if (Date_moon==26) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,5);}

if (Date_moon==27) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,6);}

if (Date_moon==28) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,7);}

if (Date_moon==29) {LCD_Nongli(16*4,6,14); LCD_Nongli(16*5,6,8);}

if (Date_moon==30) {LCD_Nongli(16*4,6,2); LCD_Nongli(16*5,6,9);} //三十}

void Time_Week() //从阴历转换数据

{

Conver_week(0,aa,bb,cc);//调用公历换算星期子函数21世纪

//是公历转换星期子函数的运行结果,结果为0-6,0是星期日Week_moon

if(Week_moon==1) LCD_Week(16*7,0,0); //星期一

if(Week_moon==2) LCD_Week(16*7,0,1); //星期二

if(Week_moon==3) LCD_Week(16*7,0,2); //星期三

if(Week_moon==4) LCD_Week(16*7,0,3); //星期四

if(Week_moon==5) LCD_Week(16*7,0,4); //星期五

if(Week_moon==6) LCD_Week(16*7,0,5); //星期六

if(Week_moon==0) LCD_Week(16*7,0,6); //星期日

}

void Time_Dis()

{

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

LCD_Num32x32(0*16,2,Hour/10);

LCD_Num32x32(1*16,2,Hour%10);

LCD_colon32x32(2*16,2,0); //冒号

LCD_Num32x32(3*16,2,Minute/10);

LCD_Num32x32(4*16,2,Minute%10);

LCD_colon32x32(5*16,2,0); //冒号

LCD_Num32x32(6*16,2,Second/10);

LCD_Num32x32(7*16,2,Second%10); //显示五行八列

// LCD_Num64x32(3*32,2,Minute/10);

/*************星期**************/

Time_Week(); //读取农历转换成星期

/*************年份**************/ //可以考虑不需要时时读取

LCD_YMD8x16Ch(8*2,0,Year/10); //6列

LCD_YMD8x16Ch(8*3,0,Year%10);

LCD_YMD8x16Ch(8*5,0,Month/10);

LCD_YMD8x16Ch(8*6,0,Month%10);

LCD_YMD8x16Ch(8*8,0,Date/10);

LCD_YMD8x16Ch(8*9,0,Date%10);

/***************农历显示及转换**********/

Nongli_Dis();

}

Ds18b20.c:

#include "stc12c5a60s2.h"

#include "DS18B20.h"

#include "OLED.h"

sbit DQ=P0^7;

unsigned char tflag;

unsigned int tvalue;

unsigned char Disdata[5];

void Delay_1820(unsigned int x)

{

while(x--);

}

void DS18B20_Rst() //DS18B20复位

{

DQ=1;

Delay_1820(40); //*10以后22M的晶振也可以用

DQ=0;

Delay_1820(1000);

DQ=1;

Delay_1820(400);

}

unsigned char DS18B20_Read()

{

unsigned char i,dat;

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

{

DQ=0;

dat>>=1;

DQ=1;

if(DQ==1)

dat|=0x80;

Delay_1820(100);

}

return(dat);

}

void DS18B20_Write(unsigned char Dat)

{

unsigned char i;

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

{

DQ=0;

DQ=Dat&0x01;

Delay_1820(100);

DQ=1;

Dat>>=1;

}

}

unsigned int READ_18B20_Temperature()

{

unsigned char a,b;

DS18B20_Rst(); //初始化

DS18B20_Write(0xcc);//跳过ROM

DS18B20_Write(0x44);//启动温度转换

DS18B20_Rst();

DS18B20_Write(0xcc);

DS18B20_Write(0xbe);//读数据

a=DS18B20_Read();

b=DS18B20_Read();

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<0x07ff)

tflag=0; //符号标志位

else

{

tvalue=~tvalue+1;

tflag=1;

}

tvalue=tvalue*(0.625);

return(tvalue);

}

void Temperature()

{

Disdata[1]=tvalue%1000/100;//十位数

Disdata[2]=tvalue%100/10; //个位数

LCD_YMD8x16Ch(8*14,6,Disdata[1]); //此处调用年份显示函数,显示温度数据LCD_YMD8x16Ch(8*15,6,Disdata[2]);

}

Oled.h:

#ifndef _OLED_H_

#define _OLED_H_

#define XLevelL 0x00

#define XLevelH 0x10

#define XLevel ((XLevelH&0x0F)*16+XLevelL)

#define Max_Column 128

#define Max_Row 64

#define Brightness 0xCF

#define X_WIDTH 128

#define Y_WIDTH 64

void LCD_Fill(unsigned char bmp_dat); //清屏

void LCD_CLS(void);

void LCD_Init(void); //复位初始化

void LCD_Num16x16(unsigned char x, y, N);//写入幼圆数据0~9 16*16

void LCD_Num32x32(unsigned char x, y, N);//写入幼圆数据0~9 32*32

void LCD_colon32x32(unsigned char x, y, N);//逗号

void LCD_Num64x32(unsigned char x, y, N); //分四次写入

void LCD_Week(unsigned char x, y, N);//转化成一~日

void LCD_YMD8x16Ch(unsigned char x, y, N); //显示阳历年日期

void LCD_Nongli(unsigned char x, y, N); //显示农历日期

void LCD_Day16x16Ch(unsigned char x, y, N); //写入“星期”字符

void LCD_P8x16Str(unsigned char x, y,unsigned char ch[]);

#endif

nongli_H:

#ifndef __nongli_H__

#define __nongli_H__

#define uchar unsigned char

#define uint unsigned int

#include

/*---------------------------------公历转换阴历年份数据表--------------------------------*/

static unsigned char code Year_code[]=

{

万年历电子钟设计报告

课程设计报告课程设计名称 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三态桥),

数字电子课设:万年历的设计

编号 北京工商大学 数字电子技术基础 《万年历的设计》 姓名 学院 班级 学号 设计时间

一、设计目的 1、熟悉集成电路的引脚安排 2、掌握芯片的逻辑功能及使用方法 3、了解数字电子钟及万年历的组成及工作原理 4、熟悉数字电子钟及万年历的设计与制作 5、熟悉multisim电子电路设计及仿真软件的应用 二、设计思路 1、设计60进制秒计数器芯片 2、设计24进制时计数器芯片 3、设计31进制天计数器芯片 4、设计12机制月计数器芯片 5、设计7进制周计数器芯片 6、设计闰年平年不同月份不同进制逻辑 三、设计过程 1、Tr_min and s 60进制计数器芯片: “秒”、“分”电路都六十进制,它由一级十进制计数器和一级六进制计数器组成,六十进制计数器的设计图如下,采用四个片74ls161N串联而成,低位芯片的抚慰信号作为下级输入信号,串接起来构成“秒”、“分”计数器芯片。

2、Tr_hour24进制计数器芯片: 24进制计数器芯片的设计图如下,时计数电路由两片74ls161串联组成。当时个位计数为4,十位计数为2时,两片74ls160N复零,从而构成24进制计数。 3、Tr_day天计数器芯片: 采用两片74ls160N和一片74ls151N串联而成,天计数器的进制受到月计数器反馈M、N影响和年计数器反馈R4的影响,在M、N不收到反馈信息的时候,天计数器为28进制,电路设计图如下:

4、Tr_week周计数器芯片: 周计数器由一块74ls161N构成一个七进制计数器,原理与秒、分、时计数器相似,电路设计图如下 5、Tr_month月计数器芯片: 采用两片74160N和两片74HC151D_2V串联而成,月计数器的反馈信息M、N影响

电子万年历课程设计报告

课程:创新与综合课程设计 电子与电气工程系 实践教学环节说明书 题目名称电子万年历 院(系)电子与电气工程学院 专业电子信息工程 班级119411 学号1109635010 学生姓名11 指导教师q1 起止日期13周周一~14周周五

电子万年历 一.设计目的 设计一个具有报时功能、停电正常运行(来电无需校时)、带有年月日、时分秒及星期显示的电子日历。 二.方案设计 硬件控制电路主要用了AT89S52芯片处理器、LCD1602显示器等。根据各自芯片的功能互相连接成电子万年历的控制电路。软件控制程序主要有主控程序、电子万年历的时间控制程序、时间显示及星期显示程序等组成。主控程序中对整个程序进行控制,进行了初始化程序及计数器、还有键盘功能程序、以及显示程序等工作,时间控制程序是电子万年历中比较重要的部分。时间控制程序体现了年、月、日、时、分、秒及星期的计算方法。时间控制程序主要是定时器0计时中断程序每隔10ms中断一次当作一个计数,每中断一次则计数加1,当计数100次时,则表示1秒到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否1天到了,再判断是否1月到了,再判断是否1年到了,若计数到了则相关变量清除0。先给出一般年份的每月天数。如果是闰年,第二个月天数不为28天,而是29天。再用公式s=v-1 +〔(y-1/4〕-〔(y-1/100〕+〔(y-1/400〕+ d计算当前显示日期是星期几,当调节日期时,星期自动的调整过来。闰年的判断规则为,如果该年份是4或100的整数倍或者是400的整数倍,则为闰年;否则为非闰年。在我们的这个设计中由于只涉及100年范围内,所以判断是否闰年就只需要用该年份除4来判断就行了。 三.系统的设计框图 本系统以AT89S52单片机为核心,结合时钟芯片DS1302,LCD1602,键盘等外围器件,实现电子万年历的一系列功能,并通过液晶屏和按键控制完成人机交互的功能。系统总体设计框图如图(1)所示

电子时钟万年历设计

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

在日常生活中,手表,闹钟是不可或缺的。在实际生活生产活动中,也要考虑时间的因素,如工时的计算,霓虹灯的亮灭。 因为集成电路制造技术的不断提高,出现了高性能、高可靠的集成芯片。电子时钟在工业领域,日常生活中得到了广泛的应用。电子时钟在性能方面具有精度高,实时性好,易于调整等优点。这些使得温度控制系统的研究和开发得到的各方面的广泛关注和支持。 本次课程设计,我利用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.输入画面设计 内容及要求:①密码及口令:输入,核查及修改功能。②年份:输入及判断功能。如:年份值是否为4位整数,不为4位,提示用户重输。 3.日历计算功能设计 ①求某年某月某日是星期几的子功能。(要求编成子程序) 算法:s=(y-1)+(y-1)/4-(y-1)/100+(y-1)/400+c (其中:y为年份;c为某月某日是这一年的第几天,由②求出;s为总天数。“/”为整除。) n=s%7 (其中:n为星期数;“%”为求余数)

②求某月某日是这一年的第几天的子功能。(要求编成子程序) 二月份是否为平年(28天)或闰年(29天)的算法: y/400=0∨y/4=0∧y/100≠0 (y为年份;“/”整除),则y为以闰年;否则,y为平年。 根据①②可求出一年中的日历。 4.日历输出功能设计。 ①格式及显示设计 显示要求:设置显示滚动区;在该区中每次显示4个月的日历(并列排列)。 ②日历打印设计:将日历按年存入磁盘不同的文件中保存,供打印或 再次显示使用。 1.程序系统总体功能模块调用图及模块功能说明 封面程序的功能是显示欢迎信息,并且显示制 作人的信息的;验证用户名和密码的程序是验证用 户是否是合法的用户的,该程序要有容错的功能; 万年历程序是主程序,该程序的功能是通过用户输 入年和月,来查询日历的,并且该程序还可以判断 输入的年份是平年还是闰年。封底程序是用来显示 用户退出万年历系统的时候,一个感谢用户使用万 年历的界面的。

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

多功能时钟(万年历) 设 计 报 告 专业电子信息科学与技术 班级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”

基于单片机电子万年历的毕业设计说明

单片机课程设计报告 电子万年历设计 姓名:建强 学号: 专业班级: 08电气(2)班指导老师:吴永 所在学院:科技学院 2011年6月30日

摘要 随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。 综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大限制,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不可能很好的实现。 具体实现功能: (1)显示年月日时分秒及星期信息 (2)具有可调整日期和时间功能 (3)与即时时间同步

目录 1方案论证 (3) 1.1单片机芯片的选择方案和论证 (3) 1.2显示模块选择方案和论证 (3) 1.3时钟芯片的选择方案和论证 (4) 1.4电路设计最终方案决定 (4) 2系统的硬件设计与实现 (5) 2.1电路设计框图 (5) 2.2系统硬件概述 (5) 2.3主要单元电路的设计 (5) 2.3.1单片机主控制模块的设计 (5) 2.3.2时钟电路模块的设计 (6) 2.3.3电路原理及说明 (7) 2.3.4显示模块的设计 (8) 3系统的软件设计 (9) 3.1程序流程框图 (9) 4测试与结果分析 (11) 4.1硬件测试 (10) 4.2软件测试 (10) 4.3测试结果分析与结论 (10) 4.3.1 测试结果分析 (10) 4.3.2 测试结论 (10) 5prodeus软件仿真........................................ ..........错误!未定义书签。 5.1Proteus ISIS简介 (12) 5.2Proteus运行流程 (13) 5.3Proteus功能仿真 (13) 6课程设计总结与体会.......................................... .....错误!未定义书签。 参考文献...........................................................错误!未定义书签。 附录一:系统电路图.................................................错误!未定义书签。 附录二:系统程序...................................................错误!未定义书签。

电子万年历

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

摘要 本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒及星期信息,并具有可调整日期和时间功能。 我选用的是单片机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脚相连。滑动变阻器用于调整液晶显示的亮度。电路如图

数字万年历毕业设计

数字万年历毕业设计 目录 第一章数字万年历需求分析 (1) §1-1万年历的概念 (1) §1-2需求分析 (1) 第二章系统的硬件设计与实现 (2) §2-1系统电路示意图 (2) §2-2驱动电路 (2) §2-3时钟控制电路 (3) §2-4所需主要器件 (4) §2-5系统硬件概述 (4) 第三章系统的软件设计 (17) §3-1程序流程框图 (17) §3-2程序设计 (19) 第四章安装与调试 (25) §4-1安装 (25) §4-2调试 (25) §4-3软、硬件测试 (26) 4-3-1硬件测试 (26) 4-3-2软件测试 (26) §4-4测试结果分析与结论 (27) 4-4-1测试结果分析 (27) 4-4-2测试结论 (27) 第五章总结 (27) 致谢 (28) 参考文献 (29)

第一章数字万年历需求分析 §1-1万年历的概念 万年历我国古代传说中最古老的一部太阳历。为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。而现在所使用的万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用,与原始历法并无直接联系。万年历只是一种象征,表示时间跨度大。 §1-2需求分析 在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表。钟表的发展是非常迅速的,从刚开始的机械式钟表到现在普遍用到的数字式钟表,即使现在钟表千奇百怪,但是它们都只是完成一种功能——计时功能,只是工作原理不同而已,在人们的使用过程中,逐渐发现了钟表的功能太单一,没有更大程度上的满足人们的需求。因此在这里,我想能不能把一些辅助功能加入钟表中去。在此设计中所设计的钟表不但具有普通钟表的功能,它还能实现额外的功能:世界时间、农历显示。 改革开放30年来,中国电子万年历市场从无到有,从小到大、从总量快速扩张到结构明显升级,逐步形成了有中国特色的多样化、多层次的消费市场。电子万年历市场规模比改革初期扩大了几倍乃至几十倍,其发展成就令世人瞩目。 同时随着数字技术网络技术飞速发展,今天数字万年历也得到了迅猛的发展。万年历早超越了单纯的钟表只显视时间的结构,它已经了发展成为一套完整的系统。它在日常生活发挥着巨大的作用人们对它需求也越来越高。 本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行,此外结合音乐闹铃电路、看门狗和供电电路。本方案设计出的万年历可以显示日期时间、世界时、农历,设置闹铃功能。

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

一、项目介绍与设计目的 基于单片机的电子时钟万年历为实现电子万年历的功能,采用单片机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显示电路 振荡器 呈期廿数 楼时电路? 译码显示电路疋* 千 百 十个

电子万年历的设计与实现

毕业设计(论文)任务书 题目:电子万年历的设计与实现 任务与要求: 设计一以单片机为核心控制的万年历,具有多项显示和控制功能。要求:准确计 时,以数字形式显示当前年月日、星期、时间; 具有年月日、星期、时间的设置和调整功能;自行设计所需直流电源 时间: 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

万年历C++课程设计报告

徐州师范大学科文学院本科生课程设计 课程名称:计算机程序设计实训 题目:万年历的设计 专业班级:电子信息工程08电信 学生姓名: 学生学号: 日期:2010/12/20 指导教师:姜芳艽 科文学院教务部印制

指导教师签字: 年月日

目录 摘要...................................................错误!未定义书签。 Abstract ...................错误!未定义书签。 1 绪论...................................................错误!未定义书签。 课题的设计......................................................................... 错误!未定义书签。 课题的背景……………………………………………………………………….错误!未定义书签。 课题的目的………………………………………………………………………..错误!未定义书签。 课题的意义………………………………………………………………………..错误!未定义书签。 2 设计方案简述 ..................................................... 错误!未定义书签。 设计总体规划..................................................................... 错误!未定义书签。 实现的功能………………………………………………………………………..错误!未定义书签。 结构模块分析……………………………………………………………………...错误!未定义书签。 3 详细设计 ............................................................. 错误!未定义书签。 设计思路............................................................................. 错误!未定义书签。 设计语言…………………………………………………………………………..错误!未定义书签。 设计程序流程图…………………………………………………………………..错误!未定义书签。 模块详细设计....................................................................... 错误!未定义书签。 大月和小月的定义………………………………………………………………..错误!未定义书签。 闰年与非闰年二月的定义………………………………………………………..错误!未定义书签。 日历表的输出……………………………………………………………………..错误!未定义书签。 4 设计结果及分析.................................................. 错误!未定义书签。 软件测试............................................................................... 错误!未定义书签。 设计成果............................................................................... 错误!未定义书签。 5 总结..................................................错误!未定义书签。 参考文献 ................................................................. 错误!未定义书签。

单片机电子万年历含程序

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单片机在电子行业中有着广泛的应用。

单片机电子万年历课程设计报告书

单片机课程设计 姓名:吕长明 学号:04040804021 专业班级:机电四班

一、单片机原理及应用简介 随着国内超大规模集成电路的出现,微处理器及其外围芯片有了迅速的发展。集成技术 的最新发展之一是将CPU和外围芯片,如程序存储器、数据存储器、并行、串行I/O口、定时/计数器、中断控制器及其他控制部件集成在一个芯片之中,制成单片计算机(Single-Chip Microcomputer)。而近年来推出的一些高档单片机还包括有许多特殊功能单元,如A/D、D/A转换器、调制解调器、通信控制器、锁相环、DMA、浮点运算单元等。因此,只要外加一些扩展电路及必要的通道接口就可以构成各种计算机应用系统,如工 业控制系统、数据采集系统、自动测试系统、万年历电子表等。 二、系统硬件设计 8052 是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图图1: 图1 8052引脚 P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 P3.0~P3.7 P2口8位双向口线(在引脚的10~17号端子)。 8052芯片管脚说明: VCC:供电电压。 GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用

于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如表1所示: 表1 特殊功能口 P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

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

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

基于单片机的多功能电子万年历设计开题报告

毕业设计开题报告 1.结合毕业设计课题情况,根据所查阅的文献资料,撰写2000字左右的文献综述: 文献综述 一、本课题研究背景 单片机从20世纪70年代末出现后,以其卓越的性能,得到了广泛的应用,已经深入到各个领域。单片机芯片本身是按工业测控环境要求设计的,分为民用、工业品、军品,其中工业品和军品具有较强的适合恶劣环境的能力[1]。由于单片机本身就是一个计算机系统,因此,只要在单片机的外围适当加一些必要的扩展电路及通道接口,就可有构成各种应用系统,如控制系统、数据采集系统、自动控制系统、自动测试系统、检测监视系统、智能仪表、功能模块等[2]。单片机的应用领域十分广泛,自20世纪80年代以来,单片机的应用已经深入到工业、农业、国防、科研、机关、教育、商业以及家电、生活、娱乐、玩具等各个领域中。单片机应该在检测、控制领域中,具有以下特点:1)小巧灵活、成本化、易于产品化。2)可靠性好,适用范围广[3]。 近年来,电子钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来了极大的方便。随着技术的发展,人们已不再满足于钟表原先简单的计时功能,希望出现一些新的功能,诸如日历的显示、闹钟的应用等,以带来更大的方便,而所有这些,又都是以数字化的电子时钟为基础的。因此,研究实用电子时钟及其扩展应用,有着非常现实的意义,具有很大的实用价值[4]。 由于数字集成电路技术的发展和采用了先进的石英技术,现代电子钟具有走时准确、性能稳定、制作维修简单等优点,弥补了传统钟表的许多不足之处[5]。我们利用单片机技术设计制作的电子万年历, 可以很方便的由软件编程进行功能的调整和改进,使其在能够准确显示年、月、日、时间、星期的同时,还能具有很多其他的功能[6]。如设定闹钟、语音报时、阴阳历的转换、二十四节气的显示等,有一定的新颖性和实用性,同时体积小、携带方便,使用也更为方便,具有技术更新周期短、成本低、开放灵活等优点,具备一定的市场前景。这里要介绍的就是一款可满足使用者特殊要求,输出方式灵活、计时准确、性能稳定、维护方便的实用电子万年历[7]。

相关文档
最新文档