基于单片机的电子万年历的设计与制作 - 图文 联系客服

发布时间 : 星期一 文章基于单片机的电子万年历的设计与制作 - 图文更新完毕开始阅读46fa9556af45b307e971970f

郑州航空工业管理学院毕业设计(论文)

//当前时间的 时,分比较,要是相同且闹钟状态是开,则蜂鸣器响 di(); delay(100); di(); delay(500); }

if((i+1>high||i

{ //超过温度上或小于下限且闹钟状态开,则蜂鸣器报警 di(); delay(100); di(); delay(500); } }

void main() {

Init_12887(); LCDInit(); LCDlear(); PSB=1;//并口 while(1) {

while(!next) { Key(); WriteCommandLCD(0x0c); DisplayYear();//显示年 DisplayMonth();//显示月 DisplayDay();//显示日 DisplayWeek();//显示周 DisplayHour(); //显示时 DisplayMin(); //显示分 DisplaySec();//显示秒 Holidays(); //节日提醒 DisplayTemp(); //显示温度 beep(); //闹钟 DisplayShengXiao();//显示生肖 } Key(); } }

时钟模块

#include \void Init_12887() //初始化DS12C887,LCD {

write_ds(0x0A,0xAF); //立级更新、开启振荡、500ms方波 write_ds(0x0B,0x0A); //输出方波、2进制表示、24小时制 }

32

郑州航空工业管理学院毕业设计(论文)

void write_ds(uchar add,uchar date) {

dsds=1; dsrw=1; dscs=0; dsas=1; P1=add; dsas=0; dsrw=0; P1=date; dsrw=1; dsas=1; dscs=1; }

uchar read_ds(uchar add) {

uchar ds_date; dsas=1; dsds=1; dsrw=1; dscs=0; P1=add; dsas=0; dsds=0; P1=0xff; ds_date=P1; dsds=1; dscs=1; dsas=1;

return ds_date; }

温度检测

#include \

/**********DS18B20****************************/ uchar tt=1,tflag; //tflag为1时,温度为负的标志 uchar TH,TL;

void DS18B20Init() {

unsigned char a,b,c; DQ=1;//复位

DQ=0;//拉低800us for(c=1;c>0;c--)//延时800us for(b=2;b>0;b--) for(a=197;a>0;a--);

DQ=1;//产生一个上升沿, 进入等待应答状态 for(b=1;b>0;b--)//延时50us for(a=22;a>0;a--); while(DQ==1);

while(DQ==0);//检测到应答脉冲

33

郑州航空工业管理学院毕业设计(论文)

}

uchar TempRead(void) //从DS18B20中读取一个字节数据 {

uchar a,b;

uchar i,dat = 0,dat1 = 0; for (i=8;i>0;i--) {

DQ = 0; //给脉冲信号0 _nop_();

DQ = 1; //给脉冲信号1 if(DQ)//读 判为1为0 {dat|=0x01;} else

{dat&=0xfe;}

dat=_cror_(dat,1);//最低位移到最高位 for(b=3;b>0;b--)//60us

for(a=8;a>0;a--); }

return(dat); }

void write0()//写0 {

uchar a,b; DQ=0;//拉低

for(a=6;a>0;a--);//拉低15us

for(b=21;b>0;b--); //送入0至少45us,DS1820采样,(其实15us就行) //总共拉低至少60us

DQ=1;//拉高恢复(至少1us) _nop_();

}

void write1()//写1 {

DQ=0; _nop_(); DQ=1; _nop_(); }

void TempWriteByte(uchar dat) //向DS18B20写入数据 {

uchar i,b;

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

b=dat&0x01;//取出最低位 进行写 if(b==0)

write0(); else

34

郑州航空工业管理学院毕业设计(论文)

write1(); dat=_cror_(dat,1); _nop_(); _nop_(); } }

int GetTemp()//读取寄存器中存储的温度数据 {

int temp; uint b,t,a;

DS18B20Init();//初始化

TempWriteByte(0xcc);//写入跳过序列号命令字 Skip Rom TempWriteByte(0x44);//写入温度转换命令字 Convert T DS18B20Init();

TempWriteByte(0xcc);//写入跳过序列号命令字 Skip Rom TempWriteByte(0xbe);//写入读取数据令字 Read Scratchpad a=TempRead();//读低8位 b=TempRead();//读高8位 TH=TempRead(); TL=TempRead(); t=b;

t<<=8;//高八位左移

temp=t|a;//高低八位组合 if(temp<0x0fff) tflag=0; else { tflag=1;//显示负 temp=~temp+1; }

temp=temp*0.625;//转换温度值,精确小数点后一位 return(temp); }

显示模块

#include \#include \

void delay(uint xms)//延时函数,有参函数 {

uint x,y;

for(x=xms;x>0;x--) for(y=110;y>0;y--); }

/****************12864的子函数*****************/ void WriteDataLCD(uchar dat)//向12864写数据 {

LCD_RS=1; LCD_RW=0; delay(2);

35