单片机课程设计报告--远程温度采集系统.doc_第1页
单片机课程设计报告--远程温度采集系统.doc_第2页
单片机课程设计报告--远程温度采集系统.doc_第3页
单片机课程设计报告--远程温度采集系统.doc_第4页
单片机课程设计报告--远程温度采集系统.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

单片机原理及应用课程设计学院: 班级: 学号: 姓名: 指导老师: 日期: 单片机应用技术课程设计任务书设计题目远程温度采集系统设计任务及步骤使用proteus作为开发工具,完成双机通讯的温度采集功能:一、 使用lm20温度传感器、ad1674模数转换器、at89c51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号后通过串口发送到主机;二、 使用at89c51单片机、4位拨码开关、led显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3s),之后显示接收地址与温度信息;论文要求 画出整个系统的电路原理图; 叙述各功能模块的工作原理; 编写各模块程序; 论文中应附上程序流程图; 书写论文时注意结构合理,层次分明,在分析时注意语言的流畅。工作计划 布置任务,查找资料 电路和程序设计 设计程序调试结果验收 论文答辩指导教师签 名 年 月 日系 意 见系主任签名: 年 月 日课程设计内容及步骤使用proteus作为开发工具,完成双机通讯的温度采集功能:1、 使用lm20温度传感器、ad1674模数转换器、at89c51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号(间隔5s)后通过串口发送到主机;2、 使用at89c51单片机、4位拨码开关、led显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3s),之后显示接收地址与温度信息。3、 扩展要求: 将其设计成:当定时器达到一定时间时,从机没有收到来自主机的信号,则从机“发光报警”。当遇到故障时,也会发光报警,即将从机上的rxd或txd接按键开关,接地或是接电源作为模拟信号。收到主机的信号后,又能恢复正常。整个系统的电路原理图:各功能模块的工作原理:1、 温度采集模块使用lm20温度传感器、ad1674模数转换器、at89c51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号(间隔5s)后通过串口发送到主机;(1)lm20经ad1674转换为12位数据给从机lm20温度传感器经过电压跟随器后输入到ad1674的10vin口,ad1674组成双峰。sts、cs、a0、ce、rc分别接到从机的p0-p4口实现ad1674的控制作用。一开始ce=1,cs=0,rc=0,a0=0启动12位温度转换,然后等待数据采集结束while(sts=1); 接着ce=1,cs=0,rc=1,12/8=1,a0=0允许高八位数据并行输出,最后ce=1,cs=0,rc=1,12/8=0,a0=1允许低四位数据并行输出。读出的12位数据存放在变量temp中。经过ad1674转换后输出的结果精确到(10.0/4095.0)。若lm20温度转换为电压值是1.13598v时,经过ad1674转换后输出的12位数为1.13598*4095/10=465转换为2进制为000111010001。12位数据经过公式转换t = (1.8525-temp*10/4095.0)*10000/11.79.然后把低位小数位给temp1,temp就为整数部分,接着就是等待发送给主机。/*读取ad1674转换结果*/uint ad1674_read(void) uint temp; cs = 1; ce = 0; /初始化,关闭数据采集 cs = 0; a0 = 1; rc = 0; ce = 1; /ce=1,cs1=0,rc=0,a0=0启动8位温度转换 _nop_(); while(sts=1);/等待数据采集结束 ce = 0; /芯片使能关闭 rc = 1; a0 = 0; ce = 1; /ce=1,cs1=0,rc=1,12/8=1,a0=0允许高八位数据并行输出 _nop_(); temp = p1;/读取转换结果的低八位 return (temp);/返回转换结果(2)从机接收主机发送的波特率并且设置自己的波特率主机发送波特率给从机,从机查询法判断是否接收到主机发送的波特率,如果接收到主机发送的波特率则改变自己的波特率,跳出循环来实现发送温度地址的发送,否则一直循环判断是否接收到主机发送的波特率。/设置波特率void set() uint temp=p0;temp=temp4;temp = temp&0x0f;if(temp=1) tmod=0x21;/定时器为方式2,tmod高四位控制 t1 tl1=0xf4;/时间常数初值 th1=0xf4;/时间常数初值,波特率为1.2kpcon=0x00; /正常方式,smod=0,波特率为f/64 else if(temp=2) tmod=0x21;/定时器为方式2 tl1=0xfa; th1=0xfa;/波特率为2.4kpcon=0x00; else if(temp=4) tmod=0x21;/定时器为方式2 tl1=0xfd; th1=0xfd;/波特率为4.8kpcon=0x00; else if(temp=8) tmod=0x21;/定时器为方式2 tl1=0xfd; th1=0xfd;/波特率为9.6kpcon=0x80; /smod=1,波特率加倍 (3)拨码开关实现地址的变换拨码开关接从机的p1口,然后改变拨码开关的值,p1口的数据变换,等待传送给主机。(4)定时器实现5秒间隔定时器0工作方式1,初值装(65536-50000)实现50ms的定时,num为定时次数,当num=100时,定时为5s的间隔。2、 温度接收模块使用at89c51单片机、4位拨码开关、led显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3s),之后显示接收地址与温度信息。(1)波特率设定及发送拨码开关接主机的p1口,用于设定主机的波特率。p1口的数据分别为1、2、4、8时的波特率为1200、2400、4800、9600。然后发送给从机波特率,接着自己的波特率也随之改变。(2)波特率显示并且延时3s由p1口可以得到不同的值,从而用软件设定波特率(即设定定时器1的初值),不同的值存放在bote数组中用以数码管的显示。定时器t0实现定时功能,初值装(65536-50000)实现50ms的定时,num为定时次数,当num为60的时候定时到了3s,以后就不用显示波特率了,所以用m变量为1表示波特率显示结束,不再显示波特率。(3)温度、地址的接收和判断温度地址接收是用串口中断实现的。ri为1的时候表示一帧数据已经接收完了,所以就开始判断是温度的整数部分、小数部分、还是地址和正负标志位组成的数据。通信协议如上:if(temp 16)disnum4 = temp / 10;/求十位disnum5 = temp % 10;/求个位elsetemp1 = (uint)(1.8528-temp*10.0/255)*(10000/11.79); hextobcd(temp1);(4)数码管显示模块 数据存于disnum数组中,用8位数码管来显示温度、地址以及波特率。段选接主机的p0口,片选接主机的p2口。一开始显示波特率,就选中最后4位。然后就是要显示温度和地址的信息了。温度为-55130所以前面4位显示温度后2位显示地址即:xx.xxx。由于数码管是动态扫描的,所以要一定速度才可以实现视觉残留。看上去好像是一直点亮一样的。void display_led()uchar i;for(i = 0; i 8; i+) p2 = disbiti; /使用查表法进行位选 if(i != 2)p0 = tabledisnumi; else p0 = table1disnumi;delay(150); /扫描间隔时间 太长会数码管会有闪烁感 (5)系统报警定时器0实现定时功能,num1为报警的时间的计算,定时器是实现50ms的,所以要120才能实现6s。num1 = 120,那么判断一下flag(是否接收到传送过来的数据)如果flag = 0;说明没有接收到采集的数据,接着就报警,还要把num1和flag重新清0,实现下次的报警功能。 elsem = 0;if(num1 = 120)if(flag = 0)uchar t =8;while(t-)beep(); led();elseflag = 0;num1 = 0;if(txd=0) flag=1; beep();led();display_led();课程设计成果1、显示波特率2、显示温度与地址 3、报警程序流程图:开始lm20温度传感器采集温度将采集到得温度传入ad1674模数转换器,进行ad转换。数字信号传给主机由主机传给远距离处的从机txd是否为1系统发光报警系统正常显示屏先显示波特率,几秒钟后,左边三位显示温度,右边两位显示拨码开关的值结束课程设计心得: 通过本次课程设计我学到了很多在课本上、课堂上难以学到的东西。这也验证了实践是检验真理的唯一标准。虽然大二的时候已经学过了c语言,但这与实际的单片机还是有点区别的。本次实验中,我没有用汇编编写程序,而是采用了c语言。 刚拿到实验内容的时候,我的头脑一片空白,可以说对于这次的课程设计相当没有底。就比如ad1674,之前从未接触过,更别说将其连到电路中了,还有很多问题如何在程序中实现等问题。于是,我只得先去查资料。首先是lm20,查看它的功能和作用。知道了他的转换公式。接着要用单片机采集的话,必须经过模数转换才可以实现,于是便开始ad1674芯片的学习了。这个芯片的理解还是比较麻烦的,花了将近1天时间才总算弄明白一点。之后,我又通过看书学习了串口怎么发送,怎么接收,怎么初始化,怎么设定波特率。问题很多,但是在同学们的帮助下,终于完成了从机发送采集到的数据给主机。接着便是改变地址,改变波特率,报警等等功能,这些功能的话,其实前面的弄懂后,这些都是比较容易实现的。好不容易将程序写好、弄懂后,迎来了老师的答辩时间。老师要求我们增加发光报警功能。刚拿到的时候,感觉挺简单的,但是要改,却又不知改哪里。最终在即将到时间的时候,我灵光一闪,成功实现了老师要求的内容。当时真的好开心,因为这是我凭自己的能力做出来的。在这次课程设计中,我不仅学到了很多知识,而且对于单片机还产生了更加浓厚的兴趣。我决定以后多花更多的课余时间,来设计这类的单片机问题,让自己积累更多的实践经验。同时也让我知道了,做事不能犹豫,不能害怕,遇到困难就想办法解决。不要总是等着别人去完成,自信的自己才是最最好的。相信自己肯定可以完成一切。可以战胜困难,最后得到成功!参考文献:1 郭天祥。新概念51单片机c语言教程m 2009.122单片机原理及其接口技术,胡汉才编著,清华大学出版社附录:源程序代码及注释从机代码:#include#include#define uchar unsigned char #define uint unsigned int#define addo (10.0/255.0)/转换进率,12位精度(212-1=4095),满量程为10v/*管脚定义*/sbit sts = p20;sbit cs = p21;sbit a0 = p22;sbit ce = p23;sbit rc = p24;/*毫秒延时函数*/void delay_ms(uint n)uint i;while(n-) for(i=0;i4;temp = temp&0x0f;if(temp=1) tmod=0x21;/定时器为方式2,tmod高四位控制 t1 tl1=0xf4;/时间常数初值 th1=0xf4;/时间常数初值,波特率为1.2kpcon=0x00; /正常方式,smod=0,波特率为f/64 else if(temp=2) tmod=0x21;/定时器为方式2 tl1=0xfa; th1=0xfa;/波特率为2.4kpcon=0x00; else if(temp=4) tmod=0x21;/定时器为方式2 tl1=0xfd; th1=0xfd;/波特率为4.8kpcon=0x00; else if(temp=8) tmod=0x21;/定时器为方式2 tl1=0xfd; th1=0xfd;/波特率为9.6kpcon=0x80; /smod=1,波特率加倍 /*主函数*/void main(void)init(); set();while(1)uint temp; set();temp = ad1674_read(); putbyte(temp); /发送温度delay_ms(50);temp = p0;temp = temp & 0x0f; /屏蔽高四位putbyte(temp); /发送地址主机代码:#include #include #define uchar unsigned char#define uint unsigned int/uchar code table=0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,0xbf;/显示 0到 9的代码 ,使 p2口显示uchar code table1=0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10,0x3f;/显示 0.到 9. 即使 p0口可以显示小数点uchar disbit6 = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20;/依次使六个lcd显示数字uchar disnum6,bote4;uchar flag, num, num1, m;sbit beep = p26; /蜂鸣器报警sbit led = p27;/红灯亮报警sbit txd=p31;#define addo (10.0/4095.0)/转换进率,12位精度(212-1=4095),满量程为10vvoid delay(uint i) /延时 char j; for(i; i 0; i-) for(j = 200; j 0; j-);/*向缓冲器中写入要显示的数据*/void hextobcd(uint temp) disnum0 = temp/100;/求百位上的数字 disnum1 = temp%100/10;/求十位上的数字 disnum2 = temp%10;/求个位上的数字disnum3 = 10;/void init()scon = 0x50;th0 = (65536 - 50000) / 256;tl0 = (65526 - 50000) % 256;tr0 = 1; /启 t0计数tr1 = 1; et0 = 1;/开 t0中断ren= 1;/允许接收sm0 = 0;sm1 = 1;/开串口中断ea = 1;es = 1;/*设置波特率 */void set() uint temp=p1;/读取波特率 temp=temp&0x0f; /屏蔽高四位,保留低四位if(temp=1) tmod=0x21;/定时器为方式 2 ,选择t0 tl1=0xf4; th1=0xf4;/波特率为1.2kpcon=0x00; else if(temp=2) tmod=0x21;/定时器为方式2 tl1=0xfa; th1=0xfa;/波特率为2.4kpcon=0x00; else if(temp=4) tmod=0x21;/定时器为方式2 tl1=0xfd; th1=0xfd;/波特率为4.8kpcon=0x00; else if(temp=8) tmod=0x21;/定时器为方式2 tl1=0xfd; th1=0xfd;/波特率为9.6kpcon=0x80; void display_led()/选择每位显示的数据类型 ,依次从第一位 到 第六位uchar i;for(i = 0; i 6; i+)p2 = disbiti;/使用查表法进行位选,p2口用于选择哪个led发光 if(i=1) p0 = table1disnumi;/显示数 码管的第二个disnumi:求十位上的数字 else p0 = tabledisnumi;delay(150); /扫描间隔 时间,太长会数码管会有闪烁感void beep() uchar i , j;led = 1; for (i = 0; i 100; i+) beep = !beep; /beep取反 for(j = 0; j 250 ; j+) /需要产生方波 _nop_(); beep = 1; /关闭蜂鸣器void led () uchar i , j;beep = 1; for (i = 0; i 100; i+) led = !led; /led取反 for(j = 0; j 250 ; j+) /需要产生方波 _nop_(); led = 1; /灭红灯void main(void)uchar i;num = 0;num1 = 0;m = 1;flag = 1;init();set();while(1)led = 0;set();if(num = 60 & m = 1)uchar temp = p1 & 0x0f;

温馨提示

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

评论

0/150

提交评论