单片机课程设计——万年历.doc_第1页
单片机课程设计——万年历.doc_第2页
单片机课程设计——万年历.doc_第3页
单片机课程设计——万年历.doc_第4页
单片机课程设计——万年历.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机课程设计报告课程题目: 万年历 学生姓名: 学生学号: 专业班级: 小组成员: 指导老师: 设计时间: 目录一设计任务与要求 .3二电路原理与方案设计 .3三总原理图、元器件清单列表 .4 1. 总原理图及pcb图 .4 2. 元器件清单列表 .5 3. lcd12864显示模块简介 .5 4. ds1302模块简介 .9 5. ds18b20模块简介 .12 6. at89c52主芯简介 .144. c语言程序设计 .175. 性能测试和说明 .396. 实物照 .49七. 个人心得 .50 设计课题题目: 万年历的设计 一、 设计任务与要求基本要求:1、 采用lcd128 * 64显示2、 显示年、月、日、时、分、秒、星期3、 可以调整时间、设定闹钟4、 温度显示发挥部分:1. 增加液晶自检2. 增加温度监测及警报3. 自定义图片显示功能4. 采用功能菜单格式显示时间5. 显示万年历功能说明二、 电路原理与方案设计显示年月日时分秒、星期、温度及自定义图片提供年月日时分秒、星期且可自动运行温度传感器,检测温度闹钟提醒,温度警报51单片机lcd128*64蜂鸣器ds1302ds18b20三、 总原理图、元器件清单列表 1、总原理图及pcb图 1.1 原理图 原理图中共分为10部分内容,依次为:电源、晶振、复位、52单片机、下载端口、lcd12864、功能键、闹钟、时钟电路、温度传感器。1.2 pcb 制图 2、元器件清单列表序列号型号主要参数数量01lcd128*64102ds1302103ds18b20104stc89c52105晶振12khz,32.768khz206电阻10k,8.2k,2k等若干07电容22pf,10uf等若干08三极管109按钮610排针若干11蜂鸣器112发光二极管1四、 c语言程序设计在51编译环境下,使用keil4编程,主要将程序分为六个部分,依次为:lcd128*64各界面显示、时间温度显示、ds1302、ds18b20、警报系统(包括闹钟的声响)、按键等来实现万年历功能。1、 lcd128*64各界面显示 #include jiemian.h #include lcd12864.hvoid j1()lcdwcom(0x80); chuan( );lcdwcom(0x90);chuan(1.警报 2.设置);lcdwcom(0x88);chuan(3.闹钟 4.图片);lcdwcom(0x98);chuan(5.说明 6.退出);void j2()lcdwcom(0x80); chuan( );lcdwcom(0x90);chuan(闹钟 : );lcdwcom(0x98);chuan(确认 );void j3()lcdwcom(0x80); chuan( );lcdwcom(0x90);chuan(温度上限:);lcdwcom(0x88);chuan(温度下限:);lcdwcom(0x98);chuan(确认 );void j4()lcdwcom(0x80); chuan( );lcdwcom(0x90);chuan( 周凯 陈先坐 );lcdwcom(0x88);chuan(徐超清 洪嘉鸣 );lcdwcom(0x98);chuan(张茜茜 陈淀 );void j5()lcdwcom(0x80); chuan( );lcdwcom(0x90);chuan( );lcdwcom(0x88);chuan( 2011-12-12 );lcdwcom(0x98);chuan( );void j6()lcdwcom(0x80); chuan( );lcdwcom(0x90);chuan(1:可用于显示年、);lcdwcom(0x88);chuan(月、日、星期、时);lcdwcom(0x98);chuan(、分、秒、温度,); void j7()lcdwcom(0x80); chuan(并可修改其参值;);lcdwcom(0x90);chuan(2:可对实际情况的);lcdwcom(0x88);chuan(温度进行监测,如);lcdwcom(0x98);chuan(发现问题,将发出); void j8()lcdwcom(0x80); chuan(警报; );lcdwcom(0x90);chuan(3:可设置闹钟; );lcdwcom(0x88);chuan(4:可显自定图片。);lcdwcom(0x98);chuan(返回 ); 2、时间温度显示#include ds1302.h#include lcd12864.h#include zimo.h#include ds18b20.h#include speaker.hextern bit8 sec,min,hour,day,month,year,week; /秒,分,小时,公历日期,月份,年份,星期 sbit lcd_rs=p25; sbit lcd_rw=p26; sbit lcd_e=p27; sbit psb=p24;extern bit8 temph,templ;/* 功能说明:延迟函数 参数说明:要写的数据num*/void delay(bit16 num) while(num-) ;/* 功能说明:延迟(ms)函数 参数说明:要写的数据*/void delayms(bit16 dat) bit8 i; while(-dat!=0) for(i=0;i0) lcdwdata(*p); p+; bit8 code dispshuzitable= ,0,1,2,3,4,5,6,7,8,9; /用于写数字/* 功能说明:任意位置写数字函数(两个字的空间) 参数说明: x:1-4行 y:0-7列*/void lcddispchar(bit8 x,bit8 y,bit8 number)bit8 shi,ge;shi=number%100/10; ge =number%10;shi + ;ge + ;switch( x )case 0x01: lcdwcom(0x80+y);lcdwdata(dispshuzitableshi);lcdwdata(dispshuzitablege); break;case 0x02:lcdwcom(0x90+y);lcdwdata(dispshuzitableshi);lcdwdata(dispshuzitablege); break;case 0x03:lcdwcom(0x88+y);lcdwdata(dispshuzitableshi);lcdwdata(dispshuzitablege); break;case 0x04:lcdwcom(0x98+y);lcdwdata(dispshuzitableshi);lcdwdata(dispshuzitablege); break;/* 功能说明:lcd全屏刷屏函数 参数说明:要写的数据*/void fillgdram(bit8 dat) bit8 i; bit8 j; bit8 k; bit8 bgdramaddrx = 0x80; /gdram水平地址 bit8 bgdramaddry = 0x80; /gdram垂直地址 for(i=0;i2;i+) for(j=0;j32;j+) for(k=0;k8;k+) lcdwcom(0x34); /设置为8位mpu接口,扩充指令集,绘图模式关 lcdwcom(bgdramaddry+j); /垂直地址y lcdwcom(bgdramaddrx+k); /水平地址x lcdwdata(dat); lcdwdata(dat); bgdramaddrx = 0x88; lcdwcom(0x36); lcdwcom(0x30); /* 功能说明:图片显示函数 参数说明:要写的指向图片的地址*/void dispimg(bit8 code *img) bit16 j=0; bit8 x,y,i; for(i=0;i9;i+=8) for(y=0;y32;y+) for(x=0;xaddx1)temp1=addx0;addx0=addx1;addx1=temp1;if(addy0addy1) temp1=addy0;addy0=addy1;addy1=temp1;addx0=addx0%8;addx1=addx1%8;if(addy031)i=1;addy0=addy0%32;addy1=addy1%32;elsei=0;x0=addx0;lcdwcom(0x36);for(;addy031)i=1;addy0=addy0%32;lcdwcom(0x80+addy0);lcdwcom(0x80+x0+8*i);for(;addx0=32)/处理成液晶上得地址坐标addy=addy%32;i=1;if(addx=8)addx=addx%8;if(addy0)j=1;l=31-addy;lcdwcom(0x36);for(k=0;kl)lcdwcom(0x80-32+addy+k);lcdwcom(0x88+addx);else lcdwcom(0x80+addy+k);lcdwcom(0x80+addx);else lcdwcom(0x80+addy+k);if(i=1)lcdwcom(0x88+addx);else lcdwcom(0x80+addx);if(color)lcdwdata(*s+);lcdwdata(*s+);elselcdwdata(*s+);lcdwdata(*s+);lcdwcom(0x30);/* 功能说明:读取1302 在lcd写“秒钟”函数 参数说明:无*/void displaysec() bit8 i=0; bit16 a=0,b=0,c=0; sec=readds1302(0x81); if(sec%2=0) dispword(2,16,1,zimo10); else dispword(2,16,1,zimo11); if(sec%2=0) dispword(5,16,1,zimo10); else dispword(5,16,1,zimo11); lcdwcom(0x8b); dispword(6,16,0,zimo(sec/16); dispword(7,16,0,zimo(sec%16);/* 功能说明:读取1302 在lcd写“年”函数 参数说明:无*/void displayyear() year=readds1302(0x8d); /从1302的0x8d处读出年数据 lcdwcom(0x81); lcdwdata(year/16)+0x30); lcdwdata(year%16+0x30);delay(10); lcdwcom(0x82); chuan(年); /* 功能说明:读取1302 在lcd写“月”函数 参数说明:无*/void displaymonth() month=readds1302(0x89); /从1302的0x89读取月份数据 lcdwcom(0x83); if(month/16!=0) lcdwdata(month/16)+0x30); else lcdwdata(0x20); lcdwdata(month%16+0x30); lcdwcom(0x84); chuan(月); /* 功能说明:读取1302 在lcd写“星期”函数 参数说明:无*/ void displayweek() week=(readds1302(0x8b)%16; /从1302中读取星期数据 lcdwcom(0x98); chuan(星期); lcdwcom(0x9a); if(week=7) chuan(日); if(week=6) chuan(六); if(week=5) chuan(五); if(week=4) chuan(四); if(week=3) chuan(三); if(week=2) chuan(二); if(week=1) chuan(一); /* 功能说明:读取1302 在lcd写“日期”函数 参数说明:无*/void displayday() day=readds1302(0x87); /从1302中读取日期数据 lcdwcom(0x85); if(day/16!=0) lcdwdata(day/16)+0x30); else lcdwdata(0x20); lcdwdata(day%16+0x30); lcdwcom(0x86); chuan(日);/* 功能说明:读取1302 在lcd写“小时”函数 参数说明:无*/void displayhour() hour=readds1302(0x85); lcdwcom(0x88); dispword(0,16,1,zimo(hour/16); dispword(1,16,1,zimo(hour%16); /* 功能说明:读取1302 在lcd写“分钟”函数 参数说明:无*/void displaymin() min=readds1302(0x83); lcdwcom(0x89); dispword(3,16,1,zimo(min/16); dispword(4,16,1,zimo(min%16);/* 功能说明:年月日时分秒联合显示函数 参数说明:无*/void update() displayyear(); displaymonth(); displayday(); displayweek(); displayhour(); displaymin(); displaysec(); /* 功能说明:读取ds18b20 在lcd写“温度”函数 参数说明:dat1:温度上限 dat2:温度下限*/void displaytemp(bit8 dat1,bit8 dat2) bit16 i; bit8 a,b,c; lcdwcom(0x9c); lcdwcom(0x9d); tempchange(); i=gettemp(); if(i(10*dat1) /比较是否在设定温度以外 speakerdidi();speakerdidi(); /是 , 警报/speakerdidi();/speakerdidi();temph=temph+3;templ=templ-3; a=i/100; lcdwdata(a+0x30); b=i/10-a*10; lcdwdata(b+0x30); lcdwdata(0x2e); c=i-a*100-b*10; lcdwdata(c+0x30); chuan(); 3、ds1302 的功能实现程序#include ds1302.hsbit ds1302_clk=p16; sbit ds1302_io=p35; sbit ds1302_rst=p17; /* 功能说明:1302写字节函数 参数说明:要写的数据*/void writeds1302byte(bit8 temp) bit8 i; for (i=0;i=1; ds1302_clk=1; /* 功能说明:1302写数据函数 参数说明:要写的地址及数据*/void writeds1302( bit8 address,bit8 dat ) /先写地址,再写数据 ds1302_rst=0; _nop_(); ds1302_clk=0; _nop_(); ds1302_rst=1; _nop_(); /启动 writeds1302byte(address); writeds1302byte(dat); ds1302_rst=0; /恢复/* 功能说明:1302读函数(返回读取值) 参数说明:要写的地址*/bit8 readds1302(bit8 address) /先送地址,再读数据 bit8 i,temp=0x00; ds1302_rst=0; _nop_(); ds1302_clk=0; _nop_(); ds1302_rst=1; _nop_(); writeds1302byte(address); for (i=0;i=1; ds1302_rst=0; _nop_(); ds1302_clk=1; ds1302_io=0; return (temp); /返回/* 功能说明:1302初始化函数 参数说明:无*/void initds1302() /ds1302中秒,分,时,日期,月份,星期,年的地址分别是0x80,0x82,0x84,0x86,0x88,0x8a,0x8c /初始化写入的时间是2010年5月1日9点59分,星期六 writeds1302(0x8e,0x00); /控制命令,wp位为0,允许写操作 控制位地址是0x8e delayms(5); writeds1302(0x8c,0x10); /年份10年 delayms(5); writeds1302(0x8a,0x06); /星期6 delayms(5); writeds1302(0x88,0x05); /5月 delayms(5); writeds1302(0x86,0x01); /1日 delayms(5); writeds1302(0x84,0x09); /9点 delayms(5); writeds1302(0x82,0x59); /59分 delayms(5); writeds1302(0x80,0x30); /30秒 delayms(5); writeds1302(0x8e,0x80); /控制命令,wp为1,禁止写操作 4、ds18b20 的功能实现程序 #include ds18b20.h extern int temp;/* 功能说明:ds18b20初始化函数 参数说明:无*/void ds18b20init() bit16 i; ds18b20=0; i=103; while(i0)i-; ds18b20=1; i=4; while(i0)i-;/* 功能说明:ds18b20读位函数(返回读取位) 参数说明:无*/bit tempreadbit() / 读一位 bit16 i; bit dat; ds18b20=0;i+; ds18b20=1;i+;i+; dat=ds18b20; i=8;while(i0)i-; /起延迟作用 return (dat);/* 功能说明:ds18b20初始化函数 参数说明:无*/bit8 tempread() /读一个字节 bit8 i,j,dat; dat=0; for(i=1;i=8;i+) j=tempreadbit(); dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在dat里 return(dat); /将一个字节数据返回/* 功能说明:ds18b20写字节函数 参数说明:要写的字节*/void tempwritebyte(bit8 dat) bit16 i; bit8 j; bit testb; for(j=1;j1; if(testb) / 写1部分 ds18b20=0; i+;i+; ds18b20=1; i=8;while(i0)i-; else ds18b20=0; /写0部分 i=8;while(i0)i-; ds18b20=1; i+;i+; /* 功能说明:ds18b20发送温度转换命令函数 参数说明:无*/void tempchange() ds18b20init(); /初始化ds18b20 delay(200); tempwritebyte(0xcc); / 跳过序列号命令 tempwritebyte(0x44); /发送温度转换命令/* 功能说明:ds18b20读取温度函数(返回温度值) 参数说明:无*/int gettemp() float tt; bit8 a,b; ds18b20init(); delay(200); tempwritebyte(0xcc); tempwritebyte(0xbe); /发送读取数据命令 a=tempread(); /连续读两个字节

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论