资源描述
个人收集整理 勿做商业用途
生产实习报告
题目:温度采集显示电路
班级:电气082
姓名:穆昊
学号:0810430214
成绩:__________
目录
摘要: 2
一、实习目的 3
二、实习要求 3
三、实习内容 3
(一)硬件结构 3
1、最小系统原理图 3
2、温度采集原理图 4
3、数码管显示原理图 4
4、按键原理图 4
5、RS—232串口通信原理图 5
(二)软件结构 5
1、延时程序设计 5
2、传感器数据读取程序 6
3、串口通信程序设计 7
4、按键程序设计 7
5、主程序设计 8
四、调试 10
五、结论 10
参考文献 11
摘要:
本作品采用STC89C52单片机作为核心控制器,配合外部硬件—-DS18B20、数码管、按键、MAX232电平转换完成了温度的实时显示功能,按键控制单片机向上位机发送温度的功能。本作品具有硬件电路简单,温度采集精度较高、范围广,使用方便等特点.
一、实习目的
实习是大学学习很重要的环节,因为大学的学习中本来就缺少实践机会,而这次实习给我们提供了一个很难得的动手的机会,通过这次实习不仅可以使我们增强动手能力,而且可以让我们对专业相关知识有更深入的了解。在本次实习中,我了解了电子产品的基本设计生产流程,学习了基本的电子工艺,掌握了电子元件的基本知识、焊接工艺、常用仪表的使用等,同时在实习过程中也提高了分析问题和解决问题的能力。
二、实习要求
1.了解单片机的设计、生产、开发流程,基本掌握单片机的开发。本次实习实验板上设计安装了4个八段数码管,8个发光二极管,八个按键,RS232串行接口,MAX485,等,采用USB供电,所有资源均可用跳线选择。使用这块实验板可以进行流水灯,数码管显示,中断,温度采集等试验。
2。测试程序可以帮助检测焊接是否正确,有效找到问题,充分利用资源.
三、 实习内容
(一)硬件结构
1、最小系统原理图
最小系统包括晶振电路、复位电路、I/0口上拉电阻、STC89C52几部分。
2、温度采集原理图
我们温度采集模块采用了DS18B20芯片,该芯片采集精度高,使用方便,采集范围较广,具有较强的实用性.
3、数码管显示原理图
数码管显示部分采用74HC573锁存器控制数码管的段选,74HC138控制数码管的位选.
4、按键原理图
我们用来控制发送数据的按键选择了开发板上的独立按键,独立按键与单片机的外部中断0端口相连。当按键按下时,触发单片机的外部中断,控制单片机向上位机发送数据.
5、RS—232串口通信原理图
我们实现的单片机与计算机之间的通信用到了串口通信,而此开发板的串口通信是利用了RS—232串行通信,此串行通信要符合RS—232通信协议。
RS-232C标准对电气特性、逻辑电平和各种信号线功能都做了规定.对于数据,逻辑“0”的电平高于-3V,逻辑“1”的电平低于+3V;对于控制信号,接通状态即信号有效地电平高于+3V,断开状态即信号无效的电平低于-3V。也就是当传输电平的绝对值大于3V时,电路可以有效地检查出来,介于-3V~+3V之间的电压无意义,低于—15V或高于+15V的电压也认为无意义,因此,实际工作时应保证电平在±(3~15)V之间.ELA-RS-232C与TTL以高低电平表示逻辑状态的规定不同,因此,为了能够同计算机接口,必须在ELA—RS—232C与TTL电路之间进行电平和逻辑关机的变换。为了是吸纳这种变换,这块开发板使用的是MAX232芯片,电路图如下所示.
(二)软件结构
1、延时程序设计
由于DS18B20控制要求比较高的时序,而单片机又没有太多的任务可做,因此我们直接使用延时程序实现了时序的要求。
程序大致如下:
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
uchar x,j;
for(j=0;j〈i;j++)
for(x=0;x<=148;x++);
}
2、传感器数据读取程序
我们使用的温度传感器为DS18B20,由于这款芯片为单总线设计,读取数据需要按照严格的时序,我们使用了精准的延时程序实现了这款芯片的控制。其程序大致如下:
/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar Reset(void)
{
uchar deceive_ready;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
deceive_ready = DQ;
delay(25);
return(deceive_ready);
}
/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit(void)
{
uchar i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte(void)
{
uchar i,m,receive_data;
m = 1;
receive_data = 0;
for(i=0; i〈8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i);
}
delay(6);
}
return(receive_data);
}
/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0; i〈8; i++)
{
temp = val >〉 i;
temp = temp & 0x01;
write_bit(temp);
delay(5);
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
float tt;
uint temp;
P2 = 0x00;
while(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL = read_byte();
TMPH = read_byte();
temp = TMPH;
temp <〈= 8;
temp = temp | TMPL;
tt = TMPL * 0.0625;
temp = TMPL / 16 + TMPH * 16;
P0 = table[temp/ 10]; //显示高位键值
P2 = 0x00;
Delay_1ms(5);
P0 = table[temp % 10]; //显示低位键值
P2 = 0x01;
Delay_1ms(5);
}
}
3、串口通信程序设计
串口通信部分我们是利用AT89C52单片机本身提供的串口通信功能完成的,其向上位机发送数据是在中断程序中完成的。当进入中断时,首先进行按键的滤波,然后将采集到的数据发送到上位机。
4、按键程序设计
我们设计的按键是采用是与单片机外部中断端口相连的独立按键。当有按键按下时,即触发了外部中断,实现了按键的采集。按键产生的操作既可以在外部中断程序中完成.
5、主程序设计
主程序流程图大致如下:
四、调试
调试过程我遇到了以下几个问题:
1、无法控制停止单片机向上位机发送数据;
解决方法:添加了外部中断之后,而主程序中向上位机发送数据的程序未删除。
2、向上位机发送的是16进制的数值,读取不是很方便;
解决方法:将需要发送的数据转化为ASCII码中对应的数字,然后用字符格式显示。
3、向上位机发送的两个数据之间没有间隔,而至于视觉效果不是很好;
解决方法:在发送了所需要的数据之后,然后在发送一个空格.
4、几个数码管之间的亮度不一样;
解决方法:由于除了了显示程序之外,其他程序也占用单片机执行的时间,所以最后一位数码管持续的时间比较长,我们让几位数码管点亮持续时间不同,然后我们看到的亮度就是一样的了。
五、结论
通过了这两周的生产实习,我们学到了一个产品成型所要经过的必要的步骤,对我们以后的学习工作有很大的益处。感谢老师能给我们这次学习的机会。让我们有了实践和动手能力,为以后的工作奠定了坚实的基础!
参考文献
[1] 51单片机C语言编程 郭天祥2009.9
展开阅读全文