文档库 最新最全的文档下载
当前位置:文档库 › 温度控制单片机PWM输出设计

温度控制单片机PWM输出设计

温度控制单片机PWM输出设计
温度控制单片机PWM输出设计

学号11700201

天津城建大学

单片机原理及接口技术课程设计

设计说明书

温度控制单片机PWM输出设计起止日期:2014 年1 月6 日至2014 年1 月17 日

学生姓名王博

班级11级电信2班

成绩

指导教师(签字)

计算机与信息工程学院

2014年1月17日

天津城建大学

课程设计任务书

2013—2014学年第1学期

计算机与信息工程学院电子信息工程专业班级11级电信2班学号11700201

课程设计名称:单片机原理及接口技术

设计题目:温度控制单片机PWM输出设计

完成期限:自2014 年1 月 6 日至2014 年1 月17 日共 2 周

设计依据、要求及主要内容:

一.设计的目的

1.进一步熟悉和掌握单片机系统设计和编程原理。

2.掌握单片机的接口技术及相关外围芯片的外特性、控制方法。

3.通过设计,掌握以单片机核心的电路设计的基本方法和技术。

4.通过实际程序设计和调试,掌握模块化程序设计方法和调试技术。

5.通过完成一个包括电路设计和程序开发的完整过程,了解开发单片机应用系统的全过程,为今后从事相应开发打下基础。

二.设计的基本要求

1.认真认识设计的意义,掌握设计工作程序,学会使用工具书和技术参考资料,并培养科学的设计思想和良好的设计作风。

2.提高模型建立和设计能力,学会应用相关设计资料进行设计计算的方法。

3.提高独立分析、解决问题的能力,逐步增强实际应用训练。

4.设计的说明书要求简洁、通顺,电路图内容完整、清楚、规范。

三.设计主要内容

a) 设计实现功能

STC12C5A60S2(引脚排序及基本功能同AT89S51)作为主控芯片,设计利用LCD1602显示时间、温度、PWM参数和占空比信息。一是扩展DS12C887外围电路,实现时间信息显示;二是DS18B20温度信息显示的设计;三是利用温度控制PWM输出,使占空比与温度成正比变化。

b) 原理图设计

1.原理图设计要符合项目的工作原理,连线要正确。

2.图中所使用的元器件要合理选用,电阻、电容等器件的参数要正确标明。

3.原理图要完整,CPU、外围器件、外扩接口、输入/输出装置要一应俱全。

c) 程序调计

1.根据要求,将总体功能分解成若干个子功能模块,每个功能模块完成一个特定的功能。

2.根据总体要求及分解的功能模块,确定各功能模块之间的关系,设计出完整的程序流程图。

d) 程序调试

1.编写相关程序,并进行仿真。

2.将程序下载到单片机,进行运行调试。

e) 设计说明书

1.原理图设计说明

简要说明设计目的,原理图中所使用的元器件功能及在图中的作用,各器件的工作过程及顺序。

2.程序设计说明

对程序设计总体功能及结构进行说明,对各子模块的功能以及各子模块之间的关系作较详细的描述。

3.画出工作原理图,程序流程图并给出相应的程序清单。

指导教师(签字):

教研室主任(签字):

批准日期:2014 年 1 月 2 日

目录

第1章设计要求 (1)

1.1课程设计具体要求 (1)

1.1.1 原理图设计 (1)

1.1.2程序调计 (1)

1.1.3程序调试 (1)

1.1.4设计说明书 (1)

1.2设计任务 (1)

第2章设计原理 (2)

2.1设计思路 (2)

2.2设计的相关技术 (2)

2.3主控芯片介绍 (2)

2.4LCD1602液晶显示器介绍 (3)

2.5PWM的基本原理 (5)

2.6温度传感器 (6)

2.6.1温度传感器工作原理 (6)

2.6.2DS18B20相关介绍 (7)

2.6.3DS18B20中使用中的注意事项 (8)

第3章系统的软件设计 (9)

3.1主文件 MAIN (9)

3.2波形输出PWM (10)

3.3LCD液晶显示屏输出控制 (11)

3.4DS18B20温度传感器输出 (14)

第4章电路原理图设计 (17)

第五章心得体会 (19)

参考文献 (20)

第1章设计要求

1.1课程设计具体要求

1.1.1 原理图设计

a.原理图设计要符合项目的工作原理,连线要正确。

b.图中所使用的元器件要合理选用,电阻、电容等器件的参数要正确标明。

c.原理图要完整,CPU、外围器件、外扩接口、输入/输出装置要一应俱全。

1.1.2程序调计

a.根据要求,将总体功能分解成若干个子功能模块,每个功能模块完成一个特定的功能。

