MSP430单片机温度单片机课程设计

更新时间:2024-01-20 05:30:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

山东理工大学计算机学院

课 程 设 计

单片机系统设计

班 级 计科1104 姓 名 学 号 指导教师 李业德 韩慧

二○ 一四 年 十一 月 日

课程设计任务书及成绩评定

1

课题名称_______温度测试系统设计_______

I、 题目的目的和要求:

利用温度传感器和MSP430单片机设计一个温度测试系统,将测试结果(十进制)在LED上显示出来,并定义一个保持按键,当按下该键时,将当前测试值保持不变(按键不动作时为正常测量显示)。温度显示格式为:XXX ℃。

II、 设计进度及完成情况

日 期 内 容 11.10 选取题目,进行资料搜集和系统分析工作 进行单独程序设计以及完成单独接口电路 11.14 将全部程序综合并进行整体程序调试和连接整体接口电路 11.16 书写课程设计报告并写下相关问题总结 11.18 11.20 进行课程设计答辩,并打印上交

III、 主要参考文献及资料

MSP430系列16位低功耗单片机原理及应用 DS18B20温度传感器的使用 智能仪器原理及应用

2

成绩评定:

设计成绩:

指导老师:

学科部主任 李业德

(教师填写)

(签字)

二○ 年 月 日3

Ⅵ、

目录

I、 题目的目的和要求: ........................................................................................................................... 2 II、 设计进度及完成情况 ........................................................................................................................... 2 III、 主要参考文献及资料 ........................................................................................................................... 2 Ⅵ、 成绩评定: ........................................................................................................................................... 3 目录 ................................................................................................................................................................... 4 本次课程设计的目的和意义 ........................................................................................................................... 5 设计题目 ........................................................................................................................................................... 6 系统的主要功能、作用以及主要技术性能指标 ........................................................................................... 7 总体设计方案、工作和组成原理 ................................................................................................................... 8 系统设计 ......................................................................................................................................................... 11 设计总结 ......................................................................................................................................................... 22 作品的使用或操作说明 ................................................................................................................................. 23 设计图纸或图表 ............................................................................................................................................. 24

4

本次课程设计的目的和意义

课程设计是让我熟练掌握了课本上的一些理论知识,课程设计也是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。 加深我们对单片机原理与应用课程的理解

5

系统设计

接口电路设计,程序设计(程序框图和程序清单及注释)其他有关的理论分析和计算 接口电路设计:

主控制器MSP430

温度传感器

11

保持按键

数码管电路

12

程序框图:

总体设计流程图

读取温度传感器数据流程图

13

数码管温度显示

程序设计:

//*************************定义引脚**********************************

#define LED8PORT P2OUT //P2接8个LED灯 #define LED8SEL P2SEL //P2接8个LED灯 #define LED8DIR P2DIR //P2接8个LED灯

#define DATAPORT P4OUT //数据口所在端口P4

#define DATASEL P4SEL //数据口功能寄存器,控制功能模式 #define DATADIR P4DIR //数据口方向寄存器

#define CTRPORT P6OUT //控制线所在的端口P6

#define CTRSEL P6SEL //控制口功能寄存器,控制功能模式 #define CTRDIR P6DIR //控制口方向寄存器

#define DCTR0 P6OUT &= ~BIT4 //数码管段控制位信号置低 #define DCTR1 P6OUT |= BIT4 //数码管段控制位信号置高 #define WCTR0 P6OUT &= ~BIT3 //数码管位控制位信号置低 #define WCTR1 P6OUT |= BIT3 //数码管位控制位信号置高

#define KEYPORT P1OUT //按键所在的端口P1

#define KEYSEL P1SEL //控制口功能寄存器,控制功能模式 #define KEYDIR P1DIR //控制口方向寄存器

#define KEYIN P1IN //键盘扫描判断需要读取IO口状态值 uchar key=0xFF; //键值变量 uint temp_value; float truetemp;

14

uint temp,A1,A2,A3; //定义的变量,显示数据处理

//*******************共阴数码管显示的断码表************************

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

// *******************系统时钟初始化***************************

