教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 高等教育 >

万年历的设计与制作(基于单片机) - 图文(4)

来源:网络收集 时间:2026-08-23
导读: 电气与电子信息工程学院 课程设计报告 、主程序 #include #include #define uchar unsigned char #define uint unsigned int sbit RS=P2^0; //数据/命令选择端 sbit RW=P2^1; //读/写选择端 sbit E=P2^2; //1602使

电气与电子信息工程学院 课程设计报告

、主程序

#include #include

#define uchar unsigned char #define uint unsigned int

sbit RS=P2^0; //数据/命令选择端 sbit RW=P2^1; //读/写选择端 sbit E=P2^2; //1602使能 sbit IO=P1^0; //DS1302数据口 sbit SCLK=P1^1;//DS1302串行时钟 sbit RST=P1^2; //DS1302时钟复位脚 sbit DQ=P1^3; //DS18B20温度 sbit K1=P3^3; //功能 sbit K2=P3^4; //增加 sbit K3=P3^5; //减少 sbit K4=P3^6; //确定 sbit K5=P3^7; //取消 sbit led=P2^4;//温度报警

sbit buzz=P2^3;// 蜂鸣器报警 uchar data LCD_DSY_BUFFER1[]={\ uchar data LCD_DSY_BUFFER2[]={\ uchar data Temp_BUFFER[8];

char *week[]={\ uchar days[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; uchar data DateTime[7];//秒、分、时、日、月、周、年 uchar Adjust_Index=-1;//时钟调节标志 uint tvalue;//温度值

uchar tflag;//温度正负标志

//微妙延时程序(约为10us(小于)) void delayus(uint us) {

while(us--); } //毫秒延时程序

void delayms(uint ms) {

uint i,j;

for(i=ms;i>0;i--) for(j=110;j>0;j--); } //写LCD命令寄存器

void Write_LCD_Command(uchar cmd) { RS=0; RW=0; P0=cmd;

8

2

电气与电子信息工程学院 课程设计报告

E=1;

delayms(5); E=0;

}//写LCD数据寄存器

void Write_LCD_Data(uchar dat) { RS=1; RW=0; P0=dat; E=1;

delayms(5); E=0;

}//显示字符串

void LCD_ShowString(uchar x,uchar y,uchar *str) {

uchar i=0; if(y==0)

Write_LCD_Command(0x80|x); else if(y==1)

Write_LCD_Command(0xc0|x);

for(i=0;i<16&&str[i]!='\\0';i++) Write_LCD_Data(str[i]); }//刷新LCD显示缓冲区 void Refresh_LCD_BUFFER() {

LCD_DSY_BUFFER1[2]=DateTime[6]/10+0x30; LCD_DSY_BUFFER1[3]=DateTime[6]+0x30; LCD_DSY_BUFFER1[5]=DateTime[4]/10+0x30; LCD_DSY_BUFFER1[6]=DateTime[4]+0x30; LCD_DSY_BUFFER1[8]=DateTime[3]/10+0x30; LCD_DSY_BUFFER1[9]=DateTime[3]+0x30; LCD_DSY_BUFFER2[0]=DateTime[2]/10+0x30; LCD_DSY_BUFFER2[1]=DateTime[2]+0x30; LCD_DSY_BUFFER2[3]=DateTime[1]/10+0x30; LCD_DSY_BUFFER2[4]=DateTime[1]+0x30; LCD_DSY_BUFFER2[6]=DateTime[0]/10+0x30; LCD_DSY_BUFFER2[7]=DateTime[0]+0x30; }//LCD初始化

void Initialize_LCD() { E=0;

Write_LCD_Command(0x38); Write_LCD_Command(0x0c); Write_LCD_Command(0x06);

9

电气与电子信息工程学院 课程设计报告

Write_LCD_Command(0x01);

} //向DS1302中写入一字节 (上升沿写入) void Write_Byte_TO_DS1302(uchar x) {

uchar i;

for (i=0;i<8;i++) //循环8次 写入数据 {

IO=x&0x01; //每次传输低字节 SCLK=0; delayus(2); SCLK=1;

x>>=1; //右移一位 } }

//从DS1302中读取一字节(下降沿读取) uchar Get_Byte_FROM_DS1302() {

uchar i,dat=0x00; for(i=0;i<8;i++) {

if(IO)

dat|=0x80; SCLK=1; delayus(2); SCLK=0; dat>>=1; }

return dat/16*10+dat; //将读出的BCD码值转化为十进制 }//从DS1302的指定地址读取一字节数据 uchar Read_Data(uchar addr) {

uchar dat; RST = 0; SCLK=0; RST=1;

Write_Byte_TO_DS1302(addr); //先写地址在读取 dat = Get_Byte_FROM_DS1302(); RST=0; SCLK=1; return dat;

}//向指定的地址写入一字节数据

void Write_DS1302(uchar add,uchar num) {

RST=0;

10

电气与电子信息工程学院 课程设计报告

SCLK=0; RST=1;

Write_Byte_TO_DS1302(add); //先写地址再写数据 Write_Byte_TO_DS1302(num); RST=0; SCLK=1;

}//读取当前日期时间 void GetDateTime() {

uchar i,addr=0x81; //读取秒地址开始(地址最高位10表示要读/写clock数据, //最低位表示是读(1)还是写(0) for(i=0;i<7;i++) {

DateTime[i]=Read_Data(addr); addr+=2;

} }//禁止涓流充电 void denot() {

Write_DS1302(0x8e,0x00); //写控制字节,取消写保护 Write_DS1302(0x90,0x8b);//禁止涓流充电 Write_DS1302(0x8e,0x80);//加保护 }//写改动后的数据到DS1302中 void SetDateTime() {

uchar i;

Write_DS1302(0x8e,0x00); //写控制字节,取消写保护 for(i=0;i<7;i++) {

Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i])); }

Write_DS1302(0x8e,0x80);//加保护 }//判断是否为闰年

uchar IsLeapYear(uint y) {

if((y%4==0&&y0!=0)||(y@0==0))return 1; else return 0;

}//根据设定的日期自动刷新星期 void RefreshWeekday() {

uint i,d,w=5;//已知1999.12.31是周五 for(i=2000;i<2000+DateTime[6];i++) {

d=IsLeapYear(i)?366:365; w=(w+d)%7; }

11

电气与电子信息工程学院 课程设计报告

for(d=0,i=1;i

DateTime[5]=(w+d)%7+1; }//根据按键情况调整时间

void DateTime_Adjust(char x) {

switch( Adjust_Index) {

case 6://年 00--99 if(x==1) {

DateTime[6]++;

if(DateTime[6]==100) DateTime[6]=0; } else {

DateTime[6]--;

if(DateTime[6]==0xff) DateTime[6]=99; }

days[2]=IsLeapYear(2000+DateTime[6])?29:28; if(DateTime[3]>days[DateTime[4]]) DateTime[3]=days[DateTime[4]]; RefreshWeekday(); break;

case 4://月 01--12 if(x==1) {

DateTime[4]++;

if(DateTime[4]==13) DateTime[4]=1; } else {

DateTime[4]--; if(DateTime[4]==0) DateTime[4]=12; }

days[2]=IsLeapYear(2000+DateTime[6])?29:28; if(DateTime[3]>days[DateTime[4]]) DateTime[3]=days[DateTime[4]]; RefreshWeekday();

12

…… 此处隐藏:1936字,全部文档内容请下载后查看。喜欢就下载吧 ……
万年历的设计与制作(基于单片机) - 图文(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/614745.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)