温度检测模块.docx
- 文档编号:9131620
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:72
- 大小:206.38KB
温度检测模块.docx
《温度检测模块.docx》由会员分享,可在线阅读,更多相关《温度检测模块.docx(72页珍藏版)》请在冰豆网上搜索。
温度检测模块
石家庄经济学院信息工程学院
电子信息工程专业
单片机课程设计报告
题目温度检测模块设计
姓名0000000
学号00000000000000000
班级00000000000
指导教师000000000000
2013年7月4日
要求:
1.指导教师按照课程设计大纲要求完成学生课程设计指导工作。
2.课程设计任务书由指导教师照大纲要求填写,内容要全面。
3.课程设计报告由参加本学生填写。
课程设计结束时交指导教师。
4.指导教师要根据每一位学生课程设计任务完成情况,认真审核设计报告,并在课程设计结束时,给出客观、准确的评语和成绩。
5.课程设计任务书和报告要语言流畅,图表正确规范。
6.本表要用钢笔、圆柱笔填写或打印,字迹工整。
班级4101090102姓名0000000学号0000000000000000000
课程设计题目温度检测模块设计
课程设计起止日期2013年6月17日至2013年7月5日
实习地点实验室106
课程设计内容与要求
(包括:
设计任务及要求、设计原理、所需仪器设备、验收标准)
及格:
矩阵式键盘设置4个按键,初始时,4位数码管无显示。
当1号键按下时,第一位数码管显示1,并闪烁两次;当2号键按下时,第二位数码管显示2,并闪烁两次;3号键、4号键同样功能。
中:
在完成及格任务的基础上,能对来自热敏电阻传感器上的信号进行A/D转换,并在数码管上实时显示采集的电压值。
设置开始、结束两个按键控制采集过程。
良:
将显示的电压值转换成显示温度值,并能够通过按键设定校正值;
优:
将所有的按键功能通过红外遥控器实现。
(开始、结束和校正值设定)
指导教师:
董建彬
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要求
矩阵式键盘设置4个按键,初始时,4位数码管无显示。
当1号键按下时,第一位数码管显示1,并闪烁两次;当2号键按下时,第二位数码管显示并闪烁两次;3号键、4号键同样功能。
2.1.2设计思路
对键盘扫描确定键值,可实现按下键数码管显示相应的键值,并通过for循环控制闪烁的次数。
其中按键抖动问题可以通过延时程序解决。
2.1.3流程图
图四及格档流程图
2.1.4程序代码
#include
#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;break;
case0xbe:
lie=3;break;
case0x7e:
lie=4;break;
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);
}
for(i=0;i<100;i++)
{
P2=0xff;//关闭所有数码管并延时
delay(4);
}
}
}
//显示子函数
voiddisplay1(key)
{
if(key!
=0)
{
P2=wei[key-1];//发送位码
delay
(1);
P0=duan[key-1];//发送段码
delay
(2);
}
elseP2=0xff;//关数码管
}
//主函数
voidmain()
{
uintkey=0;
while
(1)
{
P1=0xfe;
if(P1!
=0xfe)//判断是否有键按下
{
delay(100);//延时去抖
if(P1!
=0xfe)//确实有键按下
{
key=scankey();//调扫描程序
display(key);//调显示程序
}
}
elsedisplay1(key);//无键按下时调显示1程序
}
}
2.2中档
2.2.1要求
矩阵式键盘设置4个按键,初始时,4位数码管无显示。
当1号键按下时,第一位数码管显示1,并闪烁两次;当2号键按下时,第二位数码管显示并闪烁两次;3号键、4号键同样功能。
并能对来自热敏电阻传感器上的信号进行A/D转换,并在数码管上实时显示采集的电压值。
设置开始、结束两个按键控制采集过程。
2.2.2设计思路
对键盘扫描确定键值,可实现按下键数码管显示相应的键值,并通过for循环控制闪烁的次数。
其中按键抖动问题可以通过延时程序解决。
PCF8591将模拟量转换为数字量,即可将输入模拟电压0—5V转换为8位的数字量,共
,所以每份为
=0.02V,将模拟量转化成数字量并听过计算分别送入四个数码管,即可实现数码管显示采集的电压值。
2.2.3流程图
图五中档流程图
2.2.4程序代码
/*-----------------------------------------------
内容:
温度测量模块
------------------------------------------------*/
#include
#include
#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);
DelayUs2x(245);
}
}
/*------------------------------------------------
键盘扫描子程序
------------------------------------------------*/
unsignedcharkeyscan()//键盘扫描函数,使用行列逐级扫描法
{
KeyPort=0x0f;
if(KeyPort!
=0x0f)
{DelayMs(10);
if(KeyPort!
=0x0f)
{
KeyPort=0x0f;
switch(KeyPort)
{
case0x0e:
hang=1;break;
case0x0d:
hang=2;break;
case0x0b:
hang=3;break;
case0x07:
hang=4;break;
default:
break;
}
DelayMs(5);
KeyPort=0xf0;
switch(KeyPort)
{
case0xe0:
lie=1;break;
case0xd0:
lie=2;break;
case0xb0:
lie=3;break;
case0x70:
lie=4;break;
default:
break;
}
while((KeyPort&0xf0)!
=0xf0);
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;
_Nop();//起始条件建立时间大于4.7us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;//发送起始信号
_Nop();//起始条件锁定时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;//钳住I2C总线,准备发送或接收数据
_Nop();
_Nop();
}
/*------------------------------------------------
结束总线
------------------------------------------------*/
voidStop_I2c()
{
SDA=0;//发送结束条件的数据信号
_Nop();//发送结束条件的时钟信号
SCL=1;//结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;//发送I2C总线结束信号
_Nop();
_Nop();
_Nop();
_Nop();
}
/*-------------------------------------------------
写入一个字节到指定地址
---------------------------------------------------*/
voidSendByte(unsignedcharc)
{
unsignedcharBitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位
{
if((c< elseSDA=0; _Nop(); SCL=1;//置时钟线为高,通知被控器开始接收数据位 _Nop(); _Nop();//保证时钟高电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1;//8位发送完后释放数据线,准备接收应答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; elseack=1;//判断是否接收到应答信号 SCL=0; _Nop(); _Nop(); } /*--------------------------------------------------- 从指定地址读取一个字节数据 ------------------------------------------------------*/ unsignedcharRcvByte() { unsignedcharretc; unsignedcharBitCnt; retc=0; SDA=1;//置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0;//置时钟线为低,准备接收数据位 _Nop(); _Nop();//时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL=1;//置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1;//读数据位,接收的数据位放入retc中 _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc); } /*------------------------------------------------ 发送非应答 ------------------------------------------------*/ voidNoAck_I2c(void) { SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop();//时钟低电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL=0;//清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); } /*------------------------------------------------ 主程序 ------------------------------------------------*/ 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) { for(j=0;j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 检测 模块