当前位置:文档之家› 电子万年历源程序

电子万年历源程序

电子万年历源程序
电子万年历源程序

电子万年历源程序

IO口程序

#include //*****数码管引脚*****

sbit L1 = P2^0。

sbit L2 = P2^1。

sbit L3 = P2^2。

sbit LEDC= P2^3。

#define LED_DA TA P0//按键接口定义#define K_Port P2

sbit K_D = P3^3。 //外部中断1 //*****PCF8563接口定义****

sbit PCF8563CLK=P1^0。

sbit PCF8563SDA=P1^1。// 24c02接口定义

sbit E2PCLK=P1^5。

sbit E2PSDA=P1^6。//蜂鸣器接口定义

sbit BEEP = P1^2

主程序

#include

void Delay_1ms(unsigned int time>

{

unsigned char temp。

while(time-->

for(temp=127。temp>0。temp-->

_nop_(>。

}//系统初始化

void Sys_Init(>

{

TMOD=0x01。

TH0=(65535-20000>/256。//给定时器初值。

TL0=(65535-20000>%256。

TR0=1。//启动定时器T0

ET0=1。//允许T0中断

EA=1。

LEDC=0。//138正常工作Beep_Flag=1。//闹铃开

}//刷新数码管显示

void Fresh_Display(>

{

static unsigned char Num。

unsigned char temp。

static unsigned int Flash_Time。Num++。

if(Num>=8>

Num=0。

LED_DATA=0x00。//P0口全部为零

if(Num==0>

{

L3=1。L2=1。L1=1。 //第八个数码管亮

}

else if(Num==1>

{

L3=1。L2=1。L1=0。//第七个数码管亮

}

else if(Num==2>

{

L3=1。L2=0。L1=1。//第六个数码管亮

}

else if(Num==3>

{

L3=1。L2=0。L1=0。//第五个数码管亮

}

else if(Num==4>

{

L3=0。L2=1。L1=1。//第四个数码管亮

}

else if(Num==5>

{

L3=0。L2=1。L1=0。//第二个数码管亮

}

else if(Num==6>

{

L3=0。L2=0。L1=1。//第一个数码管亮

}

else if(Num==7>

{

L3=0。L2=0。L1=0。//第零个数码亮

}

Flash_Time++。

LED_ON=0xff。

if(Flash_Time<200>

{

LED_ON=~Flash_Number。

}

else if(Flash_Time>400>

Flash_Time=0。

temp=(1<

if( ( LED_ON & temp>>0 >

{

if((Beep_Flag==1>&&(Num==0>>

LED_DATA=Dis_Tab[Dis_Buffer[N um]]+0x20。

else

LED_DATA=Dis_Tab[Dis_Buffer[N um]]。

}

else

LED_DA TA=0x00。

}

void Test_Ring(> //这个函数有什么作用?{

unsigned char i,temp_m,temp_h。

temp_m=(F8563RWBuff[2]>>4>*10+(F8563 RWBuff[2]&0x0f>。 //分

temp_h=(F8563RWBuff[3]>>4>*10+(F8563R WBuff[3]&0x0f>。 //时

for(i=0。i<5。i++>

{

if((temp_m==Ring_Buffer[i][0]>&&( temp_h==Ring_Buffer[i][1]>>

{

Ringing=1。//Ring_Buffer[i][1]和Ring_Buffer[i][0]

break。

}

else

Ringing=0。

}

}//定时器0 2.5ms中断

void Timer0(>interrupt 1

{

static unsigned char key_Down_Time。

TH0=(65535-2500>/256。

TL0=(65535-2500>%256。

Fresh_Display(>。 //动态扫描数码管

if(K_D==0> //扫描按键

{

key_Down_Time++。

if(key_Down_Time>3>

{

Key_Value=K_Port>>5。

if(Key_Bak==10> //对于前一次按键值,怎么处理?

{

Key_Flag=1。//置按键标志位。

Key_Bak=Key_Value。//存贮当前按键值。if(Ringing_Time>10> //设定闹铃的时间

Ringing_Time=0。

}

}

}

else //如果没有键按下

{

key_Down_Time=0。

Key_Bak=10。

}

if(Ringing_Time>0>

{

Ringing=0。

Ringing_Time--。

BEEP=0。//开闹铃

}

else

{

BEEP=1。//关闹铃

}

if(Ringing==1>

{

Ringing=0。

Ringing_Time=12000。

}

}

void Adjust_Time(>

{

unsigned char position=1。//position 有什么作用?

Adjust_Buffer[0]=(F8563RWBuff[1] >>4>*10+(F8563RWBuff[1]&0x0f> 。//秒Adjust_Buffer[1]=(F8563RWBuff[2] >>4>*10+(F8563RWBuff[2]&0x0f>。 //分。

Adjust_Buffer[2]=(F8563RWBuff[3] >>4>*10+(F8563RWBuff[3]&0x0f>。

{

if(position==1>

{

Flash_Number=0x03。

}

else if(position==2>

{

Flash_Number=0x18。

}

else if(position==3>

{

Flash_Number=0xC0。

}

if(Key_Flag==1>

{

Key_Flag=0。

if(Key_Value==2

{

if(position<3>

position++。} else if(Key_Value==1>//1号键被按下

{

if(position>0>

position--。

}

else

if(Key_Value==3>//++

{

if(position==1>

{

if(Adjust_Buffer[0]<60>

Adjust_Buffer[0]++。

else

Adjust_Buffer[0]=30。

}

else

if(position==2>

{

if(Adjust_Buffer[1]<60>

Adjust_Buffer[1]++。

else

Adjust_Buffer[1]=30。

}

else

if(position==3>

{

if(Adjust_Buffer[2]<24>

Adjust_Buffer[2]++。

else

Adjust_Buffer[2]=12。

}

}

else

if(Key_Value==4> //-- {

if(position==1>

{

if(Adjust_Buffer[0]>0>

Adjust_Buffer[0]--。

else

Adjust_Buffer[0]=30。

}

else

if(position==2>

{

if(Adjust_Buffer[1]>0>

Adjust_Buffer[1]--。

else

Adjust_Buffer[1]=30。

}

else

if(position==3>

{

if(Adjust_Buffer[2]>0>

Adjust_Buffer[2]--。

else

Adjust_Buffer[2]=12。

}

}

else

if(Key_Value==0> //

{

F8563RWBuff[1]=(Dis_Buffer[1]<<4 >+Dis_Buffer[0]。//秒

F8563RWBuff[2]=(Dis_Buffer[4]<<4 >+Dis_Buffer[3]。//分

F8563RWBuff[3]=(Dis_Buffer[7]<<4 >+Dis_Buffer[6]。//时

SetTimeto8563(>。

break。

}

}

Dis_Buffer[0]=Adjust_Buffer[0]%1 0。 //秒

Dis_Buffer[1]=Adjust_Buffer[0]/10。

Dis_Buffer[3]=Adjust_Buffer[1]%10。 //分

Dis_Buffer[4]=Adjust_Buffer[1]/10。

Dis_Buffer[6]=Adjust_Buffer[2]%10。 //时

Dis_Buffer[7]=Adjust_Buffer[2]/10。

}

}

void Adjust_Month(>

{

unsigned char position=1。

Adjust_Buffer[0]=(F8563RWBuff[4]>>4 >*10+(F8563RWBuff[4]&0x0f>。//秒

Adjust_Buffer[1]=(F8563RWBuff[5] >>4>*10+(F8563RWBuff[5]&0x0f>。 //分。

Adjust_Buffer[2]=(F8563RWBuff[6] >>4>*10+(F8563RWBuff[6]&0x0f>。 //时while(1>

{

if(position==1>

{

Flash_Number=0x03。

}

else if(position==2>

{

Flash_Number=0x18。

}

else if(position==3>

{

Flash_Number=0xC0。

}

if(Key_Flag==1>

{

Key_Flag=0。

if(Key_Value==2>

{

if(position<3>

position++。}

else

if(Key_Value==1>

{

if(position>0>

position--。

}

else

if(Key_Value==3> //++

{

if(position==1>

{

if(Adjust_Buffer[0]<32>

Adjust_Buffer[0]++。

else

Adjust_Buffer[0]=15。

}

else

if(position==2>

{

if(Adjust_Buffer[1]<12>

Adjust_Buffer[1]++。

else

Adjust_Buffer[1]=6。

}

else

if(position==3>

{

if(Adjust_Buffer[2]<99>

Adjust_Buffer[2]++。

else

Adjust_Buffer[2]=50。

}

}

else

if(Key_Value==4> {

if(position==1>

{

if(Adjust_Buffer[0]>0>

Adjust_Buffer[0]--。

else

Adjust_Buffer[0]=15。

}

else

if(position==2>

{

if(Adjust_Buffer[1]>0>

Adjust_Buffer[1]--。

else Adjust_Buffer[1]=6。

}

else

if(position==3>

{

if(Adjust_Buffer[2]>0>

Adjust_Buffer[2]--。

else

Adjust_Buffer[2]=50。

}

}

else

if(Key_Value==0> //

{

F8563RWBuff[4]=(Dis_Buffer[1]<<4 >+Dis_Buffer[0]。//秒

F8563RWBuff[5]=(Dis_Buffer[4]<<4 >+Dis_Buffer[3]。//分

F8563RWBuff[6]=(Dis_Buffer[7]<<4 >+Dis_Buffer[6]。//时

SetTimeto8563(>。

break。

}

}

Dis_Buffer[0]=Adjust_Buffer[0]%10。 //秒Dis_Buffer[1]=Adjust_Buffer[0]/10。

Dis_Buffer[3]=Adjust_Buffer[1]%10。//分Dis_Buffer[4]=Adjust_Buffer[1]/10。

Dis_Buffer[6]=Adjust_Buffer[2]%10。 //时

Dis_Buffer[7]=Adjust_Buffer[2]/10。

}

}

void Rewrite_Time(>

{

unsigned char i。

i=1。Flash_Number=0xff。//所有数码管均闪烁

while(1>

{

GetTimeFrom8563(>。

if(Key_Flag==1>

{

Key_Flag=0。

if(Key_Value==6>

{

i++。

if(i==3>

i=1。

}

else if(Key_Value==5> //闹铃键当确认键

{

if(i==1>

{

Adjust_Time(>。//调整整时分秒

_nop_(>。

return。

}

else

if(i==2>

{

Adjust_Month(>。//调整整年月日

_nop_(>。

return。

}

}

else

if((Key_Value>0>&&(Key_Value<5>>

{

return。

}

else

if(Key_Value==7>

{

return。

}

}

if(i==1>

{

Dis_Buffer[0]=(F8563RWBuff[1]&0x0f>。Dis_Buffer[1]=(F8563RWBuff[1]>>4>。

Dis_Buffer[2]=12。Dis_Buffer[3]=(F8563RWBuff[2]&0x0f>。Dis_Buffer[4]=(F8563RWBuff[2]>>4>。

Dis_Buffer[5]=12。Dis_Buffer[6]=(F8563RWBuff[3]&0x0f>。Dis_Buffer[7]=(F8563RWBuff[3]>>4>。

}

else if(i==2>

{

Dis_Buffer[0]=(F8563RWBuff[4]&0x0f>。Dis_Buffer[1]=(F8563RWBuff[4]>>4>。

Dis_Buffer[2]=12。Dis_Buffer[3]=(F8563RWBuff[5]&0x0f>。Dis_Buffer[4]=(F8563RWBuff[5]>>4>。

Dis_Buffer[5]=12。Dis_Buffer[6]=(F8563RWBuff[6]&0x0f>。Dis_Buffer[7]=(F8563RWBuff[6]>>4>。

}

}

}

void Add_Ring(>

{

unsigned char ring_Number=1,position。

Flash_Number=0x00。

while(1>

{

if(Key_Flag==1>

{

Key_Flag=0。

if(Key_Value==4>

{

if(ring_Number>1>

ring_Number--。

}

else if(Key_Value==3>

{

if(ring_Number<5>

ring_Number++。

}

else if(Key_Value==5>//确定进入调整某个闹铃

{

break。

}

else

{

if(Key_Value!=7>

return。

}

}

Dis_Buffer[0]=Ring_Buffer[ring_Number-1][0]%10。

Dis_Buffer[1]=Ring_Buffer[ring_Number-1][0]/10。

Dis_Buffer[2]=12。

Dis_Buffer[3]=Ring_Buffer[ring_Number-1][1]%10。

Dis_Buffer[4]=Ring_Buffer[ring_Number-1][1]/10。

Dis_Buffer[5]=13。

Dis_Buffer[6]=13。

Dis_Buffer[7]=ring_Number。

}

position=1。

while(1>

{

if(position==1>

{

Flash_Number=0x03。

}

else if(position==2>

{

Flash_Number=0x18。

}

if(Key_Flag==1>

{

Key_Flag=0。

if(Key_Value==2>

{

if(position<2>

position++。

}

else

if(Key_Value==1>

{

if(position>0>

position--。

}

else

if(Key_Value==3> //++

{

if(position==1>

{

if(Ring_Buffer[ring_Number-1][0]<59> Ring_Buffer[ring_Number-1][0]++。

else Ring_Buffer[ring_Number-1][0]=30。

}

else

if(position==2>

{

if(Ring_Buffer[ring_Number-1][1]<23> Ring_Buffer[ring_Number-1][1]++。

else Ring_Buffer[ring_Number-1][1]=12。

}

}

else if(Key_Value==4> //-- {

if(position==1>

{

if(Ring_Buffer[ring_Number-1][0]>0>

Ring_Buffer[ring_Number-1][0]--。

else Ring_Buffer[ring_Number-1][0]=30。

}

else

if(position==2>

{

if(Ring_Buffer[ring_Number-1][1]>0>

Ring_Buffer[ring_Number-1][1]--。

else Ring_Buffer[ring_Number-1][1]=12。

}

}

else

if(Key_Value==0>

{

Beep_Flag=1。//打开闹铃

break。

}

}

Dis_Buffer[0]=Ring_Buffer[ring_Number-1][0]%10。 //分

Dis_Buffer[1]=Ring_Buffer[ring_Number-1][0]/10。

Dis_Buffer[3]=Ring_Buffer[ring_Nu mber-1][1]%10。 //时

Dis_Buffer[4]=Ring_Buffer[ring_Number-1][1]/10。

}

}

void main(>

{

unsigned int i。

Delay_1ms(500>。

Sys_Init(>。

Delay_1ms(100>。

Flash_Number=0x00。 //

闪烁控制位为0,所有的位都不闪烁。

while(1>

{

i++。

Flash_Number=0x00。

if(i>200>

{

i=0。

GetTimeFrom8563(>。

Dis_Buffer[0]=(F8563RWBuff[1]&0x0f>。Dis_Buffer[1]=(F8563RWBuff[1]>>4>。

Dis_Buffer[2]=12。Dis_Buffer[3]=(F8563RWBuff[2]&0x0f>。Dis_Buffer[4]=(F8563RWBuff[2]>>4>。

Dis_Buffer[5]=12。Dis_Buffer[6]=(F8563RWBuff[3]&0x0f>。Dis_Buffer[7]=(F8563RWBuff[3]>>4>。

if( Beep_Flag==1>

if(Dis_Buffer[0]==0>//零秒开始闹铃

Test_Ring(>。//判断是否闹铃

}

if(Key_Flag==1>

{

Key_Flag=0。

if(Key_Value==0> //显示年月日时分秒切换

{

GetTimeFrom8563(>。

Dis_Buffer[0]=(F8563RWBuff[4]&0x0f>。Dis_Buffer[1]=(F8563RWBuff[4]>>4>。Dis_Buffer[2]=12。

Dis_Buffer[3]=(F8563RWBuff[5]&0x0f>。Dis_Buffer[4]=(F8563RWBuff[5]>>4>。

Dis_Buffer[5]=12。

Dis_Buffer[6]=(F8563RWBuff[6]&0x0f>。Dis_Buffer[7]=(F8563RWBuff[6]>>4>。

Delay_1ms(500>。

while(1>

{

if(Key_Flag==1>

{ Key_Flag=0。

i=500。

break。

}

}

}

else if(Key_Value==5>//闹铃开关

{

Beep_Flag=~Beep_Flag。

}

else if(Key_Value==6> //修改时间

{

Rewrite_Time(>。

i=500。

}

else if(Key_Value==7> //设置闹铃

{

Add_Ring(>。

i=500。

}

}

}

}

主程序头文件

#include

#include

#include

#include

#include

unsigned char Flash_Number=0x00。 //闪烁位控制<1闪烁,0常亮)

unsigned char LED_ON=0xff。 //第8位数码管显示开关<1显示,0不显示)

unsigned char Dis_Buffer[8]={0,0,0,0,0,0,0,0}。 //8位数码

显示缓冲区

unsigned char code Dis_Tab[]={0x9f,0x06,0x5b,0x4f,0xc6,0xcd,0 xdd,0x07,0xdf,0xcf,0xd3,0xd6,0x40,0x00,0x0 8,0x99,0xd1}。

//显示表格: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, P, H, -, , _, C, F。

// 10 11 12 13 14 15 16

volatile unsigned char idata Ring_Buffer[5][2]。//读写24C02缓冲区

unsigned char Adjust_Buffer[3]。//调整时间缓冲区

unsigned char Key_Time。//按键消抖系数unsigned char Key_Value。//当前按键值

unsigned char Key_Bak。//前一次按键值

bit Key_Flag。//按键标志(1 有新的键被下>

bit Beep_Flag。//闹铃开关(1打开,0关闭>

bit Ringing=0。

unsigned int Ringing_Time。 //闹铃时间void Delay_1ms(unsigned int>。

void Sys_Init(void>。

void Fresh_Display(void>。

子程序(AT24C02读写模块>

#include

#include

#include /*

sbit E2PCLK =P1^4。

sbit E2PSDA =P1^5。

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

**函数名:Start24CX

**功能:I2C的启动信号

**入口: 无

**出口:无

**调用模块:

**备注: 无

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

void Start24CX(>

{

E2PSDA=1。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=1。

_nop_(>。

_nop_(>。

_nop_(>。

E2PSDA=0。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=0。

_nop_(>。

_nop_(>。

_nop_(>。

}//*********************************** ************************************* ********************************

**函数名:Stopt24CX

**功能:I2C的停止信号

**入口: 无

**出口:无

**调用模块:

**备注: 无

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

void Stopt24CX(>

{

E2PCLK=0。

_nop_(>。

_nop_(>。

_nop_(>。

E2PSDA=0。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=1。

_nop_(>。

_nop_(>。

_nop_(>。

E2PSDA=1。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=0。

_nop_(>。

_nop_(>。

_nop_(>。

}

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

**函数名:ACK24CX

**功能:I2C的上的应答信号<读)

**入口: 无

**出口:无

**调用模块:

**备注:

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

void ACK24CX(>

{

unsigned char i=200。

E2PSDA=1。

E2PCLK=0。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=1。

_nop_(>。

_nop_(>。

_nop_(>。

do

{

i--。

if(E2PSDA==0>

{

E2PCLK=0。

return。

}

}

while(i>0>。

E2PCLK=0。

}

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

**函数名:SendACK

**功能:I2C的上的应答信号<写)

**入口: 无

**出口:无

**调用模块:

**备注:

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

void SendACK(>

{

E2PCLK=0。

_nop_(>。

_nop_(>。

_nop_(>。

E2PSDA=0。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=1。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=0。

}//*********************************** ************************************* ********************************

**函数名:NoACK

**功能:I2C的上的应答信号<写)

**入口: 无

**出口:无

**调用模块:

**备注:

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

void NoACK(>

{

E2PCLK=0。

_nop_(>。

_nop_(>。

_nop_(>。

E2PSDA=1。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=1。

_nop_(>。

_nop_(>。

_nop_(>。

E2PCLK=0。

}//*********************************** ************************************* ********************************

**函数名:WriteByteto24CX

**功能:向24C256写一个字节数据

**入口: 无

**出口:无

**调用模块:

**备注:

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

void WriteByteto24CX(unsigned char value> {

unsigned char i。

ACC=value。

for(i=8。i>0。i-->

{

ACC<<=1。

E2PSDA=CY。

E2PCLK=1。

_nop_(>。

_nop_(>。

E2PCLK=0。

}

}//***************************************************************** ************************************* **

**函数名:ReadByteFrom24CX

**功能:从24C256读一个字节数据

**入口: 无

**出口:无

**调用模块:

**备注:

************************************* ************************************* ******************************/ unsigned char ReadByteFrom24CX(>

{

unsigned char i,value。

E2PSDA=1。

for(i=8。i>0。i-->

{

E2PCLK=1。

value<<=1。

value|=E2PSDA。

E2PCLK=0。

}

return value。

}//*********************************** ************************************* ********************************

**函数名:waddr

**功能:24c256 waddr 写地址

**入口: 无

**出口:无

**调用模块:Start24CX(> WriteByteto24CX(> ACK24CX(>

**备注:

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

void waddr(>

{

Start24CX(>。

WriteByteto24CX(0xa0>。

ACK24CX(>。

}//*********************************** *************************************

********************************

**函数名:w16addr

**功能:写16位地址

**入口: address

**出口:无

**调用模块:WriteByteto24CX(m > ACK24CX(>

**备注:

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

void w16addr(unsigned int address>

{

WriteByteto24CX( address>>8 >。

ACK24CX(>。

WriteByteto24CX( address&0xff >。

ACK24CX(>。

}

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

**函数名:WriteDatato24CX

**功能:向24C256写入数据

**入口: f。要写入24C256中的地址

*P。要写入数据的首地址

n。要写入数据的个数

**出口:

**调用模块:WriteByteto24CX(> waddr(> w16addr(> ACK24CX(> Stopt24CX(>

**备注:

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

void WriteDatato24CX(unsigned int f,unsigned char *addr,unsigned char n>

{

waddr(>。

w16addr(f>。

for(。n>0。n-->

{

WriteByteto24CX(*addr>。

ACK24CX(>。

addr++。

}

Stopt24CX(>。

for(f=700。f>0。f-->

_nop_(>。

}

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

**函数名:ReadDataFrom24CX

**功能:从24c256中读出数据

**入口: f。要读24C256中的地址

*P。要读出数据存放的首地址

n。要读出数据的个数

**出口:无

**调用模块: waddr(> w16addr(> raddr(> **备注:

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

void ReadDataFrom24CX(unsigned int f,unsigned char *addr,unsigned char n>

{

waddr(>。

w16addr(f>。

Start24CX(>。

WriteByteto24CX(0xa1>。

ACK24CX(>。

for(。n>0。n-->

{

*addr=ReadByteFrom24CX(>。

SendACK(>。

addr++。

}

*addr=ReadByteFrom24CX(>。

NoACK(>。

Stopt24CX(>。

} /*

main(>

{

uchar a[5]。

a[0]=1。

a[1]=2。

a[2]=3。

a[3]=4。

a[4]=5。

WriteDatato24CX(0,a,5>。

a[0]=0。

a[1]=0。

a[2]=0。

a[3]=0。

a[4]=0。

ReadDataFrom24CX(0,a,5>。

while(1>。

}*/

子程序头文件

#include

void Start24CX(void>。//I2C起动

void Stopt24CX(void>。//I2C停止

void ACK24CX(void>。//I2C应答信号读void SendACK(void>。//I2C应答信号写void NoACK(void>。//I2C应答信号读

void WriteByteto24CX(unsigned char>。 //写一个字节到24CX

unsigned char ReadByteFrom24CX(void>。

//从24CX读出一个字节void waddr(void>。//写器件地址

void w16addr(unsigned int>。//写16位地址

void WriteDatato24CX(unsigned int ,unsigned char *,unsigned char>。//写多个字节到24CX

void ReadDataFrom24CX(unsigned int ,unsigned char *,unsigned char>。//从24CX读出多个字节

子程序(PCF8563时钟芯片>

#include

#include

#include

unsigned char F8563RWBuff[7]={0x00,0x01,0x02,0x03,0x0 4,0x05,0x06}。//保存时间缓冲区

// 星期秒分时日月年

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

**函数名:Start8563

**功能:I2C的启动信号

**入口: 无

**出口:无

**调用模块:

**备注: 无

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

void Start8563(void>

{

PCF8563SDA=1。/*发送起始条件的数据信号*/

PCF8563CLK=1。/*发送起始条件的时钟信号*/ _nop_(>。_nop_(>。/*起始条件建立时间大于4us*/

_nop_(>。_nop_(>。

PCF8563SDA=0。/*发送起始信号*/ _nop_(>。_nop_(>。

_nop_(>。_nop_(>。

PCF8563CLK=0。/*钳住I2C总线,准备发送或接收数据*/

}

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

**函数名:Stop8563

**功能:I2C的停止信号

**入口: 无

**出口:无

**调用模块:

**备注: 无

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

void Stop8563(void>

{

PCF8563SDA=0。

PCF8563CLK=0。

_nop_(>。_nop_(>。

_nop_(>。_nop_(>。

PCF8563CLK=1。

_nop_(>。_nop_(>。

_nop_(>。_nop_(>。

PCF8563SDA=1。

}

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

**函数名:WriteACK8563

**功能:I2C的上的应答信号<写)

**入口: 无

**出口:无

**调用模块:

**备注: 输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1

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

void SendACK(unsigned char ack>

{

PCF8563SDA=ack。

_nop_(>。_nop_(>。

_nop_(>。_nop_(>。

PCF8563CLK=1。

_nop_(>。_nop_(>。

_nop_(>。_nop_(>。

PCF8563CLK=0。

}

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

**函数名:ACK8563

**功能:I2C的上的应答信号<读)

**入口: 无

**出口:无

**调用模块:

**备注: 此处没有接收并判断应答信号是否合理

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

void ACK8563(void>

{

unsigned char errtime=200。 PCF8563SDA=1。

_nop_(>。_nop_(>。

_nop_(>。_nop_(>。

PCF8563CLK=1。

_nop_(>。_nop_(>。

_nop_(>。_nop_(>。

while(PCF8563SDA> //读ACK

{

errtime--。

if(errtime==0>

{

Stop8563(>。

break。

}

}

PCF8563CLK=0。

_nop_(>。

}

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

**函数名:WriteByteto8563

**功能:向PCF8563写一个字节数据

**入口: 无

**出口:无

**调用模块:Delay4us ACK8563

**备注: 先MSB后LSB传送

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

void WriteByteto8563(unsigned char value> {

unsigned char i。

ACC=value。

for(i=8。i>0。i-->

{

ACC<<=1。

PCF8563SDA=CY。

PCF8563CLK=1。

_nop_(>。_nop_(>。

_nop_(>。_nop_(>。

PCF8563CLK=0。

}

ACK8563(>。 //I2C器件或通讯出错,将会退出I2C通讯

}

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

**函数名:ReadByteFrom8563

**功能:从PCF8563读一个字节数据

**入口: 无

**出口:bytedata 读出字节数据保存其中

**调用模块:Delay4usC02

**备注: 先MSB后LSB接收

************************************* ************************************* ******************************/ unsigned char ReadByteFrom8563(void>

{

unsigned char i,value。

PCF8563SDA=1。

for(i=8。i>0。i-->

{

PCF8563CLK=1。

value<<=1。

value|=PCF8563SDA。

PCF8563CLK=0。

}

return(value>。

}

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

**函数名:WriteDatato8563

**功能:向PCF8563的存储器某个地址写一个字节数据

**入口: address 要写入的地址

** mdata 要写入的数据

**出口:无

**调用模块:Start8563 WriteByteto8563 Stop8563

**备注: 无

************************************* ************************************* ******************************/void WriteDatato8563(unsigned char address,unsigned char mdata>

{

Start8563(>。

WriteByteto8563(0xa2>。 //写命令

WriteByteto8563(address>。 //写地址

WriteByteto8563(mdata>。 //写数据

Stop8563(>。

}

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

**函数名:ReadDataFrom8563

**功能:从PCF8563的存储器某个地址读一个字节数据

**入口: aaddress 要读的数据的地址

**出口:rdata 读出的数据保存到这个变量

**调用模块:Start8563 WriteByteto8563 Stop8563 ReadByteFrom8563

**备注: 无

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

/*unsigned char ReadDataFrom8563(unsigned char address>

{

unsigned char rdata。

Start8563(>。

WriteByteto8563(0xa2>。 //写命令

WriteByteto8563(address>。 //写地址

Start8563(>。

WriteByteto8563(0xa3>。 //读命令

rdata=ReadByteFrom8563(>。

SendACK(1>。

Stop8563(>。

return(rdata>。

}*/

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

**函数名:ReadnDataFrom8563

**功能:从PCF8563的存储器某个地址读多个字节数据

**入口: address 读的数据的首地址

** count 要读多少数据

** buff 读出数据保存的首地址

**出口:buff 读出数据保存的首地址**调用模块:Start8563 WriteByteto8563 Stop8563 ReadByteFrom8563 SendACK

**备注: 无

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

void ReadnDataFrom8563(unsigned char address,unsigned char count,unsigned char *buff>

{

unsigned char i。

Start8563(>。

WriteByteto8563(0xa2>。 //写命令

WriteByteto8563(address>。 //写地址

Start8563(>。

WriteByteto8563(0xa3>。 //读命令

for(i=0。i

{

buff[i]=ReadByteFrom8563(>。

if(i

{SendACK(0>。}

}

SendACK(1>。

Stop8563(>。

}

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

**函数名:ReadTimeFrom8563

**功能:从PCF8563的读出时间信息

**入口: 无

**出口:F8563RWBuff[0-6] 全局变量,保存:星期、秒、分、时、日、月和年

**调用模块:ReadnDataFrom8563

**备注:读到的时间数据存放在缓存中,世纪默认为20

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

void ReadTimeFrom8563(void> {

unsigned char temp,i。

ReadnDataFrom8563(0x02,0x07,F8563RWBu ff>。

F8563RWBuff[0]&=0x7f。//秒

F8563RWBuff[1]&=0x7f。//分

F8563RWBuff[2]&=0x3f。//小时

F8563RWBuff[3]&=0x3f。//日

F8563RWBuff[4]&=0x07。//星期

F8563RWBuff[5]&=0x1f。//月

F8563RWBuff[6]&=0xff。//年

temp=F8563RWBuff[4]。

for(i=4。i>0。i-->

F8563RWBuff[i]=F8563RWBuff[i-1]。

F8563RWBuff[0]=temp。

}

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

**函数名:GetTimeFrom8563

**功能:从PCF8563的读出时间信息并校验

**入口: 无

**出口:F8563RWBuff[0-6] 全局变量,保存秒、分、时、日、月和年

**调用模块:ReadTimeFrom8563

**备注:读到的时间数据并校验

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

void GetTimeFrom8563(void>

{

ReadTimeFrom8563(>。

if(F8563RWBuff[0]==0>

ReadTimeFrom8563(>。

//如果为秒=0,为防止时间变化,再读一次

}

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

**函数名:SetTimeto8563

**功能:设置PCF8563的时间

**入口: F8563RWBuff 全局变量,保存秒、分、时、日、月和年

**出口:无

**调用模块:WriteDatato8563

**备注:无

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

void SetTimeto8563(void>

{

unsigned char i。

F8563RWBuff[0]=F8563RWBuff[1]。

F8563RWBuff[1]=F8563RWBuff[2]。

F8563RWBuff[2]=F8563RWBuff[3]。

F8563RWBuff[3]=F8563RWBuff[4]。

F8563RWBuff[4]&=0x07。

for(i=2。i<=8。i++>

//写入PCF8563的地址为从0x02-0x08

WriteDatato8563(i,F8563RWBuff[i-2]>。

} /************************************ ************************************* *******************************

**函数名:Init8563

**功能:初始化PCF8563

**入口: 无

**出口:无

**调用模块:WriteDatato8563

**备注:无

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

/*void Init8563(void>

{

WriteDatato8563(0x00,0x00>。 //普通模式,电源复位功能无效

WriteDatato8563(0x01,0x00>。 //设置寄存器1,关闭所有中断

WriteDatato8563(0x0d,0x00>。//CLKOUT输出被禁止

WriteDatato8563(0x0e,0x00>。 //定时器无效

WriteDatato8563(0x0f,0x00>。 //定时计数器清零

}*/

子程序头文件

#include

extern unsigned char F8563RWBuff[]。//保存时间缓冲区

// 星期秒分时日月年

void Start8563(void>。//I2C起动应答

void Stop8563(void>。//I2C停止应答

void SendACK(unsigned char>。//写应答信号

void ACK8563(void>。//读应答信号

void WriteByteto8563(unsigned char>。//写一个字节到PCF8563 unsigned char ReadByteFrom8563(void>。//从PCF8563读一个字节

void WriteDatato8563(unsigned char ,unsigned char>。 //向PCF8563某个地址写入一个字节//unsigned char ReadDataFrom8563(unsigned char>。//从PCF8563某个地址读出一个字节

void ReadnDataFrom8563(unsigned char ,unsigned char ,unsigned char *>。//从PCF8563某个

地址读出多个字节

void ReadTimeFrom8563(void>。//从PCF8563读出时间

void GetTimeFrom8563(void>。//从PCF8563读出时间并判断是否读错void SetTimeto8563(void>。//设置时间

//void Init8563(void>。//初始化

万年历系统设计方案和对策

电子万年历系统设计 The design of Electronic calendar system 专业:电子信息科学与技术 学号: 姓名:

电子万年历系统设计 摘要:近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,并且给人类生活带来了根本性的改变。尤其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。虽然在日常生活中,各种信息处理终端如电脑、手机等给我们提供了准确的时间信息。但是在大多数场合却仅仅局限于个人的适用范围之内。在家居生活中,一款悬挂余居室墙壁上大方得体的电子钟不仅能为我们提供准确的时间显示,而且魅惑了环境,给单调的居室带来了现代化的气息,因而成为许多家庭的必备之选。 本文设计了一种基于八位串行输入-并行输出移位寄存器74HC164芯片,以STC89C52单片机为核心、数码显示的电子万年历,主要介绍了时钟芯片、温度传感器、仿真模块,以及万年历硬件和软件的设计,实现了准确显示,公历年、月、日、农历月、日、时、分、秒功能。 关键字:单片机;时钟芯片;温度传感器;仿真

The Design of Electronic Calendar System Abtract:In recent years, with computer penetration in the social sphere and the development of large-scale integrated circuits, MCU applications are constantly deepening, as it has a function of strong, small size, low power consumption, cheap, reliable, easy to use , And other characteristics, and therefore particularly suited to control the system and to human life brought about fundamental changes. SCM is by the application of technology products have entered the tens of thousands of households. The emergence of electronic calendar to the lives of people of many convenience. While in everyday life, dealing with all kinds of information terminals such as computers, mobile phones has provided us with accurate time information. However, in most occasions is limited to individuals within the scope of the application. In home life, hoisted more than a generous living room walls of the appropriate electronic bell can not only provide us with accurate time, and tantalized by the environment, bring to the monotonous room a modern flavor, so many families must Of the election. In this paper, a design based on eight serial input - output parallel shift register 74 HC164 chip to STC89C52 microcontroller as the core, digital display electronic calendar, mainly on the clock chip temperature sensor, simulation modules, hardware and calendar And software design, to achieve an accurate, the calendar year, month, day and the Lunar month, day, hours, minutes and seconds functions.

#基于单片机的多功能电子万年历设计

引言 随着生活节奏的日益加快,人们的时间观也越来越重,同时对电子钟表、日历的需求也随之提高。因此,研究实用电子时钟及其扩展使用,有着非常现实的意义,具有很大的实用价值。 本系统程序由主程序、中断服务函数和多个子函数构成。主函数主要完成各子函数和中断函数的初始化。定时中断函数主要完成时钟芯片的定时扫描及键盘扫描。时钟芯片的读写函数主要是将时间、日历信息读出来,并把要修改具体值写入时钟芯片内部。 系统的硬件设计和电路原理 电路设计框图 系统硬件概述 本电路是由AT89S52单片机为控制核心,具有在线编程功能、低功耗、能在3V的超低压工作。时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,工作电压为2.5V~5.5V。采用三线接口和CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长、精度高和低功耗等特点,同时具有掉电自动保存功能。 主控制模块 单片机主控制模块的设计 AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。 时钟电路模块 时钟电路模块的设计 DS1302的引脚排列如图3所示,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768KHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

C语言实训--万年历源代码

# include #include #include #include #include # define YEAR 365 int numday[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31}, {31,29,31,30,31,30,31,31,30,31,30,31}}; int leap(int year); int calday(int y,int m); int counterdays(int year,int month,int day); int week(int year,int month,int day); int eachyeartotal(int year,int month,int day); int maxDay(int y,int month); void print(int y,int m,int w); void festival (int year,int month,int day); int IsLeap(int y); int guanli(int i); void rili(int year,int month); int rili1(); void rili2(); void rili3(); void rili4(); void rili5(); void fan(); void show(int year,int month,int date,int sec,int mini,int hour); int main() { int i; printf("***************************************\n"); printf("1.查询日历,输入年份:\n"); printf("2.查询该月日历及对应星期,输入年份和月份:\n"); printf("3.查询星期几及节日,输入年月日:\n"); printf("4.距您输入日期还有多少天,输入日期:\n"); printf("5.通过键盘上下控制不同年月日:\n"); scanf("%d",&i); guanli(i); return 0; } int guanli(int i) { switch(i) { case 1:rili1();return main();

电子万年历设计

课程论文论文题目基于单片机的电子万年历设计 课程名称单片机原理及接口技术 专业年级 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脚相连。滑动变阻器用于调整液晶显示的亮度。电路如图

万年历系统源代码

#include #include #include #include #include #define KEYNUMUp 0x48 #define KEYNUMDown 0x50 #define KEYNUMLeft 0x4b #define KEYNUMRight 0x4d #define KEYNUMPageUp 0x49 #define KEYNUMPageDown 0x51 int year,month,day; //全局变量记录时间 int daysOfMonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31, 31,30,31, 30,31}}; int runYear(int year) //判断是否是闰年 { int flag=0; if(year%400==0||(year%4==0&&year%100!=0)) flag=1; return flag; } struct tm* getDay()//从系统取得当前时间 { time_t timer; struct tm* gmt; time(&timer); gmt=localtime(&timer); return gmt; } int dayExame(int year,int month,int day)//检查日期是否正确 { if(year<0||month<1||month>12||day<1||day>31) return 0; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10:

单片机AT89c52电子万年历设计(带程序)

目录 一、摘要 (2) 二、设计 (3) 三、设计任务. (2) 四、设计要求 (3) 五、系统方案设计 (3) 1、系统 (3) 1)原理构成框图 (3) 2)设计思路 (4) 2、主程序设计 (4) 3、中断程序设计 (5) 5、时间调整电路的设计 (7) 六、系统评价 (7) 七、c语言程序注释及说明 (8)

一、摘要 单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。本设计是基于AVR单片机强大的控制功能制作而成的电子万年历,该电子万年历包括四大功能:实时显示年、月、日、时、分、秒、星期;人为的校正年、月、日、时、分、星期;第一次开机显示12-00-30。 二、设计目的 1、掌握C52程序用于实践并实现相应的功能; 2、掌握时钟程序的使用方法; 3、掌握时间函数的使用方法; 4、掌握键盘的程序使用方法; 三、设计任务 通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,

七个按钮连接P0口可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术指标。 四、设计要求 (1)能够准确的计时,时间可在数码管上显示出来,默认显示为时、分、秒,每隔一分钟自动显示年、月、日及星期,也可通过按键控制显示,并可通过按键调节时间。 (2)第一次开机显示12-30-30。 (3)每半秒led彩灯闪烁一次 五、系统方案设计: 1、系统总体设计: 1) 原理构成框图 本设计用AT89C52作为核心控制部分,外接晶振电路与复位电路,以两个四位数码管作为显示部分,开关控制显示时间与日期,具体框图如图1所示,数码管框图如图2所示:

多功能电子万年历课程设计

课程设计(论文) 题目名称多功能电子万年历课程设计 课程名称单片机原理及应用 2012年6月18 日

摘要 本设计基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。 关键词:AT89C51;电子万年历; DS1302

目录 1 绪论 (1) 1.1课题研究的背景 (1) 1.2课题的研究目的与意义 (1) 1.3课题解决的主要内容 (1) 2 系统的总体设计 (1) 2.1系统方案构思 (2) 2.2系统硬件框图 (2) 3 系统硬件的设计 (3) 3.1.1 器件的选用 (3) 3.1.2 AT89C51单片机 (3) 3.1.3单片机的选择 (6) 3.1.4 显示电路 (7) 3.1.5 ds1302时钟电路 (11) 4 系统软件的设计 (14) 4.1 算法设计、流程图、主程序 (14) 4.2 从1302读取日期和时间程序 (15) 5 系统仿真 (16) 5.1仿真环境PROTEUS (16) 5.2用PROTEUS ISIS对电子万年历的硬件电路设计 (16) 5.3用PROTEUS ISIS进行电子万年历的仿真测试 (20) 结论 (23) 致谢 (24) 参考文献 (25) 附录 (26) 附录1 (26)

java课程设计 万年历 源代码

华北科技学院 课程设计报告 面向对象程序设计(Java) 班级: 电商B09-3 姓名: 周婷玉 设计题目:__________万年历________________ 设计时间: 2011-12-28 至2012-01-06 指导教师:_______ 郭慧____________ _____ 评语:_________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:___________评阅教师:_____________

课程设计说明书 1、课程设计的目的 a)掌握面向对象程序设计基本要素(封装、继承、多态) b)掌握JA VA语言常用类包及其常用方法和JA VA语言基本语法 c)掌握基于AWT的图形用户界面设计 i.常用标准控件的使用,如标签、按钮、菜单、文本框、单选按钮、 滚动条等。 ii.事件处理机制 d)掌握布局、对话框的使用 e)掌握发布JA VA应用程序 2、功能模块简介和系统结构图 需求分析:本程序的要求为: 1.使用图形用户界面 2.能够实现日期与星期的查询 3.实现当日的时间备忘 功能设计: 1.能以月历形式显示日期与星期 2.支持用户自己输入年份,并提供月份的下拉形式来选择查询 3.添加当日行事历,储存与清除功能

电子万年历的设计与实现

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

电子万年历

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

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

单片机电子万年历含程序

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

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

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

基于AT89C51单片机的多功能电子万年历的设计

. . .. . . 单片机应用系统设计 课题:基于AT89C51单片机的多功能电子万年 历的设计 姓名: 班级: 学号: 指导老师: 日期: .. .专

目录 一.绪言 (3) 二.系统总体方案设计 (3) 三.硬件系统设计: (4) 四.系统软件设计 (5) 五.设计总结 (8) 六.参考文献 (8) 七.附录 (9)

一.绪论 随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。 本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。 万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。 本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。 二.系统总体方案设计 1.系统设计硬件框图 2.实现的基本原理 在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给

数字万年历简易C语言程序源代码

#include"reg52.h" #define uchar unsigned char #define uint unsigned int sbit rs=P2^0; // lcd 控制端 sbit en=P2^2; // lcd 控制端 sbit all=P2^1; // lcd 控制端 sbit s0=P1^5; //时间调节 sbit s1=P1^6; sbit s2=P1^7; sbit voice=P2^7; int nt; sbit DQ=P2^6; sbit DS1302_CLK = P2^3; //实时时钟时钟线引脚sbit DS1302_IO = P2^4; //实时时钟数据线引脚sbit DS1302_RST = P2^5; //实时时钟复位线引脚sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; unsigned char time; #define ads_y 0 #define ads_mo 3 #define ads_d 6 #define ads_w 9 #define ads_h 65 #define ads_m 68 #define ads_s 71 #define DS1302_SECOND 0x80 //写入ds地址宏定义 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C

电子万年历

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

多功能电子万年历课程设计报告

重庆三峡学院 课程设计报告书题目:基于可调的电子万年历与温度显示 学院(系): 年级专业: 学号: 学生姓名: 指导教师: 教师职称: 完成日期年月日

目录 摘要 (3) 第一章引言 (4) 1.1 设计任务 (4) 1.2 设计目的 (4) 1.3 设计思路 (4) 1.3.1 方案论证 (4) 1.3.2 芯片的选择 (5) 1.3.3 显示模块选择方案和论证 (5) 1.3.4 时钟信号的选择方案和论证 (5) 1.3.5 最终方案 (6) 第二章硬件系统的设计 2.1原理图设计 (6) 2.2温度感应电路 (7) 2.3 复位电路部分 (7) 2.4液晶显示电路 (7) 2.5时钟信号电路 (8) 2.6 AT89C52原理及说明 (8) 2.6.1引脚功能 (9) 第三章软件系统的设计. 3.1系统程序流程图 (9) 3.2系统具体程序代码 (10) 第四章系统调试 (23) 4.1 软件调试 (23) 4.2 硬件调试 (23) 第五章设计心得 (23) 元件清单表 (24) 致谢 (24) 参考文献 (24)

基于可调式电子万年历与温度显示的设计 重庆三峡学院应用技术学院 5人 摘要:本文介绍了一种基于单片机的可调的电子万年历和温度显示。该设计主要由五个模块组成:微处理器(单片机),温度传感器,控制调节按键,实时时钟模块及显示模块。温传感器器主要由DS18B20来完成,它负责把采集到的温度传给单片机。实时时钟模块主要由DS1302构成,它负责产生始终数据送给单片机,微处理器芯片AT89C52来完成DS18B20,DS1302,按键传来的数据进行处理,并送与显示模块(LCD1602)进行显示。 该系统的电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。可以测量-55°到+125°的温度和显示年,月,日,星期,时,分,秒,并且可通过按键调节时间。 关键词单片机;万年历;温度;AT89C52;LCD1602,DS1302,DS18B20

51单片机实现万年历程序文件

51单片机实现万年历 利用AT89S52单片机的P0口来和另外几个口来控制1602液晶的显示和P1口还有其它口来控制ds12887时钟芯片。设置四个按键,1个定义为时间设置功能键,一个定义为闹钟设置功能键,另外两个用来调节时间的增减。 原理图: pcb图:

源程序: #include #define uint unsigned int #define uchar unsigned char sbit beep=P2^0;//蜂鸣器控制口 sbit timeadd=P2^1;//调节时间加 sbit timesub=P2^2;//调节时间减 sbit timeclk=P2^3;//闹钟设定键 sbit timefun=P2^4;//时间设定键 sbit lcdrs=P2^5;//液晶的命令和数据控制口 sbit ledrw=P2^6;//液晶的写数据口 sbit lcden=P2^7;//液晶显示模块的使能端 sbit timeds=P3^3;//时钟芯片地址闸 sbit timerw=P3^4;//时钟芯片读写 sbit timeas=P3^5;//时钟芯片地址闸 sbit timeen=P3^6;//时钟芯片片选 uchar code table[]="20 - - week "; uchar code table1[]=" : : ";//要显示的字符串 char num,shi,fen,miao,nian=2000,yue,ri,week,numfun,anumfun,flag,flag1; uchar leap;

void delay(uint x){ uchar i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void didi() { beep=0; delay(1000); beep=1; delay(1000); } void write_(uchar ){ lcdrs=0; P0=; delay(5); lcden=1; delay(20); lcden=0; } void write_date(uchar date){ lcdrs=1; P0=date; delay(5); lcden=1; delay(20); lcden=0; } void write_sfm(uchar add,uchar date){ uchar shi,ge; shi=date/10; ge=date%10; write_(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); } void write_nyr(uchar add,uchar date){ uchar shi,ge; shi=date/10; ge=date%10;

万年历电子系统设计方案

万年历电子系统设计方案 一、设计要求与方案论证 1.1 项目设计容、功能、指标: (1)基本要求 ①具有年、月、日、时、分、秒等功能; ②具有自动判别闰年闰月的功能 ③有一路闹钟 ( 2 ) 创新要求 ①具有闹钟功能,时间到后蜂鸣器响,led灯亮。 ②设置的时间日期掉电不丢失 ③具有温度计功能; 1.2项目设计方案和比较 1.2.1单片机芯片的选择方案和论证: 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。 方案二: 采用STC89C52,片ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。 所以选择采用AT89S52作为主控制系统. 1.2.2 显示模块选择方案和论证: 方案一: 采用Lcd液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。 方案二: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示. 方案三: 采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。 由于显示的容较多,采用led数码管不方便,所以采用了LCD液晶作为显示。

电子万年历设计

课程论文 论文题目基于单片机的电子万年历设计 课程名称单片机原理及接口技术 专业年级2014级自动化3班 学生姓名孙宏远贾腾飞 学号 2014485420144848 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个时钟周期把含有地址信息的命令字装入移位寄存

万年历系统——C语言完整版

实验十九:编写一个万年历系统 1.设计目的: 从实验的角度来看,这次课程设计一方面可以让自己巩固并加深对C语言程序设计知识的理解,掌握和提高C语言编程和程序的基本调试的基本技能,进一步理解和运用结构化程序的思想和方法;另一方面,可以让自己在面对一个全新的问题时,学会如何思考,如何寻找问题的关键,从而提升自己的能力。 2.总体设计: 1.、当前页以系统当前日期的月份为准,显示当前月的每一天(显示出日及对应的星期几); 2、当系统日期变到下一个月时,系统自动翻页到下一月。 3.调试与测试: 4.源程序清单和执行结果:

#include #include #include #include int leap(int year ) { if ((year %4 == 0) && (year % 100 != 0) || (year % 400 == 0)) { return 1; } return 0; } void show(int year,int month,int date,int sec,int mini,int hour) { const char month_str[][4]={"","Jan","Feb","Mar","Apl", "May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; const int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i,j,wdays,mdays,days; for(i=1,days=0;i

相关主题
文本预览
相关文档 最新文档