基于单片机的万年历设计 联系客服

发布时间 : 星期六 文章基于单片机的万年历设计更新完毕开始阅读a142267e03d276a20029bd64783e0912a3167c21

.

令字节

sbit lcdrs=P2^7; //LCD 数据 /命令选择端 (H/L) sbit lcdrw=P2^6; //LCD 读/写选择端 (H/L) sbit lcden=P2^5; //LCD 使能控制 sbit beep=P1^3; //蜂鸣器控制端 sbit DQ = P1^4; //温湿度传感器· sbit kmenu=P3^2; //功能键 sbit kup=P3^3; //增大键 sbit kdown=P3^4; //减小键

sbit kalarm=P3^5; //闹钟查看键 Ring: 显示闹钟需要调到的时间 sbit kevent=P3^6; //事件查看键 Ding: 显示事件提醒需要调到的时间 //sbit kmode=P3^7; //切换温湿度显示 sbit dsclk=P2^2; //ds1302 的时钟信号端 sbit dsdata=P2^1; //ds1302 的数据 I/O 端 sbit dsrst=P2^0; //ds1302 的复位端

sbit ACC7=ACC^7; //定义累加器的最高和最低位。 sbit ACC0=ACC^0;

bit flagalarm,flagseta,flagset; // 分别定义闹钟响标志位,闹钟设置标志位,时间设置标志位

bit flagevent,flagsseta; // 分别定义事件提醒标志位,事件提醒设置标志位 uchar FLAG,k; uchar temp;

uchar T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata; uchar

T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp;

uchar comdata;

uchar kmenunum,s,m,h,dd,mm,yy; //功能键被按次数的计数器 .

char second,minute,hour,year,month,day,week; uchar inittime[7]={0x59,0x59,0x11,0x05,0x07,0x04,0x18}; //初始化后设置为:

//2018 年 7 月 5 日 星期四, 11 点 59 分 59 秒,

//从左往右的数据依次是,秒,分,时,日,月,星期,年。 // 年月日星期: 2018-07-05 THU // 时间: 11:59:59

uchar code t1[]=\液晶固定显示部分。 uchar code t2[]=\

//各函数声明

void delay(uint z); //毫秒级延时函数。 void di(); //蜂鸣器发声函数。

;..

.

void writecom(uchar com); //液晶写命令函数。 void writedata(uchar dat); //液晶写数据函数。

void writetime(uchar add,uchar dat); // 液晶刷新时分秒。 void writenyr(uchar add,uchar dat); // 液晶刷新日期。 void writeweek(uchar week); // 液晶星期几显示函数。 void keyscan(); // 键盘扫描函数。

void dswritebyte(uchar d);// 往 DS1302 写入一个字节。 uchar dsreadbyte(); //从 DS1302 读出一个字节。

void dswrite(uchar add, uchar dat); // 向 DS1302 的指定地址写入一个字节

uchar dsread(uchar add); //从 DS1302 的指定地址读出一个字节 void init1302time(uchar *pClock); //DS1302 时间初始化函数 void init(); //初始化函数

void Delay_100us(uint j);//延时100us void Delay_10us(void);//延时10us void COM(void);

void Read_DHT11(void);

void delay(uint z) //毫秒级延时函数。 {

uint x,y;

for(x=z;x>0;x--)

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

void di() //蜂鸣器发声函数。 {

beep=0; delay(100); beep=1; }

void writecom(uchar com) //液晶写命令函数。 {

lcdrs=0;// 置为写入命令 lcddata=com;// 送入数据 delay(1);

lcden=1;// 拉高使能端 delay(1);

lcden=0;// 完成高脉冲 }

void writedata(uchar dat) //液晶写数据函数。 {

lcdrs=1;// 置为写入数据 lcddata=dat;// 送入数据 delay(1);

;..

.

lcden=1; delay(1); lcden=0; }

void writetime(uchar add,uchar dat) // 液晶刷新时分秒。 { //3为时的开始位置,6 为分, 9 为秒。 uchar shi,ge; shi=dat/10; ge=dat;

writecom(0x80+0x40+add); writedata(0x30+shi); writedata(0x30+ge); }

void writenyr(uchar add,uchar dat) // 液晶刷新日期。

{ //0 为年, 3 为月, 6 为日。 uchar shi,ge; shi=dat/10; ge=dat;

writecom(0x80+add); writedata(0x30+shi); writedata(0x30+ge); }

void writeweek(uchar week) // 液晶星期几显示函数。 {

writecom(0x80+9); //从第一行隔十三个字符后开始写星期 switch(week) {

case 1: writedata('M');

writedata('O'); writedata('N'); break; case 2: writedata('T');

writedata('U'); writedata('E'); break; case 3: writedata('W');

writedata('E'); writedata('D'); break; case 4: writedata('T');

writedata('H'); writedata('U'); break; case 5: writedata('F');

;..

.

writedata('R'); writedata('I'); break; case 6: writedata('S');

writedata('A'); writedata('T'); break; case 7: writedata('S');

writedata('U'); writedata('N'); break; } }

void keyscan() // 键盘扫描函数。 {

if((flagalarm==1)||(flagevent==1)) // 如果闹钟在响或者有事件提醒,任意键停止闹钟响或者取消事件提醒 {

if((kmenu==0)||(kup==0)||(kdown==0)||(kalarm==0)||(kevent==0)) {

delay(5);

if((kmenu==0)||(kup==0)||(kdown==0)||(kalarm==0)||(kevent==0)) {

while(!(kmenu&&kup&&kdown&&kalarm&&kevent)); di();

flagalarm=0; // 清除闹钟标志。 flagevent=0; // 清除事件提醒标志。 } } }

if(kmenu==0) //检测功能键。 {

delay(5); if(kmenu==0) {

kmenunum++; // 记录功能键按下次数。

if(flagseta==1) // 检测是否在进行闹钟设置。

if(kmenunum==4) kmenunum=1; // 因为进行闹钟设置时,只调节时分秒,所以, kmenunum 只能等于 1,2,3。

if(flagsseta==1) // 检测是否在进行事件提醒设置。

if(kmenunum==8) kmenunum=5; // 因为进行事件提醒设置时,只调节年月日,所以, kmenunum 只能等于 5,6,7

;..