基于ARM7的温度控制器的设计.docx
- 文档编号:18308539
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:30
- 大小:543.56KB
基于ARM7的温度控制器的设计.docx
《基于ARM7的温度控制器的设计.docx》由会员分享,可在线阅读,更多相关《基于ARM7的温度控制器的设计.docx(30页珍藏版)》请在冰点文库上搜索。
基于ARM7的温度控制器的设计
基于ARM7的温度控制器的设计
学院:
电气学院
班级:
11自一_
姓名:
杜康____
学号:
11020505
指导老师:
王崴
目录
一、简介4
1.单片机的发展历程4
2.stm32系列单片机4
3.DS18B20温度传感器5
二、总体方案设计7
1.主要功能7
2.设计要求7
三、最小系统的设计7
1.唤醒电路8
2.晶振延时电路及复位电路8
四、系统硬件分析与设计9
1.系统框图9
2.各模块电路图10
3.元器件11
(1)Stm32F103RBT632位单片机11
(2)TFTLCD液晶12
(3)其他元器件13
五、系统软件程序设计13
1.按键控制子流程图14
2.TFTLCD显示子流程图15
3.主流程图16
六、仿真与调试17
1.软件调试17
2.下载代码,软硬件联调18
七、个人总结20
八、参考文献21
九、附录22
1.系统电路原理图22
2.程序清单23
一、简介
1.单片机的发展历程
典型的微型计算机包括运算器、控制器、存储器、I/O接口四个基本组成部分。
如果在一块芯片上,集成了一台微型计算机的四个基本组成部分,这种芯片就被称为单片微型计算机(SingleChipMicrocomputer),简称单片机。
单片机具有体积小、功能强、应用面广等优点,目前正以前所未见的速度取代着传统电子线路构成的经典系统,蚕食着传统数字电路与模拟电路固有的领地。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
世界上各大芯片制造公司都推出了自己的单片机,从8位、16位到32位,数不胜数,应有尽有,有与主流C51系列兼容的,也有不兼容的,但它们各具特色,互成互补。
纵观单片机的发展过程,可以看出单片机的发展普遍呈现微型单片化、低功耗CMOS化、主流与多品种共存的趋势。
九十年代以后,单片机在结构上采用双CPU或内部流水线,CPU位数有8位、16位、32位,时钟频率高达20MHZ,片内带有PWM输出、监视定时器WDT、可编程计数器阵列PCA、DMA传输、调制解调器等。
芯片向高度集成化、低功耗方向的发展,使得单片机在大量数据的实时处理、高级通信系统、数字信号处理、复杂工业过程控制、高级机器人以及局域网等方面得到大量应用。
2.stm32系列单片机
传统的单片机(如51)使用的是复杂指令集(CISC),且不具备指令流水线;ARM使用的是精简指令集(RISC),而且使用了三级流水线。
这使得ARM的制造成本和运行效率相对51有着明显的优势。
传统的单片机一般都是8位机。
随着信息量的增加,我们会越来越多的需要处理超过8位以上的数据。
以32bit数据的加减法为例,51需要多次处理,而在ARM中只需要1个指令即可。
基于ARM内核的芯片种类越来越多,器外围接口(UART/SPI/IIC/USB/CAN/BUS/LCDC),内部一般都加入了DMA,进一步提升了性能。
给用户提供了很大的选择空间。
典型的如stm32系列单片机。
stm32系列32ARM单片机重塑了微控制器市场,克服了应用32位系统的所有障碍,是第一个由半导体厂商提供的基于ARMCOTEXM3的为控制器系列。
Stm32系列单片机为微控制器的用户带来了全新的自由度。
它拥有先进的性能,出色的功耗效率,一流的外设,最大化的集成度,最佳的代码紧凑性,大范围的存储容量选择,最佳的工具与软件平台。
3.DS18B20温度传感器
DS18B20是由DALLAS半导体公司推出的一种的“一线总线”接口的温度传感器。
与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。
一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,测量温度范围为-55~+125℃,精度为±0.5℃。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~l2位的数字值读数方式。
它工作在3—5.5V的电压范围,采用多种封装形式,从而使系统设计灵活、方便,设定分辨率及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
其内部结构见下图:
图1.1DS18B20内部结构图
ROM中的64位序列号是出厂前被光记好的,它可以看作是该DS18B20的地址序列码,每DS18B20的64位序列号均不相同。
64位ROM的排列是:
前8位是产品家族码,接着48位是DS18B20的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
ROM作用是使每一个DS18B20都各不相同,这样就可实现一根总线上挂接多个。
所有的单总线器件要求采用严格的信号时序,以保证数据的完整性。
DS18B20共有6种信号类型:
复位脉冲、应答脉冲、写0、写1、读0和读1。
所有这些信号,除了应答脉冲以外,都由主机发出同步信号。
并且发送所有的命令和数据都是字节的低位在前。
DS18B20的典型温度读取过程为:
复位,发SKIPROM命令(0XCC),发开始转换命令(0X44),延时,复位,发送SKIP,ROM命令(0XCC),发读存储器命令(0XBE),连续读出两个字节数据(即温度)->结束。
二、总体方案设计
1.主要功能
功能实现开机后能够检测到当前环境温度并实时送到LCD液晶屏上显示出来,按升温按键,电机正转;按降温按键,电机反转。
LED指示灯不断闪烁,表明单片机正在执行当前程序。
2.设计要求
开机的时候先检测是否有DS18B20存在,如果没有,则提示错误。
当检测到DS18B20之后才开始读取当前环境温度并显示在LCD上,如果发现了DS18B20,则程序每隔200ms左右读取一次数据,并把温度显示在LCD上。
按下相应按键,可以控制电机正转或反转。
三、最小系统的设计
1.唤醒电路
图1.2唤醒电路的设计
按下WK_UP按键,即可实现唤醒控制器开始工作。
2.晶振延时电路及复位电路
图1.3晶振延时电路
图1.4复位电路
Y1、Y2、C3、C4、C5、C6、R4等共同构成了外部振荡电路,Y1选择32.768KHz,Y2选择8MHz,C3、C4、C5、C6均取22pF。
复位信号从单片机的NRST引脚输入,按下复位键,即可使单片机复位。
复位操作有上电复位和手动复位两种,本次采用手动复位电路。
四、系统硬件分析与设计
1.系统框图
图1.5系统总体框图
2.各模块电路图
1)温度检测模块
图1.6基于DS18B20的温度检测模块电路
2)按键控制模块
图1.7按键控制模块电路
3)液晶显示模块
图1.8TFTLCD液晶显示模块电路
4)LED指示灯
图1.9LED指示灯模块电路
5)电机控制电路
图2.0电机控制H桥电路
3.元器件
1)Stm32F103RBT632位单片机
本次使用的单片机采用LQFP-64封装,其芯片内部集成了USB外设,大大减轻了USB电路设计的负担,只需设计USB接口电路,就可以实现基于STM32电路板的USB通信设计,是一款集32位MCU、USB、CAN、7个16位定时器、两个ADC和9个通信接口的芯片。
它具有低功耗、直接存储器存取、多达80I/O快速端口等很多性能方面的优势。
图2.1STM32F103RBT632位ARM引脚排列图
2)TFTLCD液晶
本次使用的是TFTLCD,其引脚排列为:
1号引脚为片选信号输入,2、3、4号分别为RS、WR和RD,5号引脚为复位端,时钟信号为34号引脚,6~21为DB1~DB17等。
采用DB_LCD封装。
图2.2LCD引脚排列图
3)其他元器件
五、系统软件程序设计
1.按键控制子流程图
2.TFTLCD显示子流程图
3.主程序流程图
六、仿真与调试
1.软件调试
打开keilforARM,进入软件操作界面。
新建newproject,选择单片机型号为stm32F103RBT6,生成target1sourcegroup1,新建file,写入C语言代码,添加到sourcegroup1,选择好各种配置文件,勾选“createhexfile“,选择projectrebuildalltargets进行编译程序,若有错误则纠错到”0error(s),0warning(s)“为止。
图2.3本次程序编译结果
2.下载代码,软硬件联调
安装USB串口驱动CH340,安装完成后再安装STMISP下载器MCUISP。
安装成功后,打开MCUISP软件,点击搜索串口,即可找到已经安装好的USB-SERIALCH340串口。
点击读器件信息,若前面操作均无错误,那么会看到软件提示“命令执行完毕,一切正常”,如下图所示情况。
图2.3器件信息读取正常
然后将在MDK里已经生成的HEX文件装载到MCUISP中,如下图所示。
图2.4载入HEX文件
点击“开始编程”,并把“编程后执行”勾选中。
编程完毕如下图所示。
图2.5编程完成
程序运行结果如下图所示:
七、个人总结
通过本次温控器的设计,我体会到“书到用时方恨少”的道理,从书本上学到的知识对于我们实践来说,是远远不够的。
查阅资料和阅读相关文献是非常重要的。
我们必须学会怎样查找资源,利用资源,整合资源,从资源中获得我们需要的东西。
我们还要更全面地了解单片机的功能,如何应用单片机,各系列单片机的优缺点,适应范围。
遇到不会的内容要虚心向别人请教,但同时不能过分依赖别人,本次课程设计我单人完成的,所以更能锻炼我个人解决问题的能力。
对待任何事情都要有耐心,遇到问题要冷静地思考,不要程序有错误或者硬件调试不成功就急躁,慌乱,仔细地分析问题出在哪里,一步一步解决问题,直至调试成功。
我更深刻的认识到了实践在大学课程中的重要性,书本是实践的基础,学好书本知识,才能更好地应用于实践,而实践反过来又能巩固和检验我们到底学的扎不扎实,
同时我也发觉到了自己在学习方面存在的许多不足之处,在以后的学习中我会努力改进这些不足,不断提高自己的动手实践能力。
八、参考文献
周立功,ARM嵌入式系统基础教程[M].北京航空航天大学出版社,2008.09
周立功,ARM嵌入式系统实验教程[M].北京航空航天大学出版社,2005.10
刘军、张洋,例说STM32第二版[M].北京航空航天大学出版社,2014.06
张齐,单片机原理与应用系统设计[M].电子工业出版社,2009.01
钱显毅、钱爱玲,传感器原理与应用[M].中国水利水电出版社,2013.02
徐爱均、徐阳,智能化测量控制仪表原理与设计[M].北京航空航天大学出版社,2012.03
九、附录
1)系统电路原理图
2)程序清单
主程序:
#include"led.h"
#include"delay.h"
#include"sys.h"
#include"usart.h"
#include"lcd.h"
#include"ds18b20.h"
#include"key.h"
intmain(void)
{
u8t=0;
shorttemperature;
shortwendu;
shortxianshi;
delay_init();//延时函数初始化
uart_init(9600);//串口初始化为9600
LED_Init();//初始化与LED连接的硬件接口
LCD_Init();
KEY_Init();
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,"designbydk");
LCD_ShowString(60,70,200,16,16,"DS18B20TEST");
LCD_ShowString(60,90,200,16,16,"fromCIT");
LCD_ShowString(60,110,200,16,16,"2014/10/10");
while(DS18B20_Init())//DS18B20初始化
{
LCD_ShowString(60,130,200,16,16,"DS18B20Error");
delay_ms(200);
LCD_Fill(60,130,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(60,130,200,16,16,"DS18B20OK");
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,150,200,16,16,"Temp:
.C");
while
(1)
{
if(t%100==0)//每1S读取一次
{
temperature=DS18B20_Get_Temp();
wendu=temperature;
if(wendu<0)
{
LCD_ShowChar(60+40,150,'-',16,0);//显示负号
wendu=-wendu;//转为正数
}elseLCD_ShowChar(60+40,150,'',16,0);//去掉负号
if(KEY0==0){wendu=wendu+5;xianshi=wendu;}
if(KEY1==0){wendu=wendu-5;xianshi=wendu;}
LCD_ShowNum(60+40+8,150,xianshi/10,2,16);//显示正数部分
LCD_ShowNum(60+40+32,150,xianshi%10,1,16);//显示小数部分
}
delay_ms(10);
t++;
if(t==200)
{
t=0;
LED0=!
LED0;
}
}
}
按键扫描子程序:
#include"key.h"
#include"delay.h"
//按键初始化函数
//特别注意:
在该函数之后,JTAG将无法使用(SWD也无法使用)
//如果想JTAG仿真,可以屏蔽该函数。
//PA0.13.15设置成输入
voidKEY_Init(void)
{
RCC->APB2ENR|=1<<2;//使能PORTA时钟
RCC->APB2ENR|=1<<4;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0FFFFFFF;//15设置成输入
GPIOA->CRH|=0X80000000;
GPIOA->ODR|=1<<15;
GPIOC->CRL&=0XFF0FFFFF;
GPIOC->CRL|=0X00800000;
GPIOC->ODR|=1<<5;//PA15上拉,PA0默认下拉,PC5上拉
}
//按键处理函数
//返回按键值
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2!
!
u8KEY_Scan(u8mode)
{
staticu8key_up=1;//按键按松开标志
if(mode)key_up=1;
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY0==0)returnKEY0_PRES;
elseif(KEY1==0)returnKEY1_PRES;
elseif(WK_UP==1)returnWKUP_PRES;
}elseif(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return0;//无按键按下
}
LCD显示子程序:
voidLCD_ShowxNum(u16x,u16y,u32num,u8len,u8size,u8mode)
{
u8t,temp;
u8enshow=0;
for(t=0;t { temp=(num/LCD_Pow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { if(mode&0X80)LCD_ShowChar(x+(size/2)*t,y,'0',size,mode&0X01); elseLCD_ShowChar(x+(size/2)*t,y,'',size,mode&0X01); continue; }elseenshow=1; } LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode&0X01); } } //显示字符串 //x,y: 起点坐标 //width,height: 区域大小 //size: 字体大小 //*p: 字符串起始地址 voidLCD_ShowString(u16x,u16y,u16width,u16height,u8size,u8*p) { u8x0=x; width+=x; height+=y; while((*p<='~')&&(*p>=''))//判断是不是非法字符! { if(x>=width){x=x0;y+=size;} if(y>=height)break;//退出 LCD_ShowChar(x,y,*p,size,0); x+=size/2; p++; } } DS18B20配置子程序: //复位DS18B20 voidDS18B20_Rst(void) { DS18B20_IO_OUT();//SETPA0OUTPUT DS18B20_DQ_OUT=0;//拉低DQ delay_us(750);//拉低750us DS18B20_DQ_OUT=1;//DQ=1 delay_us(15);//15US } //等待DS18B20的回应 //返回1: 未检测到DS18B20的存在 //返回0: 存在 u8DS18B20_Check(void) { u8retry=0; DS18B20_IO_IN();//SETPA0INPUT while(DS18B20_DQ_IN&&retry<200) { retry++; delay_us (1); }; if(retry>=200)return1; elseretry=0; while(! DS18B20_DQ_IN&&retry<240) { retry++; delay_us (1); }; if(retry>=240)return1; return0; } //从DS18B20读取一个位 //返回值: 1/0 u8DS18B20_Read_Bit(void)//readonebit { u8data; DS18B20_IO_OUT();//SETPA0OUTPUT DS18B20_DQ_OUT=0; delay_us (2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SETPA0INPUT delay_us(12); if(DS18B20_DQ_IN)data=1; elsedata=0; delay_us(50); returndata; } //从DS18B20读取一个字节 //返回值: 读到的数据 u8DS18B20_Read_Byte(void)//readonebyte { u8i,j,dat; dat=0; for(i=1;i<=8;i++) { j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>>1); } returndat; } //写一个字节到DS18B20 //dat: 要写入的字节 voidDS18B20_Write_Byte(u8dat) { u8j; u8testb; DS18B20_IO_OUT();//SETPA0OUTPUT; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DS18B20_DQ_OUT=0;//Write1 delay_us (2); DS18B20_DQ_OUT=1; delay_us(60); } else { DS18B20_DQ_OUT=0;//Write0 delay_us(60); DS18B20_DQ_OUT=1; delay_us (2); } } } //开始温度转换 voidDS18B20_Start(void)//ds1820startconvert { DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);//skiprom DS18B20_Write_Byte(0x44);//convert } //初始化DS18B20的IO口DQ同时检测DS的存在 //返回1: 不存在 //返回0: 存在 u8DS18B20_Init(void) { GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA口时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PORTA0推挽输出 GPIO_InitStructure.GPIO_M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ARM7 温度 控制器 设计