您的位置 首页 IC

根据AVR单片机的万年历程序设计

基于AVR单片机的万年历程序设计-#include//寄存器定义文件

#include//使用到宏

#defineucharunsignedchar//数据类型定义

#defineuintunsignedchar//数据类型定义

#defineSD23030x64//SD2303器件IIC识别码

ucharTable[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76};

//显示数据表0123456789LH

ucharData[4]={0,0,0,0};//DS1722

AVR单片机万年历程序

根据AVR单片机的万年历程序设计

根据AVR单片机的万年历程序设计

//***************************FileName:RTC.C************************//

//***************************ICCAVRV6.30编译**********************//

#include//寄存器界说文件

#include//使用到宏

#defineucharunsignedchar//数据类型界说

#defineuintunsignedchar//数据类型界说

#defineSD23030x64//SD2303器材IIC识别码

ucharTable[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76};

//显现数据表0123456789LH

ucharData[4]={0,0,0,0};//DS1722

ucharEnter_Flag;//确认

ucharF_Flag;//数据应对标志

voidDelayMs(uinTI)//延时函数1

{ucharj;

for(;i!=0;i–)

{for(j=2000;j!=0;j–){;}}

}

voidDisplay(uchar*p)//显现函数

{uchari,sel=0x00;

for(i=0;i《16;i++)

{PORTC=sel;

PORTA=Table[p[i]];

DelayMs(10);

sel=sel《《1;

}

}

voidNOPNOP(uchari)//延时函数2

{for(;i!=0;i–)NOP();}

voidSetSCL(uchari)//IIC时钟线SCL设置

{if(i==1)PORTB=PORTB|0x01;

elsePORTB=PORTB&0xFE;}

voidSetSDA(uchari)//IIC数据线SDA设置

{if(i==1)PORTB=PORTB|0x02;

elsePORTB=PORTB&0xFD;}

//SCL=PB^0;SD2303时钟线

//SDA=PB^1;SD2303数据线

//INTRB=PB^3;SD2303中止线A

//INTRA=PB^2;SD2303中止线B

voidStart()//IIC总线开端信号

{SetSDA(1);

SetSCL(1);

NOPNOP(50);

SetSDA(0);

NOPNOP(50);

SetSCL(0);

}

voidStop()//IIC总线中止信号

{SetSDA(0);

SetSCL(1);

NOPNOP(50);

SetSDA(1);

NOPNOP(50);

SetSCL(0);

}

voidAck()//单片机应对信号

{SetSDA(0);

SetSCL(1);

NOPNOP(50);

SetSCL(0);

SetSDA(1);

}

voidNack()//单片机非应对信号

{SetSDA(1);

SetSCL(1);

NOPNOP(50);

SetSCL(0);

SetSDA(0);

}

voidCheck_Ack()//器材应对信号查看

{SetSDA(1);

SetSCL(1);

F_Flag=0;

DDRB=DDRB&0xFD;

if((PINB&0x02)==0)

{SetSCL(0);

NOPNOP(50);}

else

{F_Flag=1;

SetSCL(0);

NOPNOP(50);}

DDRB=DDRB|0x02;

}

voidWrite_Bit0()//向IIC总线写0

{SetSDA(0);

SetSCL(1);

NOPNOP(50);

SetSCL(0);

}

voidWrite_Bit1()//向IIC总线写1

{SetSDA(1);

SetSCL(1);

NOPNOP(50);

SetSCL(0);

SetSDA(0);

}

voidWrite_Byte(ucharData)//向IIC总线写一字节数据

{uchari;

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

{if((Data&0x80)》0)

Write_Bit1();

else

Write_Bit0();

Data《《=1;

}

}

ucharRead_Byte()//从IIC总线读一字节数据

{ucharnn=0xff;

ucharj;

for(j=0;j《8;j++)

{SetSDA(1);

SetSCL(1);

DDRB=DDRB&0xFB;

if((PINB&0x02)==0)

{nn《《=1;

nn=(nn&0xfe);

SetSCL(0);}

else

{nn《《=1;

nn=(nn|0x01);

SetSCL(0);}

}

DDRB=DDRB|0x02;

return(nn);

}

//****************************写N个字节子程序**********************//

//函数参数阐明:

//Slave:IIC器材地址,如上文界说的SD2303

//Address:开端地址

//Array:读数据寄存的数组

//Number:读取的字节数

