温度检测模块Word格式文档下载.docx

上传人:b****7 文档编号:22267726 上传时间:2023-02-03 格式:DOCX 页数:72 大小:206.38KB
下载 相关 举报
温度检测模块Word格式文档下载.docx_第1页
第1页 / 共72页
温度检测模块Word格式文档下载.docx_第2页
第2页 / 共72页
温度检测模块Word格式文档下载.docx_第3页
第3页 / 共72页
温度检测模块Word格式文档下载.docx_第4页
第4页 / 共72页
温度检测模块Word格式文档下载.docx_第5页
第5页 / 共72页
点击查看更多>>
下载资源
资源描述

温度检测模块Word格式文档下载.docx

《温度检测模块Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《温度检测模块Word格式文档下载.docx(72页珍藏版)》请在冰豆网上搜索。

温度检测模块Word格式文档下载.docx

2013年6月17日

课程设计任务书

一、设计原理与技术方法:

电路工作原理分析与原理图、元器件选择、电路调试方法与结果说明;

软件设计说明书与流程图、软件源程序代码、软件调试方法与运行结果说明。

1.电路工作原理分析:

89C52芯片P0口,即P0.0--P0.7连接到键盘的D0--D7,P0口既是8数据口,又是16位地址口的低8位。

同时P0口连接八段数码管作为段选信号。

89C52芯片P2.7与PCF8951的SDA相连做为位锁存,P2.6与PCF8951的SCL相连作为段选。

89C52芯片P3.2与红外相连作为外部中断。

1.189C52芯片说明:

(1)主电源引脚(2根)

VCC(Pin40):

电源输入,接+5V电源

GND(Pin20):

接地线

(2)外接晶振引脚(2根)

XTAL1(Pin19):

片内振荡电路的输入端

XTAL2(Pin20):

片内振荡电路的输出端

(3)控制引脚(4根)

RST/VPP(Pin9):

复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。

ALE/PROG(Pin30):

地址锁存允许信号

PSEN(Pin29):

外部存储器读选通信号

EA/VPP(Pin31):

程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。

(4)可编程输入/输出引脚(32根)

STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。

PO口(Pin39~Pin32):

8位双向I/O口线,名称为P0.0~P0.7

P1口(Pin1~Pin8):

8位准双向I/O口线,名称为P1.0~P1.7

P2口(Pin21~Pin28):

8位准双向I/O口线,名称为P2.0~P2.7

P3口(Pin10~Pin17):

8位准双向I/O口线,名称为P3.0~P3.7

STC89C52主要功能如表一所示。

表1STC89C52主要功能

主要功能特性

兼容MCS51指令系统

8K可反复擦写FlashROM

32个双向I/O口

256x8bit内部RAM

3个16位可编程定时/计数器中断

时钟频率0-24MHz

2个串行中断

可编程UART串行通道

2个外部中断源

共6个中断源

2个读写中断口线

3级加密位

低功耗空闲和掉电模式

软件设置睡眠和唤醒功能

1.2PCF8951芯片说明:

PCF8591是一个单片集成、单独供电、低功耗、8-bitCMOS数据获取器件。

PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。

PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。

在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。

1.2.1特性

(1)单独供电

(2)PCF8591的操作电压范围2.5V-6V

(3)低待机电流

(4)通过I2C总线串行输入/输出

(5)PCF8591通过3个硬件地址引脚寻址

(6)PCF8591的采样率由I2C总线速率决定

(7)4个模拟输入可编程为单端型或差分输入

(8)自动增量频道选择

(9)PCF8591的模拟电压范围从VSS到VDD

(10)PCF8591内置跟踪保持电路

(11)8-bit逐次逼近A/D转换器

(12)通过1路模拟输出实现DAC增益

红外模块说明:

通用红外遥控系统由发射和接收两大部分组成。

应用编/解码专用集成电路芯片来进行控制操作,如图1所示。

发射部分包括键盘矩阵、编码调制、LED红外发送器;

接收部分包括光、电转换放大器、解调、解码电路。