b.根据总体要求及分解的功能模块,确定各功能模块之间的关系,设计出完整的程序流程图。

1.1.3程序调试

a.编写相关程序,并进行仿真。

b.将程序下载到单片机,进行运行调试。

1.1.4设计说明书

a.原理图设计说明

简要说明设计目的,原理图中所使用的元器件功能及在图中的作用,各器件的工作过程及顺序。

b.程序设计说明

对程序设计总体功能及结构进行说明,对各子模块的功能以及各子模块之间的关系作较详细的描述。

c.画出工作原理图,程序流程图并给出相应的程序清单。

1.2设计任务

STC12C5A60S2(引脚排序及基本功能同AT89S51)作为主控芯片,设计PWM输出控制电路。一是设计温度模块输出,作为PWM的参数输入;二是用PWM输出控制发光二级管,观察PWM输出不同占空比下发光二级管的亮度变化;三是根据需要扩展LCD1602等,显示相应的输入参数。

第2章设计原理

2.1设计思路

2.2设计的相关技术

脉冲宽度调制(PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。

本次设计的原理就是利用STC12C5A60S2芯片模拟出PWM输出波形,来控制LED灯的两岸程度。在一定的频率的方波中,调整高电平和低电平的占空比,即可实现。

同时,本方案使用了一块LCD1602的液晶显示屏来显示输入的参数,清晰的看出设计出的结果。使用红外遥控器控制占空比的输入,达到所需的效果。

2.3主控芯片介绍

STC12C5A60S2是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。STC12C5A60S2是

一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,STC12C5A60S2是一种高效微控制器.

主要特性:与MCS-51 兼容;4K字节可编程闪烁存储器;寿命:1000写/擦循环;数据保留时间:10年;全静态工作:0Hz-24MHz;三级程序存储器锁定;128×8位内部RAM;32可编程I/O线;两个16位定时器/计数器;5个中断源;可编程串行通道;低功耗的闲置和掉电模式;片内振荡器和时钟电路。

图3 主控芯片 STC12C5A60S2

2.4 LCD1602液晶显示器介绍

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。1602LCD 是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。1602LCD微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。

图4 LCD1602示意图

表1 LCD1602管脚功能

2.5 PWM的基本原理

脉冲宽度调制,简称脉宽调制,是将模拟信号转换为脉波的一种技术,一般转换后脉波的周期固定,但脉波的占空比会依模拟信号的大小而改变。

在模拟电路中,模拟信号的值可以连续进行变化,在时间和值的幅度上都几乎没有限制,基本上可以取任何实数值,输入与输出也呈线性变化。所以在模拟电路中,电压和电流可直接用来进行控制对象,例如家用电器设备中的音量开关控制、采用卤素灯泡灯具的亮度控制等等。

但模拟电路有诸多的问题:例如控制信号容易随时间漂移,难以调节;功耗大;易受噪声和环境干扰等等。

与模拟电路不同,数字电路是在预先确定的范围内取值,在任何时刻,其输出只可能为ON和OFF两种状态,所以电压或电流会通/断方式的重复脉冲序列加载到模拟负载。PWM技术是一种对模拟信号电平的数字编码方法,通过使用高分辨率计数器(调制频率)调制方波的占空比,从而实现对一个模拟信号的电平进行编码。其最大的优点是从处理器到被控对象之间的所有信号都是数字形式的,无需再进行数模转换过程;而且对噪声的抗干扰能力也大大增强(噪声只有在强到足以将逻辑值改变时,也可能对数字信号产生实质的影响),这也是PWM在通讯等信号传输行业得到大量应用的主要原因。

模拟信号能否使用PWM进行编码调制,仅依赖带宽,这即意味着只要有足够的带宽,任何模拟信号值均可以采用PWM技术进行调制编码,一般而言,负载需要的调制频率要高于10Hz,在实际应用中,频率约在1kHz到200kHz之间。

在信号接收端,需将信号解调还原为模拟信号,目前在很多微型处理器内部都包含有PWM控制器模块。

图5 PWM原理模式图

2.6温度传感器

2.6.1温度传感器工作原理

DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。DS18B20测温原理:低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。DS18B20功能特点:

1. 采用单总线技术,与单片机通信只需要一根I/O线,在一根线上可以挂接多个DS18B20。

2. 每只DS18B20具有一个独有的,不可修改的64位序列号,根据序列号访问地应的器件。

3. 低压供电,电源范围从3~5V,可以本地供电,也可以直接从数据线上窃取电源(寄生电源方式)。

4. 测温范围为-55℃~+125℃,在-10℃~85℃范围内误差为±0.5℃。

5. 可编辑数据为9~12位,转换12位温度时间为750ms(最大)。

6. 用户可自设定报警上下限温度。

7. 报警搜索命令可识别和寻址哪个器件的温度超出预定值。

8. DS18B20的分辩率由用户通过EEPROM设置为9~12位。

9. DS18B20可将检测到温度值直接转化为数字量,并通过串行通信的方式与主控制器进行数据通信。

DS18B20有4个主要的数据部件:

1. 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

2. DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。

3. DS18B20温度传感器的存储器DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

4. 配置寄存器。

DS18B20内部结构及功能:

DS18B20的内部结构如图2-4所示。主要包括:寄生电源,温度传感器,64位ROM和单总线接口,存放中间数据的高速暂存器RAM,用于存储用户设定温度上下限值的TH和TL触发器,存储与控制逻辑,8位循环冗余校验码(CRC)发生器等7部分

2.6.2 DS18B20相关介绍

温度的读取:

DS18B20在出厂时以配置为12位,读取温度时共读取16位,所以把后11位的2进制转化为10进制后在乘以0.0625便为所测的温度,还需要判断正负。前5个数字为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。

DS18B20的初始化:

1. 先将数据线置高电平“1”。

2. 延时(该时间要求的不是很严格,但是尽可能的短一点)。

3. 数据线拉到低电平“0”。

4. 延时750微秒(该时间的时间范围可以从480到960微秒)。

5.数据线拉到高电平“1”。

6. 延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制

7. 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。

8.将数据线再次拉高到高电平“1”后结束。

DS18B20的写操作:

1. 数据线先置低电平“0”。

2. 延时确定的时间为15微秒。

3. 按从低位到高位的顺序发送字节(一次只发送一位)。

4. 延时时间为45微秒。

5. 将数据线拉到高电平。

6. 重复上(1)到(6)的操作直到所有的字节全部发送完为止。

7. 最后将数据线拉高。

DS18B20的读操作:

1. 将数据线拉高“1”。

2. 延时2微秒。

3. 将数据线拉低“0”。

4. 延时15微秒。

5. 将数据线拉高“1”。

6. 延时15微秒。

7. 读数据线的状态得到1个状态位,并进行数据处理。

8. 延时30微秒。

2.6.3 DS18B20使用中的注意事项

DS18B20 虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:

1. DS18B20 从测温结束到将温度值转换成数字量需要一定的转换时间,这是必须保证的,不然会出现转换错误的现象,使温度输出总是显示85。

2. 在实际使用中发现,应使电源电压保持在5V 左右,若电源电压过低,会使所测得的温度精度降低。

3. 较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。

4. 在DS18B20的有关资料中均未提及单总线上所挂DS18B20 数量问题,容易使人误认为可以挂任意多个DS18B20,在实际应用中并非如此,当单总线上所挂DS18B20 超过8 个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。

5. 在DS18B20测温程序设计中,向DS18B20 发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20 接触不好或断线,当程序读该DS18B20 时,将没有返回信号,程序进入死循环,这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视

第3章系统的软件设计

采用Keil开发系统,使用C语言进行开发。主要的功能有:控制LED灯的亮灭以及明亮程度、LCD液晶显示屏显示参数、从温度传感器模块中得到输入参数等。

软件由:

3.1主文件 main()

图6主函数逻辑图3.2 波形输出 PWM

write_string_lcd(2,0, "PWM:");

PWM_init(); //PWM初始化

x=(wen_val-20.0)/0.0390625;

PWM0_set (x);

zkb=(x/256.0)*100;

crt_zkb(2,4);

表3 PWM函数表

3.3 LCD液晶显示屏输出控制

void lcd_init(void)

{

write_cmd(0x38);//

write_cmd(0x38);//

write_cmd(0x06);//

write_cmd(0x0c);//

write_cmd(0x01);//

}

/*************************************************** ************显示长整型数据*************************** ****************************************************/ void crti(unsigned long dat)

{

BYTE dhi,dli,ddi,dei;

unsigned long datah;

unsigned long datal;

datah=dat;

dhi=0;

if (datah>=10)

{

do

{

datah/=10;

dhi++;

}while(datah>=10);

datah=dat;

ddi=dhi;

for (dli=0;dli

{

datal=1;

for (dei=0;dei

{

datal*=10;

}

datah=dat/datal;

dat=dat%datal;

datah+=0x30;

write_data(datah);

ddi--;

}

dat+=0x30;

write_data(dat);

}

else

{

dat=dat+0x30;

write_data(dat);

}

}

/*************************************************** ************浮点数显示****************************** ****************************************************/ void crt_r(float x,unsigned char N)

{

BYTE dli;

unsigned int dath;

unsigned int datl;

unsigned int dat;

if (x<0.0)

{

dat=0x2d;

write_data(dat);

Delay(1);

x=fabs(x);

}

dath=(int)x;

crti(dath);

if (N>0)

{

dat=0x2e;

write_data(dat);

Delay(1);

dat=1;

for (dli=0;dli

{

dat*=10;

}

dath=(int)(x*dat)-dath*dat;

for (dli=1;dli

{

dat /= 10;

datl=dath/dat;

datl += 0x30;

write_data(datl);

dath %= dat;

}

crti(dath);

}

}

图8 LCD液晶显示屏输出逻辑框图

3.4 DS18B20温度传感器输出

void DS18B20_Init()

{

DS1820_Reset();

DS1820_WriteData(0xCC); // 跳过ROM

DS1820_WriteData(0x4E); // 写暂存器

DS1820_WriteData(0x20); // 往暂存器的第三字节中写上限值

DS1820_WriteData(0x00); // 往暂存器的第四字节中写下限值

DS1820_WriteData(0x7F); // 将配置寄存器配置为12 位精度

DS1820_Reset();

}

/**********************************************************

*DS1820 复位及存在检测(通过存在脉冲可以判断DS1820 是否损坏)

*函数名称:DS1820_Reset()

*说明:函数返回一个位标量(0 或1)flag=0 存在,反之flag=1 不存在

**********************************************************/

bit DS1820_Reset()

{

bit flag;

DS1820_DQ = 0; //拉低总线

DelayXus(480); //延时480 微秒,产生复位脉冲

DS1820_DQ = 1; //释放总线

DelayXus(80); //延时80 微秒对总线采样

flag = DS1820_DQ; //对数据脚采样

DelayXus(400); //延时400 微秒等待总线恢复

return (flag); //根据flag 的值可知DS1820 是否存在或损坏,可加声音告警提示DS1820 故障}

/**********************************************************

*写数据到DS1820

*函数名称:DS1820_WriteData()

**********************************************************/

void DS1820_WriteData(BYTE wData)

{

BYTE i;

for (i=8;i>0;i--)

{

DS1820_DQ = 0; //拉低总线,产生写信号

DelayXus(4); //延时4us

DS1820_DQ = wData&0x01; //发送1 位

DelayXus(60); //延时60us,写时序至少要60us

DS1820_DQ = 1; //释放总线,等待总线恢复

wData>>=1; //准备下一位数据的传送

}

}

/********************************************************** *从DS1820 中读出数据

*函数名称:DS1820_ReadData()

**********************************************************/ BYTE DS1820_ReadData()

{

BYTE i,TmepData;

for (i=8;i>0;i--)

{

TmepData>>=1;

DS1820_DQ = 0; //拉低总线,产生读信号

DelayXus(4); //延时4us

DS1820_DQ = 1; //释放总线,准备读数据

DelayXus(8); //延时8 微秒读数据

if (DS1820_DQ == 1)

{TmepData |= 0x80;}

DelayXus(60); //延时60us

DS1820_DQ = 1; //拉高总线,准备下一位数据的读取.

}

return (TmepData);//返回读到的数据

}

/********************************************************* *延时n微秒程序

**********************************************************/ void DelayXus(WORD n)

{

while(--n);

}

/********************************************************* *读取温度程序

**********************************************************/ void read_wendu()

{

BYTE i;

DS1820_Reset(); //复位

DS1820_WriteData(0xcc); //跳过ROM 命令

DS1820_WriteData(0x44); //温度转换命令

DS1820_Reset(); //复位

DS1820_WriteData(0xcc); //跳过ROM 命令

DS1820_WriteData(0xbe); //读DS1820 温度暂存器命令

for (i=0;i<2;i++)

{

temperature[i]=DS1820_ReadData(); //采集温度

}

DS1820_Reset(); //复位,结束读数据

}

/********************************************************* *显示温度程序

**********************************************************/ void crt_wendu(BYTE line,column)

{

read_wendu();

ah=temperature[1]<<4;

ah&=0xf0;

al=temperature[0]>>4;

al&=0x0f;

ah=ah|al;

al=temperature[0]&0x0f;

if ((ah&0x80)!=0)

{

if (al==0)

{

ah=~ah;ah=ah+1;

}

else

{

ah=~ah;al=~al;al=al+1;al&=0x0f;

}

wen_val=ah*(-1.0)+al*(-0.0625);

}

else

{

wen_val=ah*1.0+al*0.0625;

}

set_display_place(line,column);

crt_r(wen_val,1);

write_data(0x20);

}

相关文档