void Clock_Init() {

uchar i;

BCSCTL1&=~XT2OFF; //打开XT2振荡器

BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{

IFG1&=~OFIFG; //清楚振荡器错误标志 for(i=0;i<100;i++) _NOP(); }

while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 IFG1&=~OFIFG; }

//*******************MSP430内部看门狗初始化***********************

void WDT_Init() {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 }

//*******************MSP430IO口初始化*****************************

void Port_Init() {

LED8SEL = 0x00; //设置IO口为普通I/O模式,此句可省 LED8DIR = 0xFF; //设置IO口方向为输出 LED8PORT = 0xFF; //P2口初始设置为FF

DATASEL = 0x00; //设置IO口为普通I/O模式,此句可省 DATADIR = 0xFF; //设置IO口方向为输出 DATAPORT = 0xFF; //P4口初始设置为FF

CTRSEL = 0x00; //设置IO口为普通I/O模式,此句可省

CTRDIR |= BIT3 + BIT4 +BIT2; //设置IO口方向为输出,控制口在P63,P64 CTRPORT = 0xFF; //P6口初始设置为FF

KEYSEL = 0x00; //设置IO口为普通I/O模式,此句可省

KEYDIR = 0x0F; //高四位输入模式,低四位输出模式,外部上拉电阻 KEYPORT= 0xF0; //初始值0xF0 }

//*************74HC573控制数码管动态扫描键值显示函数******************

void Display_Key(uchar num) {

uchar i,j;

j=0x01; //此数据用来控制位选 for(i=0;i<8;i++) //8个数码管依次显示 {

DCTR1; //控制数码管段数据的74HC573的LE管脚置高 WCTR1; //控制数码管位的74HC573的LE管脚置高

15

DATAPORT=~j; //设置要显示的位,也就是哪一个数码管亮

WCTR0; //锁存位数据,下面送上段数据以后,就显示出来了 DATAPORT=table[num]; //送要显示的数据,这里是键值

DCTR0; //锁存段数据,数码管亮一个时间片刻 j=j<<1; //移位,准备进行下一位的显示

delay_us(500); //显示一个时间片刻,会影响亮度和闪烁性 }

Close_LED(); //显示完8个数码管后关闭数码管显示,否则可能导致各个数码管亮度不一致 }

//*****************键盘扫描子程序,采用逐键扫描的方式******************

uchar Key_Scan(void) {

uchar key_check; uchar key_checkin;

key_checkin=KEYIN; //读取IO口状态,判断是否有键按下 key_checkin&= 0xF0; //屏蔽掉低四位的不确定值

if(key_checkin!=0xF0) //IO口值发生变化则表示有键按下 {

delay_ms(20); //键盘消抖,延时20MS key_checkin=KEYIN; //再次读取IO口状态

if(key_checkin!=0xF0) //确定是否真正的有键按下 {

key_check=KEYIN; //有键按下,读取端口值 switch (key_check & 0xF0) //判断是哪个键按下 {

case 0xE0:key=1;break; case 0xD0:key=2;break; case 0xB0:key=3;break; case 0x70:key=4;break; } } } else {

key=0xFF; //无键按下,返回FF }

return key; }

//******74HC573控制数码管动态扫描显示函数,显示采集到的温度**************

void Display_DS18B20(uint data_b,uint data_s,uint data_g) {

uchar i,j;

j=0x01; //此数据用来控制位选 for(i=0;i<3;i++) //用后3位数码管来显示 {

DCTR1; WCTR1; DATAPORT=~j; WCTR0;

16

j=(j<<1);

DATAPORT=0x00; //前5位都不显示,送数据00即可 DCTR0; delay_ms(2); }

DCTR1; //开始显示第6位,即十位 WCTR1; DATAPORT=~j; WCTR0; j=(j<<1);

//DATAPORT=table[A1]; DATAPORT=table[data_b]; DCTR0; delay_ms(1);

DCTR1; // WCTR1; DATAPORT=~j; WCTR0; j=(j<<1);

//DATAPORT=table[A2]|0x80; // DATAPORT=table[data_s]|0x80; // DCTR0; delay_ms(1);

DCTR1; // WCTR1; DATAPORT=~j; WCTR0; j=(j<<1);

//DATAPORT=table[A3]; DATAPORT=table[data_g];

DCTR0; delay_ms(1);

DCTR1; // WCTR1; DATAPORT=~j; WCTR0; j=(j<<1);

//DATAPORT=table[A3]; DATAPORT=0x63;

DCTR0; delay_ms(1);

DCTR1; // WCTR1; DATAPORT=~j; WCTR0; j=(j<<1);

//DATAPORT=table[A3]; DATAPORT=0x39;

开始显示个位 显示小数点 显示小数点 开始显示小数点后面的数据 开始显示温度单位 开始显示温度单位 17

DCTR0; delay_ms(1);

DCTR1; WCTR1; DATAPORT=0xff; WCTR0; }

//************************DS18B20初始化*******************************

unsigned char DS18B20_Reset(void) //初始化和复位 {

unsigned char i; DQ_OUT; DQ_CLR;

delay_us(500); //延时500uS(480-960) DQ_SET; DQ_IN;

delay_us(80); //延时80uS i = DQ_R;

delay_us(500); //延时500uS(保持>480uS)

if (i) {

return 0x00; } else {

return 0x01; } }

//**********************DS18B20读一个字节函数****************************

unsigned char ds1820_read_byte(void) {

unsigned char i;

unsigned char value = 0; for (i = 8; i != 0; i--) {

value >>= 1; DQ_OUT; DQ_CLR;

delay_us(4); //*延时4uS DQ_SET; DQ_IN;

delay_us(10); //*延时10uS if (DQ_R) {

value|=0x80; }

delay_us(60); //*延时60uS }

return(value);

18

}