图二红外遥控系统图

接收电路可以使用一种集红外线接收和放大于一体的一体化红外线接收器,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。

接收器对外只有3个引脚:

Out、GND、Vcc与单片机接口非常方便,如图2

图三接收器引脚图

(1)脉冲信号输出接,直接接单片机的IO口。

(2)GND接系统的地线(0V);

(3)Vcc接系统的电源正极(+5V);

2.程序设计思路及程序说明

2.1及格档

2.1.1要求

当2号键按下时,第二位数码管显示并闪烁两次;

2.1.2设计思路

对键盘扫描确定键值,可实现按下键数码管显示相应的键值,并通过for循环控制闪烁的次数。

其中按键抖动问题可以通过延时程序解决。

2.1.3流程图

图四及格档流程图

2.1.4程序代码

#include<

reg52.h>

//包含头文件

#defineucharunsignedchar

#defineuintunsignedint

//子函数声明

uintscankey();

voiddelay(uintx);

voiddisplay(key);

voiddisplay1(key);

//全局变量声明

ucharcodewei[]={0xfe,0xfd,0xfb,0xf7};

ucharcodeduan[]={0xf9,0xa4,0xb0,0x99};

uinthang;

uintlie;

//延时子函数

voiddelay(uintx)

{

uintt;

while(x--)

for(t=0;

t<

120;

t++);

}

//键盘扫描子函数

uintscankey()

P1=0xfe;

//只扫面一行

switch(P1)

{

case0xee:

lie=1;

break;

case0xde:

lie=2;

case0xbe:

lie=3;

case0x7e:

lie=4;

default:

break;

}

while((P1&

0xf0)!

=0xf0);

//无键按下时

return(lie);

//显示子函数

voiddisplay(key)

uinti,j;

for(j=0;

j<

2;

j++)//for循环控制闪烁次数

for(i=0;

i<

100;

i++)//通过循环延时

P0=duan[key-1];

//发送段码

P2=wei[key-1];

//发送位码

delay(4);

i++)

P2=0xff;

//关闭所有数码管并延时

voiddisplay1(key)

if(key!

=0)

delay

(1);

//发送段码

delay

(2);

elseP2=0xff;

//关数码管

//主函数

voidmain()

{

uintkey=0;

while

(1)

if(P1!

=0xfe)//判断是否有键按下

delay(100);

//延时去抖

=0xfe)//确实有键按下

key=scankey();

//调扫描程序

display(key);

//调显示程序

elsedisplay1(key);

//无键按下时调显示1程序

}

2.2中档

2.2.1要求

矩阵式键盘设置4个按键,初始时,4位数码管无显示。

并能对来自热敏电阻传感器上的信号进行A/D转换,并在数码管上实时显示采集的电压值。

2.2.2设计思路

PCF8591将模拟量转换为数字量,即可将输入模拟电压0—5V转换为8位的数字量,共

,所以每份为

=0.02V,将模拟量转化成数字量并听过计算分别送入四个数码管,即可实现数码管显示采集的电压值。

2.2.3流程图

图五中档流程图

2.2.4程序代码

/*-----------------------------------------------

内容:

温度测量模块

------------------------------------------------*/

intrins.h>

#defineAddWr0x90//写数据地址

#defineAddRd0x91//读数据地址

#defineKeyPortP1

#define_Nop()_nop_()//定义空指令

sbitSDA=P2^7;

sbitSCL=P2^6;

/*------------------------------------------------

全局变量声明

unsignedcharcodedofly_DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

//显示段码值0~9

unsignedcharcodedofly_WeiMa[4]={0xfe,0xfd,0xfb,0xf7};

//分别对应相应的数码管点亮,即位码

unsignedcharTempData[4]={0xff,0xff,0xff,0xff};

//存储显示值的全局变量

unsignedcharj,hang,lie;

bitack;

bitReadADFlag;

子函数声明

------------------------------------------------*/

voidDelayUs2x(unsignedchart);

voidDisplay(unsignedcharFirstBit,unsignedcharNum);