voidWrite_Nbyte(ucharSlave,ucharAddress,uchar*Array,ucharNumber)

{uchark;

writ:do//开端-》写IIC器材地址-》查看应对位

{Start();

Write_Byte(Slave);

Check_Ack();

}while(F_Flag==1);

do

{Write_Byte(Address《《4);//送开端地址-》查看应对位

Check_Ack();

}while(F_Flag==1);

for(k=0;k{Write_Byte(*Array);

Array++;

Check_Ack();}//查看应对位

Stop();

}

//****************************写一个字节子程序**********************//

//函数参数阐明:

//Slave:IIC器材地址,如上文界说的SD2303

//Address:IIC器材寄存器地址

//Data:数据

voidWrite_1byte(ucharSlave,ucharAddress,ucharData)

{writ:do//开端-》写IIC器材地址-》查看应对位

{Start();

Write_Byte(Slave);

Check_Ack();

}while(F_Flag==1);

do

{Write_Byte(Address《《4);//送开端地址-》查看应对位

Check_Ack();

}while(F_Flag==1);

Write_Byte(Data);

Check_Ack();//查看应对位

Stop();//中止信号

}

//***************************读N个字节子程序***********************//

//函数参数阐明:

//Slave:IIC器材地址,如上文界说的SD2303

//Address:开端地址

//Array:读数据寄存的数组

//Number:读取的字节数

voidRead_Nbyte(ucharSlave,ucharAddress,uchar*Array,ucharNumber)

{uchardata0,x;

//第一步:开端信号-》写IIC器材地址-》查看应对位

do{Start();Write_Byte(Slave);Check_Ack();}while(F_Flag==1);

//第二步:写开端地址-》查看应对位

do{Write_Byte(Address《《4);Check_Ack();}while(F_Flag==1);

//第三步:开端信号-》写IIC器材地址+1(表明读)-》查看应对位

do{Start();Write_Byte(Slave+1);Check_Ack();}while(F_Flag==1);

//第四步:读N字节,每读完一字节发一个Ack应对,最终一字节发Nack

for(x=0;x{data0=Read_Byte();*Array=data0;Array++;

if(x《(Number-1)){Ack();}}

Nack();

//第五步:发中止信号,完毕读操作

Stop();

}

//***************************按键处理程序**************************//

//阐明:为简化程序设计,此程序不确保输入的时刻数据的合理性。

voidKey_Process(void)

{uchartemp1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

//输入数据格局依次为年、月、日、星期、小时和分钟

uchartemp2[7]={0,0,0,0,0,0,0,};

ucharteMP3[3]={0,0,0xff};

//输入数据格局依次为小时和分钟

ucharKey;

uchar*Flag;

uchari;

Flag=temp1;

if(PIND!=0xff)

{DelayMs(20);//延时去抖

if(PIND!=0xff)

Key=PINB;

if(Key==0xfe)//“时刻设置”键按下

{temp1[0]|=0x80;//年高位设置提示

while(!Enter_Flag)//直到按下确认键方中止

{for(i=0;i《50;i++)

Display(temp1);//显现和延时

Key=~PIND;

switch(Key)

{case0x04://“+”键处理

(*Flag)++;

if(((*Flag)&0x7f)==10)*Flag=0|0x80;

break;

case0x08://“-”键处理

if(((*Flag)&0x7f)==0)*Flag=10|0x80;

(*Flag)–;

break;

case0x10://“下一位”键处理

Flag++;

(*(Flag-1))&=0x7f;//上一位去掉小数点显现

(*Flag)|=0x80;//当时位加上小数点显现

if(Flag==temp1+13)

{Flag=temp1;

(*Flag)|=0x80;

(*(Flag+13))&=0x7f;}

break;

case0x20://“上一位”键处理

if(Flag==temp1)

{(*Flag)&=0x7f;

Flag=temp1+13;

(*Flag)|=0x80;}

elseFlag–;

(*Flag)|=0x80;//当时位加上小数点显现

(*(Flag+1))&=0x7f;//下一位去掉点小数点显现

break;

case0x40:Enter_Flag=1;break;//“确认”键处理

//case0x80:Enter_Flag=1;break;//测验

default:break;}

}

Enter_Flag=0;//按键状况康复

temp2[0]=0x00;//秒,默许从00开端计时

temp2[1]=(temp1[11]《《4)|temp1[12];//分

temp2[2]=(temp1[9]《《4)|temp1[10];//时

temp2[3]=temp1[8];//周

temp2[4]=(temp1[6]《《4)|temp1[7];//日

temp2[5]=(temp1[4]《《4)|temp1[5];//月

temp2[6]=(temp1[2]《《4)|temp1[3];//年

Write_Nbyte(SD2303,0x00,temp2,7);//初始化设守时刻

}

if(Key==0xfd)//“闹铃设置”键按下

{temp1[9]|=0x80;

Flag=temp1+9;//守时小时高位设置提示

while(!Enter_Flag)//直到按下确认键方中止

{for(i=0;i《50;i++)

Display(temp1);

Key=~PINB;

switch(Key)

{case0x04://“+”按键处理

(*Flag)++;

if(((*Flag)&0x7f)==10)*Flag=0|0x80;

break;

case0x08://“-”按键处理

if(((*Flag)&0x7f)==0)*Flag=10|0x80;

(*Flag)–;

break;

case0x10://“下一位”按键处理

Flag++;

(*(Flag-1))&=0x7f;//上一位去掉小数点显现

(*Flag)|=0x80;//当时位加上小数点显现

if(Flag==temp1+13)

{(*Flag)&=0x7f;

Flag=temp1+9;

(*Flag)|=0x80;}

break;

case0x20://“上一位”按键处理

if(Flag==temp1+9)

{(*Flag)&=0x7f;

Flag=temp1+13;

(*Flag)|=0x80;}

elseFlag–;

(*Flag)|=0x80;//当时位加上小数点显现

(*(Flag+1))&=0x7f;//下一位去掉小数点显现

break;

case0x40:Enter_Flag=1;break;//“确认”键处理

//case0x80:Enter_Flag=1;break;//测验用

default:break;}

}

Enter_Flag=0;

temp3[0]=((temp1[11]《《4)|temp1[12])&0x7f;//分数据处理,去掉小数点

temp3[1]=((temp1[9]《《4)|temp1[10])&0x7f;//时数据处理,去掉小数点

if((temp3[0]《0x60)&&(temp3[1]《0x24))//判别是否为合法时刻

{Write_1byte(SD2303,0x0e,0b10110000);//敞开闹铃使能

Write_1byte(SD2303,0x0f,0b00101000);//开端中止使能

Write_Nbyte(SD2303,0x08,temp3,3);}//初始化闹铃设置

else

Write_1byte(SD2303,0x0e,0b00110000);//撤销闹铃功用

}

}

}

//***************************DS1722函数开端************************//

voidConvert(ucharp1,uchar*p2)

{uchartemp;

if(p1&0x80)

{p2[13]=10;//零下温度用10表明

p1=0xff-p1;}//温度绝对值

else

p2[13]=11;//零上温度用11表明

p2[14]=p1/10;//温度十位

p2[15]=p1-p2[14]*10;//温度个位

}

//***************************经过SPI接口写数据函数*****************//

//函数参数阐明:

//Address:DS1722寄存器地址

//Data:写入的数据

voidDSWrite_Byte(ucharAddress,ucharData)

{ucharclear;

PORTB=PORTB|0x10;//使能SPI器材

SPDR=Address;

while(!(SPSR&0x80)){;}

clear=SPSR;

clear=SPDR;

SPDR=Data;

while(!(SPSR&0x80)){;}

clear=SPSR;

clear=SPDR;

PORTB=PORTB&0xef;

}

//***************************经过SPI接口读数据函数*****************//

//函数参数阐明:

//Address:DS1722寄存器地址

//返回值:读取的温度数据

ucharDSRead_Byte(ucharAddress)

{ucharclear;

ucharData;

PORTB=PORTB|0x10;

SPDR=Address;

while(!(SPSR&0x80)){;}

clear=SPSR;

clear=SPDR;

SPDR=Address;//发空数据

while(!(SPSR&0x80)){;}

clear=SPSR;

Data=SPDR;

PORTB=PORTB&0xef;

return(Data);

}

voidmain(void)

{uchari;

ucharTIme[16]={2,0,0,4,1,2,2,7,1,1,7,3,0,0,0,0};

ucharSet_TIme[7]={0x50,0x30,0x20,0x03,0x05,0x01,0x05};

//初始化时刻2005-01-05Wed20-30-50

ucharSD,DS;

ucharSD2303_Controller1=0x00;//制止中止

ucharSD2303_Controller2=0x20;//时刻格局:24

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/344029.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部