//**********************向18B20写一个字节函数************************

/*DS18B20字节写入函数*/

void ds1820_write_byte(unsigned char value) {

unsigned char i;

for (i = 8; i != 0; i--) {

DQ_OUT; DQ_CLR;

delay_us(4); //延时4uS if (value & 0x01) {

DQ_SET; }

delay_us(80); //延时80uS DQ_SET; //位结束 value >>= 1; } }

//********************发送温度转换命令*********************************

/*启动ds1820转换*/

void ds1820_start(void) {

DS18B20_Reset();

ds1820_write_byte(0xCC); //勿略地址 ds1820_write_byte(0x44); //启动转换 }

//***********************DS8B20读取温度信息************************

unsigned int ds1820_read_temp(void) {

unsigned int i;

unsigned char buf[9];

DS18B20_Reset();

ds1820_write_byte(0xCC); //勿略地址 ds1820_write_byte(0xBE); //读取温度 for (i = 0; i < 9; i++) {

buf[i] = ds1820_read_byte(); }

i = buf[1]; i <<= 8; i |= buf[0]; temp_value=i;

temp_value=(uint)(temp_value*0.625); //不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据

//比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275

//然后在显示的时候确定小数点的位置即可,就能显示出27.5度了

19

return i; }

//*********************温度数据处理函数****************************

void data_do(uint temp_d) {

A3=temp_d; //分出百,十,和个位 temp_d/=10; A2=temp_d; A1=temp_d/10; }

//***********************处理温度数据*********************

void handletemp() {

ds1820_start(); //启动一次转换 ds1820_read_temp(); //读取温度数值

data_do(temp_value); //处理数据,得到要显示的值 truetemp=0.1*temp_value;

//judgeAlarm(); //判断是否触发警报//已将其添加至按键程序 }

//***********************显示温度**********************

void showtemp() {

uchar j;

for(j=0;j<100;j++) {

Display_DS18B20(A1,A2,A3); //显示温度值 }

//delay_ms(100); //延时100ms }

//***************************主程序************************

void main(void) {

uchar flag1,flag2,flag3,flag4;

//uint key_store=0x00; //没有按键按下时,默认显示1 WDT_Init(); //看门狗初始化 Clock_Init(); //时钟初始化

Port_Init(); //端口初始化,用于控制IO口输入或输出 //Close_LED();

DS18B20_Reset(); //复位D18B20

delay_ms(100); //延时100ms while(1) {

Key_Scan(); //键盘扫描,看是否有按键按下

if(key!=0xff) //如果有按键按下,则显示该按键键值1~4 { {

switch(key) {

case 1: LED8PORT=0xfc;flag1=1;flag2=0;flag3=0;flag4=0;break;//对温度数据

20

处理判断警报,然后显示,handletemp();showtemp();

case 2: LED8PORT=0xf3;flag1=0;flag2=1;flag3=0;flag4=0;break;//温度数据处理判断警报,关闭显示,节省电源,handletemp();Close_LED();

case 3: LED8PORT=0xcf;flag1=0;flag2=0;flag3=1;flag4=0;break;//关闭警报,SOUNDOFF;handletemp();

case 4: LED8PORT=0x3f;flag1=0;flag2=0;flag3=0;flag4=1;break;//测试警报SOUNDON;

} } } else {

LED8PORT&=0xff; // if(flag1==1) {

//handletemp(); showtemp(); }

if(flag2==1) {

handletemp(); showtemp(); }

if(flag3==1) {

SOUNDOFF; handletemp(); }

if(flag4==1) {

SOUNDON; } } } }

21

设计总结

对整个设计工作过程进行归纳和综合,对设计中所存在的问题和不足进行分析和总结,提出解决的方法、措施、建议和对这次设计实践的认识、收获和提高。

在本次设计的过程中,我发现很多的问题,也学到了许多东西。虽然我以前也做过类似的课程设计,但这次设计真的让我长进了很多。本次单片机课程设计的重点就在于测温及按键编程软件算法的设计,其中有许多很巧妙的算法。我以前总是能看懂别人写的程序,但自己单独写时就会出现很多问

题,经过这次锻炼我基本掌握了C语言编程的方法并在以前的基础上有所提高。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就

是我在这次课程设计中的最大收获。

22

作品的使用或操作说明

作品上电后,按下复位按键,数码管开始显示当前环境温度,并实时刷新数据,按下保持按键后,温度会保持在当前温度不变,当再次按下显示按键后,温度又会开始实时显

示。

23

设计图纸或图表

数码管显示

24

按键

温度传感器

25

主控芯片

26

本文来源:https://www.bwwdw.com/article/mcbo.html

Top