版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机原理及应用课程设计学院: 信息电子学院 班级: 08电子信息工程 学号: e08610308 姓名: 陈建能 指导老师: 陈科包晓敏 日期: 20100114 任务书设计题目远程温度采集系统设计任务及步骤使用proteus作为开发工具,完成双机通讯的温度采集功能:一、 使用lm20温度传感器、ad1674模数转换器、at89c51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号(间隔5s)后通过串口发送到主机;二、 使用at89c51单片机、4位拨码开关、led显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(120
2、0,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3s),之后显示接收地址与温度信息,当接收时间间隔超过6s未收到数据,系统报警;三、 单片机一次只能发送一个字节的信息,使用多字节数据组成一帧数据,自定义一套通信协议来完成一、二的功能;扩展要求: 将双机通信改成多机通讯(一个接收器,多个发送器)论文要求 画出整个系统的电路原理图; 叙述各功能模块的工作原理; 编写各模块程序; 论文中应附上程序流程图; 书写论文时注意结构合理,层次分明,在分析时注意语言的流畅。工作计划 布置任务,查找资料 电路和程序设计 设计程序调试结果验收 论文答辩指导教师
3、包晓敏、陈科 2010年 12月 20 日目录1、课程设计目的42、课程设计工具及题目42.1、课程设计工具.4 2.2、课程设计题目.43、课程设计内容、步骤及电路原理图43.1、课程设计内容.43.2、课程设计步骤.43.3、整个系统的电路原理图.54、课程设计各模块工作原理5 4.1、温度采集模块.54.1.1、 lm20经ad1674转换为12位数据给从机.64.1.2、从机接收主机发送的波特率并且设置自己的波特率.84.1.3、拨码开关实现地址的变换.8 4.1.4、定时器实现5秒间隔84.1.5、发送温度和地址,及其通信协议94.2、温度接收模块.104.2.1、波特率设定及发送.
4、114.2.2、波特率显示并且延时3s.114.2.3、温度、地址的接收和判断114.2.4、数码管显示.124.2.5、系统报警125、课程设计成果135.1、显示波特率.135.2、显示温度与地址.145.3、改变温度地址后重新显示.145.4、报警.146、课程设计心得.157、参考文献.168、附录:源程序代码及注释178.1、从机源代码.178.2、主机源代码.20课程设计目的:单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮在全社会大规模地兴起。学习单片机的最有效方法就是理论与实践并重。系统地运用已学的理
5、论知识解决实际问题的能力和查阅资料的能力。培养一定的自学能力和独立分析问题、解决问题的能力,能通过独立思考、查阅工具书、参考文献,寻找解决方案;课程设计工具及题目: 1、课程设计工具:pc机、keil uvision4、protues7.64 2、课程设计题目:远程温度采集系统课程设计内容及步骤使用proteus作为开发工具,完成双机通讯的温度采集功能:1、 使用lm20温度传感器、ad1674模数转换器、at89c51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号(间隔5s)后通过串口发送到主机;2、 使用at89c51单片机、4
6、位拨码开关、led显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3s),之后显示接收地址与温度信息,当接收时间间隔超过6s未收到数据,系统报警;3、 单片机一次只能发送一个字节的信息,使用多字节数据组成一帧数据,自定义一套通信协议来完成一、二的功能;扩展要求: 将双机通信改成多机通讯(一个接收器,多个发送器) 各功能模块的工作原理:1、 温度采集模块使用lm20温度传感器、ad1674模数转换器、at89c51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定
7、模块的地址(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位数据存放在变
8、量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; uchar temp1,temp2; cs = 1; ce = 0; /初始化
9、,关闭数据采集 cs = 0; a0 = 0; rc = 0; ce = 1; /ce=1,cs1=0,rc=0,a0=0启动12位温度转换 _nop_(); while(sts=1);/等待数据采集结束 ce = 0; /芯片使能关闭 rc = 1; a0 = 0; ce = 1; /ce=1,cs1=0,rc=1,12/8=1,a0=0允许高八位数据并行输出 _nop_(); temp1 = p0;/读取转换结果的高八位 ce = 0;/芯片使能关闭 rc = 1; a0 = 1; ce = 1;/ce=1,cs1=0,rc=1,12/8=0,a0=1允许低四位数据并行输出 _nop_()
10、; temp2 = p0;/读取转换结果的低四位 temp = (temp14);/返回转换结果,右移四位是因为temp2为p0口的高四位(2)从机接收主机发送的波特率并且设置自己的波特率主机发送波特率给从机,从机查询法判断是否接收到主机发送的波特率,如果接收到主机发送的波特率则改变自己的波特率,跳出循环来实现发送温度地址的发送,否则一直循环判断是否接收到主机发送的波特率。/*查询法接收波特率*/while(1)if(ri = 1)temp = sbuf;set_bote(temp);/设置波特率break;(3)拨码开关实现地址的变换拨码开关接从机的p1口,然后改变拨码开关的值,p1口的数据
11、变换,等待传送给主机。(4)定时器实现5秒间隔定时器0工作方式1,初值装(65536-50000)实现50ms的定时,num为定时次数,当num=100时,定时为5s的间隔。(5)发送温度和地址,及其通信协议由于温度经过转换后发送给主机要保留一位小数的话大于255(即8位),还有温度有正负要判断,所以要发送多次数据给主机,主机经过判断才能确认从机发送的温度是整数部分、小数部分还是地址。通信协议如下:因为采集到的温度有正负,所以定义j表示温度的正负,j=0表示正,j=1表示负。j = 0;/温度正负标志位temp = ad1674_read();/读取转换后的12位温度值temp = (int)
12、(1.8528-temp*addo)*10000/11.79); /实现实际温度的转换其中add=10.0/4095if(temp 0) temp = - temp;j = 0x20; /温度若为负,则标志位00100000temp2 = temp % 10;/温度小数位存放在temp2中temp = temp / 10;小数部分temp2 = temp2+132;/温度小数位+132用于接收时的判断温度正负标志和地址temp = p1;temp = temp & 0x0f; /地址为p1口的低4位temp1 = temp1 4;temp1 = temp1 | 0xc0; /地址高位置1即11
13、000000用于接收判断temp = temp | temp1; temp = temp | j; /正负标志位存于temp中因为温度值是0-130之间的由于精度在1.41所以是0-132之间。所以温度值是小于132的。小数部分是0-9,所以小数部分+133即133-142之间的。而地址低4位0-15,高位直接置为1100,即大于192。所以主机只要判断在0-132之间就为温度的整数部分,133-142之间的就为温度的小数部分。剩下的就是地址、温度正负标志位的组合了。2、 温度接收模块使用at89c51单片机、4位拨码开关、led显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1
14、200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3s),之后显示接收地址与温度信息,当接收时间间隔超过6s未收到数据,系统报警;(1)波特率设定及发送拨码开关接主机的p1口,用于设定主机的波特率。p1口的数据分别为1、2、4、8时的波特率为1200、2400、4800、9600。然后发送给从机波特率,接着自己的波特率也随之改变。(2)波特率显示并且延时3s由p1口可以得到不同的值,从而用软件设定波特率(即设定定时器1的初值),不同的值存放在bote数组中用以数码管的显示。定时器t0实现定时功能,初值装(65536-50000)实现50m
15、s的定时,num为定时次数,当num为60的时候定时到了3s,以后就不用显示波特率了,所以用m变量为1表示波特率显示结束,不再显示波特率。(3)温度、地址的接收和判断温度地址接收是用串口中断实现的。ri为1的时候表示一帧数据已经接收完了,所以就开始判断是温度的整数部分、小数部分、还是地址和正负标志位组成的数据。通信协议如上:if(temp 132)/ 若所接收到的数小于132则是温度正数部分值 hextobcd(temp, aa, cc); /转换为温度值else if(temp 143)/若小于143,则为温度的小数部分值cc = temp - 132; /小数部分还原 else bb =
16、temp & 0x0f; /温度为低4位disnum6 = bb / 10; /存于数组中用于显示中disnum7 = bb % 10;aa = temp & 0x20; /温度正负标志位if(aa = 0) aa = 0;else aa = 1;(4)数码管显示模块 数据存于disnum数组中,用8位数码管来显示温度、地址以及波特率。段选接主机的p0口,片选接主机的p2口。一开始显示波特率,就选中最后4位。然后就是要显示温度和地址的信息了。温度为-55130所以前面4位显示温度后2位显示地址即:xxx.xc-xx。由于数码管是动态扫描的,所以要一定速度才可以实现视觉残留。看上去好像是一直点亮
17、一样的。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,实
18、现下次的报警功能。 m = 0; /波特率显示结束if(num1 = 120) /若已经计时6sif(flag = 0) /若没有接收到数据uchar t = 8;while(t-) /报警beep();else flag = 0; /否则接收到数据标志位清0num1 = 0; /计数次数清0 display_led();/显示温度和地址课程设计成果1、 显示波特率2、显示温度与地址 3、改变温度地址后重新显示4、报警课程设计心得 通过本次课程设计我学到了很多很多,虽然一开始的时候已经学过了c语言。并且自认为学得不错。但是到了实际的单片机还是有点区别的。不是再控制台下直接运行的,他还有他的一个
19、方式,一个功能来实现的。还好开学的时候学过单片的c语言。并且也买了很好的郭天祥的单片机c语言教程,还买了实际的开发板来做很多很多的实验。基本上单片机c语言已经入门了。但是那个开发板是已经焊好了的。不知道怎么连ad1674,不知道怎么连数码管。用protues仿真也是一开始用那个汇编编的。所以还是要慢慢地学习。 第一天、看到题目觉得一片茫然。不知道从何下手。慢慢地一点一点地来。首先是lm20。查看它的功能和作用。知道了他的转换公式。接着要用单片机采集的话,必须经过模数转换才可以实现。于是便开始ad1674芯片的学习了。被这个芯片搞得头都大了。花了1天时间总算弄好了采集那个部分。不过只是用了8位采
20、集,还没有12位的,精度不够。因为一开始用了12位的一直是出错的,后来8位居然是对的。就用了8位。第二天、开始了从机采集到的数据发给主机。还得学习下串口怎么发送,怎么接收,怎么初始化,怎么设定波特率,好多好多问题。迎面而来。此时又找不到任何一个人帮帮忙。于是便自己找资料,看书,图书馆。上网。最后终于兴奋地完成了从机发送采集到的数据给主机。第三天、那便是怎么把接收到的数据用数码管显示出来,这个倒是很容易。很快地,一个显示模块搞定了。此时整个系统基本上已经形成了。看着这一天天学到的,远远比课堂学到的多多了,所以理论联系实际才是最最重要的。接着便是改变地址,改变波特率,报警等等功能。也很快得到了解决
21、。 第四天、通过了微机的课程设计,于是便是单片机的了,早上很早就到了,心想得用12位的,于是便开始改了,居然人品爆了,改了以后一次性通过。所有的功能都实现了。真是太开心了。最后便交给老师检查,通过了。好开心啊!不仅学到了这么多,对于单片机还兴趣更加浓厚了。相信再努力点,以后会得到很多很多。此次课程设计,我知道了,做事不能犹豫,不能害怕,遇到困难就想办法解决。不要总是等着别人去完成,自信的自己才是最最好的。相信自己肯定可以完成一切。可以战胜困难,最后得到成功!参考文献1 郭天祥。新概念51单片机c语言教程m 2009.12附录:源程序代码及注释从机代码:#include#include#defi
22、ne uchar unsigned char #define uint unsigned int#define addo (10.0/4095.0)/转换进率,12位精度(212-1=4095),满量程为10vuint num; /计数次数/*管脚定义*/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;i110;i+);/*读取ad1674转换结果*/uint ad1674_read(voi
23、d) uint temp; uchar temp1,temp2; cs = 1; ce = 0; /初始化,关闭数据采集 cs = 0; a0 = 0; rc = 0; ce = 1; /ce=1,cs1=0,rc=0,a0=0启动12位温度转换 _nop_(); while(sts=1);/等待数据采集结束 ce = 0; /芯片使能关闭 rc = 1; a0 = 0; ce = 1; /ce=1,cs1=0,rc=1,12/8=1,a0=0允许高八位数据并行输出 _nop_(); temp1 = p0;/读取转换结果的高八位 ce = 0;/芯片使能关闭 rc = 1; a0 = 1; c
24、e = 1;/ce=1,cs1=0,rc=1,12/8=0,a0=1允许低四位数据并行输出 _nop_(); temp2 = p0;/读取转换结果的低四位 temp = (temp14);/返回转换结果,右移四位是因为temp2为p0口的高四位/*数据发送*/void putbyte(uchar byte)/ 利用硬件串口方式2 发送一个字节数据 sbuf = byte;/将要发送的数据送到发送缓冲区域,系统自动发送 while(!ti);/查询是否发送结束 当ti=1 代表发送结束 ti = 0;/清发送结束位方便下一次发送void init()tmod=0x21;/定时器为方式2tl1=0
25、xfd; th1=0xfd;/波特率为9.6kth0 = (65536 - 50000) / 256; /装初值实现50mstl0 = (65526 - 50000) % 256;tr0 = 1; /启动定时器0tr1 = 1; /启动定时器1et0 = 1; /开定时器0sm0 = 0; /方式2sm1 = 1;ri = 0;ti = 0;ren = 1;ea = 1; /开总中断es = 1; /开串口中断 /设置波特率void set_bote(uchar temp)if(temp=1) tl1=0xe8; th1=0xe8;/波特率为1.2k else if(temp=2) tl1=0
26、xf4; th1=0xf4;/波特率为2.4k else if(temp=4) tl1=0xfa; th1=0xfa;/波特率为4.8k else if(temp=8) tl1=0xfd; th1=0xfd;/波特率为9.6k /*主函数*/void main(void)int temp,temp1; uchar a, temp2;uchar j; init();/*查询法接收波特率*/while(1)if(ri = 1)temp = sbuf;set_bote(temp);/设置波特率break; while(1) while(num=100); /num计数100实现5秒的延时num =
27、0;j = 0;/温度正负标志位temp = ad1674_read();/读取转换后的12位温度值temp = (int)(1.8528-temp*addo)*10000/11.79); /实现实际温度的转换if(temp 0) temp = - temp;j = 0x20; /温度若为负,则标志位00100000temp2 = temp % 10;/温度小数位存放在temp2中temp = temp / 10;a = (uchar)temp; putbyte(a); /发送温度delay_ms(10);/延时一段时间temp2 = temp2+132;/温度小数位+132用于接收时的判断p
28、utbyte(temp2);delay_ms(10); /发送温度小数位temp = p1;temp = temp & 0x0f; /地址为p1口的低4位temp1 = temp1 4;temp1 = temp1 | 0xc0; /地址高位置1即11000000用于接收判断temp = temp | temp1; temp = temp | j; /正负标志位存于temp中putbyte(temp); /发送地址/*定时器0中断*/void t0() interrupt 1th0 = (65536 - 50000) / 256;/装初值50000实现50mstl0 = (65526 - 500
29、00) % 256;num+; /计数次数主机代码:#include #include #define uchar unsigned char#define uint unsigned int/*数码管显示0-9,-,c无小数点*/uchar code table=0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,0xbf, 0xc6;/*数码管显示0-9有小数点*/uchar code table1=0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10,0x3f
30、;/*位选信号选中数码管*/uchar disbit8 = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,0x40,0x80;uchar disnum8,bote4;/存放要显示的数据uchar flag, num, num1, m, aa, cc;sbit beep = p17; /蜂鸣器报警sbit led = p16;/红灯亮报警/*延时子程序*/void delay(uint i) char j; for(i; i 0; i-) for(j = 200; j 0; j-);/*向缓冲器中写入要显示的数据*/void hextobcd(uint temp, uch
31、ar a,uchar cc)temp = temp * 10 + cc;/*若为正数即0-130*/if(a = 0) disnum0 = temp/1000; /百位 disnum1 = temp%1000/100; /十位 disnum2 = temp%100/10; /各位disnum3 = temp%10; /小数位disnum4 = 11; /显示cdisnum5 = 10; /显示- /*若为负数即-55-0*/else if (a = 1) disnum0 = 10; /显示- disnum1 = temp/100; /十位 disnum2 = temp%100/10; /个位d
32、isnum3 = temp%10; /小数位disnum4 = 11; /显示cdisnum5 = 10; /显示-void init()scon = 0x50; tmod=0x21;/定时器为方式2tl1=0xfd; th1=0xfd;/波特率为9.6kth0 = (65536 - 50000) / 256; /装初值实现50mstl0 = (65526 - 50000) % 256;tr0 = 1; /开定时器0tr1 = 1; /开定时器1et0 = 1; /开定时器0ren= 1; /允许接收sm0 = 0; /方式2sm1 = 1;ea = 1; /开总中断es = 1; /开串口中
33、断/*数据发送*/void putbyte(uchar byte)/ 利用硬件串口方式2 发送一个字节数据 sbuf = byte;/将要发送的数据送到发送缓冲区域,系统自动发送 while(!ti);/查询是否发送结束 当ti=1 代表发送结束 ti = 0;/清发送结束位方便下一次发送 /*设置波特率 */void set_bote() uint temp=p1; temp=temp&0x0f;putbyte(temp);if(temp=1) tl1=0xe8; th1=0xe8;/波特率为1.2k else if(temp=2) tl1=0xf4; th1=0xf4;/波特率为2.4k
34、else if(temp=4) tl1=0xfa; th1=0xfa;/波特率为4.8k else if(temp=8) tl1=0xfd; th1=0xfd;/波特率为9.6k void display_led()uchar i;for(i = 0; i 8; i+) p2 = disbiti; /使用查表法进行位选 if(i != 2)p0 = tabledisnumi; else p0 = table1disnumi;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 main(void)uchar i;init(); /初始化set_bote();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 开关设备检修工岗前变革管理考核试卷含答案
- 称重传感器装配调试工诚信道德竞赛考核试卷含答案
- 研学旅行指导师冲突管理竞赛考核试卷含答案
- 炼钢浇铸工安全检查水平考核试卷含答案
- 道路巡视养护工岗前岗位环保责任制考核试卷含答案
- 2026年家庭健身器材升级合同协议
- 《13.2 上图书馆》教学设计、导学案、同步练习
- “作文”大赛策划方案
- 以劳动为笔绘就最美芳华-致敬五一劳动节
- 机械设计试题库及答案
- (2026年)世界哮喘日:让每位哮喘患者都能获得抗炎吸入剂-这仍是当务之急课件
- 2026年株洲市荷塘区社区工作者招聘笔试参考题库及答案解析
- 车间火灾应急指南
- 2026年北京市西城区高三一模地理试卷(含答案)
- 其他地区2025年昌都市政府系统急需紧缺人才引进招聘11人笔试历年参考题库附带答案详解(5卷)
- 中国中煤能源集团有限公司2026届高校毕业生春季招聘备考题库及答案详解(各地真题)
- 2026广东广州铁路运输法院合同制审判辅助人员招聘3人笔试参考题库及答案解析
- 2026年地铁行车调度业务实操试题
- 第三单元 认识国家制度 单元行动与思考 课件-2025-2026学年统编版道德与法治八年级下册
- 幕墙预埋件检测标准与操作指南
- 2025年湖南省农业信贷融资担保有限公司员工招聘笔试历年典型考点题库附带答案详解
评论
0/150
提交评论