voidInit_Timer0(void);

voidTimer0_isr(void);

voidStart_I2c();

voidStop_I2c();

voidNoAck_I2c(void);

voidSendByte(unsignedcharc);

unsignedcharRcvByte();

unsignedcharReadADC(unsignedcharChl);

延时子程序

voidDelayUs2x(unsignedchart)

while(--t);

voidDelayMs(unsignedchart)

while(t--)

//大致延时1mS

DelayUs2x(245);

键盘扫描子程序

unsignedcharkeyscan()//键盘扫描函数,使用行列逐级扫描法

KeyPort=0x0f;

if(KeyPort!

=0x0f)

{DelayMs(10);

switch(KeyPort)

case0x0e:

hang=1;

case0x0d:

hang=2;

case0x0b:

hang=3;

case0x07:

hang=4;

DelayMs(5);

KeyPort=0xf0;

case0xe0:

case0xd0:

case0xb0:

case0x70:

while((KeyPort&

return((hang-1)*4+lie-1);

}}

return(17);

voidDisplay(unsignedcharFirstBit,unsignedcharNum)

staticunsignedchari=0;

P0=0xff;

//清空数据,防止有交替重影

P2=dofly_WeiMa[i+FirstBit];

//取位码

P0=TempData[i];

//取显示数据,段码

i++;

if(i==Num)

i=0;

定时器初始化子程序

voidInit_Timer0(void)

TMOD|=0x01;

//使用模式1,16位定时器,使用"

|"

符号可以在使用多个定时器时不受影响

//TH0=0x00;

//给定初值

//TL0=0x00;

EA=1;

//总中断打开

ET0=1;

//定时器中断打开

TR0=1;

//定时器开关打开

定时器中断子程序

voidTimer0_isr(void)interrupt1

staticunsignedintnum;

TH0=(65536-2000)/256;

//重新赋值2ms

TL0=(65536-2000)%256;

Display(0,4);

//调用数码管扫描

num++;

if(num==50)//大致100ms

num=0;

ReadADFlag=1;

//读标志位置1

启动总线

voidStart_I2c()

SDA=1;

//发送起始条件的数据信号

_Nop();

SCL=1;

//起始条件建立时间大于4.7us,延时

SDA=0;

//发送起始信号

//起始条件锁定时间大于4μ

SCL=0;

//钳住I2C总线,准备发送或接收数据

结束总线

voidStop_I2c()

//发送结束条件的数据信号

//发送结束条件的时钟信号

//结束条件建立时间大于4μ

//发送I2C总线结束信号

/*-------------------------------------------------

写入一个字节到指定地址

---------------------------------------------------*/

voidSendByte(unsignedcharc)

unsignedcharBitCnt;

for(BitCnt=0;

BitCnt<

8;

BitCnt++)//要传送的数据长度为8位

if((c<

<

BitCnt)&

0x80)SDA=1;

//判断发送位

elseSDA=0;

//置时钟线为高,通知被控器开始接收数据位

//保证时钟高电平周期大于4μ

//8位发送完后释放数据线,准备接收应答位

if(SDA==1)ack=0;

elseack=1;

//判断是否接收到应答信号

/*---------------------------------------------------

从指定地址读取一个字节数据

------------------------------------------------------*/

unsignedcharRcvByte()

unsignedcharretc;

retc=0;

//置数据线为输入方式

BitCnt++)

//置时钟线为低,准备接收数据位

//时钟低电平周期大于4.7us

//置时钟线为高使数据线上数据有效

retc=retc<

1;

if(SDA==1)retc=retc+1;

//读数据位,接收的数据位放入retc中

return(retc);

发送非应答

voidNoAck_I2c(void)

//时钟低电平周期大于4μ

//清时钟线,钳住I2C总线以便继续接收

主程序

main()

unsignedcharnum=0,num1=0,num2=17,k,i;

intnum3=0,num4=0;

Init_Timer0();

DelayMs(20);

while

(1)//主循环

num2=keyscan();

saomiao:

if(num2==0)

j

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1