单片机课程设计实训报告-1602显示万年历和温度.doc_第1页
单片机课程设计实训报告-1602显示万年历和温度.doc_第2页
单片机课程设计实训报告-1602显示万年历和温度.doc_第3页
单片机课程设计实训报告-1602显示万年历和温度.doc_第4页
单片机课程设计实训报告-1602显示万年历和温度.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

单片机实训报告题 目 : 1602显示万年历和温度系 部 : 专 业 : 班 级 : 姓 名 :学 号 : 指导教师 : 2011年12月15日目录一、引言31.1、意义31.2、系统功能31.3、成员工作3二、使用硬件4三、使用原理图5四、完成万年历和温度的程序7五、感悟14六、致谢15七、参考文献16八、老师的评语16引 言1.1、意义目前单片机的应用可以说是相当的广泛,已经渗透到我们生活中的各个领域。从高端导弹的导航装置,飞机上各种仪表的控制,自动控制领域的机器人,以及自动化过程的实时和数据处理,到我们日常生活的各种智能ic卡系统,安全保障系统,录象机,摄象机,手机,电视,以及可控玩具,等等,都是单片机“惹的祸”。而且,目前我国的单片机教育已经向高中教育发展,可见在不久的将来,单片机对于工科学生而言就会象电路基础原理一样成为基础课。所以我们要跟着时代的步伐前进,学好单片机。1.2、系统功能在单片机中,基本上有三类信息在流动,一类是数据,即各种原始数据1、中间结果、程序等。这样要由外部设备通过“口”进入单片机,再存放在存贮器中,在运算处理过程中,数据从存贮器读入运算器进行运算,运算的中间结果要存入存贮器中,或最后由运算器经“出入口”输出。用户要单片机执行的各种命令(程序)也以数据的形式由存贮器送入控制器,由控制器解读(译码)后变为各种控制信号,以便执行如加、减、乘、除等功能的各种命令。所以,这一类信息就称为控制命令,即由控制器去控制运算器一步步地进行运算和处理,又控制存贮器的读(取出数据)和写(存入数据)等。所以芯片就达到某种功能,就给设备带来效果。1.3、成员工作写程序:张俊兵调试:张俊兵设计报告:张俊兵 使用硬件 单片机 18b20lcd1602 usb供电线 串口线使用原理图1.1、 单片机使用的原理图1.2、 仿真图完成万年历和温度的程序#include#include#includesbit rs=p00;sbit e=p02;sbit rw=p01;sbit beep=p17;#define data p2#define key p3#define uchar unsigned charint hour,min,sec,tcnt,a,h,m,day,month,yearl,yearh;int z,j;#define no_key 0x7fvoid delayus(unsigned char us)/delay usunsigned char uscnt;uscnt=us1;while(-uscnt);void delayms(unsigned char ms)/delay ms while(-ms) delayus(250); delayus(250); delayus(250); delayus(250); void writecommand(unsigned char c) delayms(5);/short delay before operation e=0; rs=0; rw=0; _nop_(); e=1; data=c; e=0;void writedata(unsigned char c) delayms(5); /short delay before operation e=0; rs=1; rw=0; _nop_(); e=1; data=c; e=0; rs=0;void initlcd() delayms(15); writecommand(0x38); /display mode writecommand(0x38); /display mode writecommand(0x38); /display mode writecommand(0x06); /显示光标移动位置 writecommand(0x0c); /显示开及光标设置 writecommand(0x01); /显示清屏int set_xy(int x,int y)/to set current position if(y1)|(x15) return 0; else if(y=0) writecommand(0x80+x); else writecommand(0xc0+x); return 1; int wr_char(unsigned char dat,int x,int y) if(!set_xy(x,y)/write a char to some position return 0; writedata(dat); return 1;int wr_str(unsigned char *str,int x,int y) if(!set_xy(x,y) return 0;/to write a string to some position while(*(str+) writedata(*(str-1); return 1; int wr_int1(int num,int x,int y)unsigned char seg1;if(!set_xy(x,y)return 0; if(num0) writedata(-); num=-num; seg0=num; writedata(seg0+0);return 1; int wr_int(int num,int x,int y) unsigned char seg2; if(!set_xy(x,y) /to write a interger to some position return 0; if(num0) writedata(-); num=-num; seg1=num/10; num=num%10; seg0=num; writedata(seg1+0); writedata(seg0+0); return 1;void delay(unsigned int cnt)while(-cnt);unsigned char key_scan(void)unsigned char i,n;unsigned char key_temp;key=0xf0;if(key&0xf0)!=0xf0)delay(10000);if(key&0xf0)!=0xf0)for(i=0;i4;i+)key=(1i);n=key;n&=0xf0;if(n!=0xf0)switch(n)case(0x70):key_temp=15-(3-i)*4;break;case(0xb0):key_temp=14-(3-i)*4;break;case(0xd0):key_temp=13-(3-i)*4;break;case(0xe0):key_temp=12-(3-i)*4;break;default:key_temp=no_key;return key_temp;return no_key;void check_wendu(void) unsigned int b,c,d; d=readtemperature()-5; /获取温度值并减去ds18b20的温漂误差 b=d/100; /计算得到十位数字 c=d/10-b*10; /计算得到个位数字 z=d/10; /计算得到整数位 j=d-b*100-c*10; /计算得到小数位if(z99)z=99;j=9; /设置温度显示上限 main()unsigned char opear;initlcd();delayms(15);tmod=0x02;th0=0x06;tl0=0x06;tr0=1;et0=1;ea=1;wr_str( : : ,0,0);wr_str( : ,0,1);wr_str( - - ,6,1);wr_str( . ,9,0);while(1)opear=key_scan();if(opear!=no_key)switch(opear)case(0):hour+;if(hour=24)hour=0;day+;wr_int(hour,0,0);break;case(1):min+;if(min=60)min=0;hour+;wr_int(min,3,0);break;case(2):h+;if(h=24)h=0;wr_int(h,0,1);break;case(3):m+;if(m=60)m=0;h+;wr_int(m,3,1);break;case(4):day+;if(day=31)day=0;month+;wr_int(day,14,1);break;case(5):month+;if(month=13)month=1;yearl+;wr_int(month,11,1);break;case(6):yearl+;if(yearl=100)yearl=0;yearh+;wr_int(yearl,8,1);break;case(7):yearh+;if(yearh=100)yearh=20;break;if(hour=h&min=m)beep=0;else beep=1;if(a=1)a=0;check_wendu();if(z99&j9)wr_int(z,9,0);wr_int1(j,12,0);wr_int(yearh,6,1);wr_int(yearl,8,1);wr_int(month,11,1);wr_int(day,14,1);wr_int(hour,0,0);wr_int(min,3,0);wr_int(sec,6,0);wr_int(h,0,1);wr_int(m,3,1);void t0 (void)interrupt 1 using 0tcnt+;if(tcnt=4000)tcnt=0;sec+;a=1;wr_int(sec,6,0);if(sec=60)sec=0;min+;if(min=60)min=0;hour+;if(hour=24)hour=0;day+;if(month=2&(yearl=0&yearh%4=0)|(yearl!=0&yearh%4=0)&day=30)day=1;else if(month=2&day=29)day=1;else if(month=4|month=6|month=9|month=11)&day=31)day=1;else if(day=32)day=1;if(day=1)month+;if(month=13)month=1;yearl+;if(yearl=100)yearl=0;yearh+;if(yearh=100)yearh=20;ds18b20调用的程序:#ifndef _ds18b20_h_#define _ds18b20_h_#include sbit dq=p37; /定义ds18b20总线i/o/*延时子程序*/void delay_ds18b20(int num) while(num-) ;/*初始化ds18b20*/void init_ds18b20(void) unsigned char x=0; dq = 1; /dq复位 delay_ds18b20(8); /稍做延时 dq = 0; /单片机将dq拉低 delay_ds18b20(80); /精确延时,大于480us dq = 1; /拉高总线 delay_ds18b20(14); x = dq; /稍做延时后,如果x=0则初始化成功,x=1则初始化失败 delay_ds18b20(20);/*读一个字节*/unsigned char readonechar(void) unsigned char i=0; unsigned char dat = 0; for (i=8;i0;i-) dq = 0; / 给脉冲信号 dat=1; dq = 1; / 给脉冲信号 if(dq) dat|=0x80; delay_ds18b20(4); return(dat);/*写一个字节*/void writeonechar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) dq = 0; dq = dat&0x01; delay_ds18b20(5); dq = 1; dat=1; /*读取温度*/unsigned int readtemperature(void) unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; init_ds18b20(); writeonechar(0xcc); /跳过读序号列号的操作 writeonechar(0x44); /启动温度转换 init_ds18b20(); writeonechar(0xcc); /跳过读序号列号的操作 writeonechar(0xbe); /读取温度寄存器 a=readonechar(); /读低8位 b=readonechar(); /读高8位 t=b; t=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; /放大10倍输出并四舍五入 return(t);感悟当今时代,是一个新技术层出不穷的时代。在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。大部分的高等工科学校都已开设了单片机课程。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。习单片机并不象学习传统数字电路或模拟电路那样比较直观,原因是除了“硬件”之外还存在一个“软件”的因素。正是这个“软件”因素的存在,使得许多初学者怎么也弄不懂单片机的工作过程,怎么也不明白为什么将几个数送来送去,就能控制一盏灯亮/灭?能控制一个电机变速?由此对单片机产生一种“神奇”、“敬畏”甚至“恐惧”感,阻碍了学习单片机的热情与兴趣,这就有社会上“单片机难学”一说。今天我们开始实训,通过c语言编程序,通过isp软件把程序烧写给at89c52,能在lcd1602显示时间、闹铃、万年历、温度,在第二天就实现了功能,但还没有达到我想要的要求,在以后,我会加以改正,从而弥补我的缺点。习单片机的最有效方法是理论与实践并重对于我来说,如果按教科书式的学法,上来就是一大堆指令、名词,学了半天还搞不清这些指令起什么作用,能够产生什么实际效果,那么也许用不了几天就会觉得枯燥乏味而半途而废。所以学习与实践结合是一个好方法,边学习、边演练,循序渐进,这样用不了几次就能将用到的指令理解、吃透、扎根于脑海,甚至“根深蒂固”。也就是说,学习完某几条指令后(一次数量不求多,只求懂),接下去就该做实验了,通过实验,感受刚才的指令产生了控制效果,眼睛看得见(灯光)、耳朵听得到(声音),更能深刻理解指令是怎样转化成信号去控制电子产品的。说句过分的话,单片机与其说是学出来的,还不如说是做实验练出来的,何况做实验本身也是一种学习过程。因此边学边练的学习方法,效果特别好,学习单片机要合理安排学习时间持之以恒学习单片机可不能“三天打鱼、二天晒网” ,要有持之以恒的毅力与决心,学习

温馨提示

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

评论

0/150

提交评论