嵌入式系统课程设计——温度记录仪

课程设计目录

一、嵌入式系统基础实验

 二、项目需求分析

三、实验方案设计

四、实验程序设计

 五、成本核算情况

八、完成情况与问题分析

九、学习心得


一、嵌入式系统基础实验

1.1实验平台的使用

嵌入式系统课程设计——温度记录仪_第1张图片

图1 建立新工程图片

嵌入式系统课程设计——温度记录仪_第2张图片

图2 选择lpc1114芯片图片

嵌入式系统课程设计——温度记录仪_第3张图片

图3 选择头文件图片

嵌入式系统课程设计——温度记录仪_第4张图片

图4 编译新工程图片

嵌入式系统课程设计——温度记录仪_第5张图片

图5 烧录新工程到开发板图片

 二、项目需求分析

2.1题目:温度记录仪

2.2功能要求:

(1)每秒检测一次环境温度并存储

(2)存储数据与时间关联,可通过串行口导出

(3)当前时间可通过串口进行设置和读取

(4)USB供电

(5)USB转串口数据传输

(6)一个运行状态指示灯

(7)一个功能按键

2.3技术指标:

(1)检测温度:范围:-55~+125℃,精度:不低于1.5摄氏度

(2)数据存储空间:不低于2MB

三、实验方案设计

3.1芯片介绍

(1)LPC1114是NXP公司生产的Cortex-M0内核的32位微控制器,采用ARM处理器架构。该芯片集成了大量的模拟和数字外设,包括GPIO、I2C、SPI、UART、ADC、DAC、PWM、定时器等,还具有Flash和SRAM存储器。它的主频可达50MHz,工作电压范围为1.8V到3.6V,可广泛应用于家用电器、智能家居、电子玩具、工业自动化、医疗设备等领域。

LPC1114的封装形式包括DIP、TSSOP、LQFP等,方便用户进行不同的应用设计。此外,该芯片还提供了多种工具支持,例如Flash编程器、在线仿真器、开发板等,可大大降低用户的设计成本和开发难度。

嵌入式系统课程设计——温度记录仪_第6张图片

图9 LPC1114引脚图

(2)LM75BD是一种数字温度传感器,由德州仪器(Texas Instruments)生产。它采用I2C数字接口,并能够以0.5°C分辨率测量温度,其温度测量范围为-55°C到+125°C。LM75BD还具有低功耗和单电源操作的特点,以及在2.8V至5.5V电压范围内的高电压容忍度,使其非常适合用于低功耗应用和广泛的应用场景。

LM75BD具有内置的数字式温度传感器,以及数字化接口,这使得它非常适合在许多不同的应用中使用,如计算机服务器、智能家居、医疗设备等等。它还具有高精度、可编程温度阈值、过热检测和电源管理功能,可以通过I2C接口与其他设备通信。

嵌入式系统课程设计——温度记录仪_第7张图片

图10 LM75BD引脚图  

(3)DS1307是一款实时时钟芯片,由美国芯片制造商Maxim Integrated公司生产。它具有低功耗、高稳定性、精度高等特点,适用于需要精准时间控制的电子设备,如计算机、工业自动化控制系统、数字相机、嵌入式系统等。

DS1307的主要特性如下:

1.集成了实时时钟和日历,具有年、月、日、时、分、秒的计数和显示功能。

2.采用低功耗CMOS技术,工作电流小于1.5mA。

3.采用I2C总线接口,可以与其他I2C设备进行通信。

4.可以通过程序控制对时钟和日历进行设置和读取,具有多种时钟格式的选择。

5.内置32.768kHz的晶振,可提供高稳定性的时钟信号。

6.具有自动切换夏令时功能。

DS1307是一款非常实用的实时时钟芯片,广泛应用于各种需要时间控制的电子设备中。

嵌入式系统课程设计——温度记录仪_第8张图片

图11 DS1307引脚图  

(4)XT25F02是一种串行闪存(Serial Flash)存储器,由国内集成电路设计和制造公司厦门兴泰微电子股份有限公司生产。XT25F02具有2M比特(Mb)的存储容量,采用SPI(Serial Peripheral Interface)接口进行数据通信。

XT25F02的主要特点如下:

1.存储密度高:具有2M比特的存储容量,可以存储大量数据。

2.SPI接口:采用SPI接口进行数据通信,具有数据传输速度快、芯片引脚数目少、连接简单等特点。

3.低功耗:XT25F02的工作电压范围为2.7V至3.6V,具有低功耗的特点,在移动设备、便携式设备等应用场景中比较适用。

4.高可靠性:XT25F02采用高可靠性的存储器单元和数据保护机制,可以有效避免数据丢失和损坏等问题。

XT25F02可以广泛应用于消费电子、通信设备、工业自动化、医疗设备、安防设备等领域。

嵌入式系统课程设计——温度记录仪_第9张图片

图12 XT25F02引脚图  

3.2设计思路

采用LPC1114 DevKit作为开发板,以LPC1114FBD48/302作为处理器。首先,其复杂程度相对较低一些。因为涉及到的电路模块相对来说都比较简单和容易,电路板上的每个模块功能都比较熟悉。第二,性能方面能基本实现温度记录仪的基本要求功能,满足设计的需要——具有温度检测和串口显示功能。第三,可行性方面具有更高的可行性,因为在设计程序方面和电路板硬件方面都有过以往相关实验的经验。设定好时钟频率为48MHz,初始化LPC1114微控制器UART串行口,定时器、I2C总线接口、SSP串行端口为SPI帧格式;系统启动后,利用通用定时器实现定时1s中断,在定时器中断服务子程序中读取LM75BD(I2C总线)当前温度值和DS1307读取当前时间,通过UART接口发送到PC,并通过SPI接口将读到的温度值存储到FLASH存储器XT25F02中,在PC上利用串口调试助手向LPC1114的UART接口发送读取命令,从FLASH存储器中读出温度数据,并通过UART接口发送到PC。

3.2系统框图

嵌入式系统课程设计——温度记录仪_第10张图片

图13 系统方框图

嵌入式系统课程设计——温度记录仪_第11张图片

图14 Lpc1114方框图

嵌入式系统课程设计——温度记录仪_第12张图片

图15 开发板硬件图

四、实验程序设计

4.1软件流程图:

嵌入式系统课程设计——温度记录仪_第13张图片

 嵌入式系统课程设计——温度记录仪_第14张图片

 嵌入式系统课程设计——温度记录仪_第15张图片

 嵌入式系统课程设计——温度记录仪_第16张图片

 4.2代码

#include

void UARTInit();

void I2CInit();

void TMR16B0_Init();

void SSPI1_Init();

void Delay_1s(void);

void DS1307Init();

void Led_off();

void Led_on();

/*主函数*/

int main(){

Led_on();

      SystemInit();//  主时钟设置成48Mhz

  UARTInit();

       I2CInit();

       SSPI1_Init();

       Delay_1s();

  DS1307Init();

       TMR16B0_Init();

       while(1){

       }

}

#include

void UART_Send();

void Get_temputerature();

void UART_Send_Bit();

//void SSP1_Send(uint8_t *buf,uint8_t Length);

void SPI1_Write_FLASH(uint8_t *data, uint8_t Length);

void SPI1_Read_FLASH(uint8_t *data,uint8_t Length);

void XT25_EraseSector();

void Delay_1s();

long int ADDR;

void XT25_EraseAll();

uint8_t buf[100]; //存放温度

void Led_off();

void Led_on();

/*LED亮*/

void Led_on(){

       LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); // 使能时钟

       LPC_GPIO1->DIR |= (1<<9);

       LPC_GPIO1->DATA &= (0<<9); //拉低

}

/*LED灭*/

void Led_off() {

  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); // 使能时钟

       LPC_GPIO1->DIR |= (1<<9);

       LPC_GPIO1->DATA |= (1<<9); //拉高

}

void DS1307_Read(uint8_t *data);

/*

*函数功能:16B0 初始化

*计时1s

*/

void TMR16B0_Init(){//定时器初始化 定时1s

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<7);//使能16B0

       LPC_TMR16B0->MCR =3; //匹配MR0时复位TC且中断

       LPC_TMR16B0->PR=799;   //预分频值 3999

       LPC_TMR16B0->MR0=SystemCoreClock/800; //  设置周期为1秒

       LPC_TMR16B0->TCR=0X01;  //启动定时

       NVIC_EnableIRQ(TIMER_16_0_IRQn); //启动中断

}

/*

*16B0中断函数

*/

void TIMER16_0_IRQHandler(){

        int i;

        int n;

        uint8_t data[16]={0};

        uint8_t shijian[7]={17,20.00};

        uint8_t time[8]={0};

        DS1307_Read(shijian);

        time[0]=(shijian[0]&0x0F)+48;           //时间转换成ascii码进行保存

        time[1]=(shijian[0]>>4)+48;

        time[2]=(shijian[1]&0x0F)+48;

        time[3]=(shijian[1]>>4)+48;

        time[4]=(shijian[2]&0x0F)+48;

        time[5]=(shijian[2]>>4)+48;

        UART_Send_Bit(time[5]);

        UART_Send_Bit(time[4]);

        UART_Send("hou",3);

        UART_Send_Bit(':');

        UART_Send_Bit(time[3]);

        UART_Send_Bit(time[2]);

        UART_Send("min",3);

        UART_Send_Bit(':');

        UART_Send_Bit(time[1]);

        UART_Send_Bit(time[0]);

   UART_Send("sec",3);

//发送换行

        UART_Send_Bit(0x0d);

        UART_Send_Bit(0x0a);

        Get_temputerature();

//    Delay_1s();

        SPI1_Write_FLASH(buf,7);//  发送温度 以转换好的数组的形式发送 到xt52

        SPI1_Read_FLASH(data,7);

        UART_Send("Temputerature=",14);

        UART_Send(data,7);  //发送温度到pc

        UART_Send_Bit('C');

//发送换行

        UART_Send_Bit(0x0d);

        UART_Send_Bit(0x0a);

        ADDR=ADDR+8;

        LPC_TMR16B0->IR |=0X01; //清中断

}

#include

uint32_t Rcv_Buf[100]; //存放数据

int buf_i=0;//数据长度

void SPI1_Read_FLASH(uint8_t *data,uint8_t Length);

void SPI1_Write_FLASH(uint8_t *data, uint8_t Length);

uint8_t dest_addr[16];

uint8_t src_addr[16];

uint8_t XT25_ReadSR();

void XT25_WriteEnable();

void XT25_RUID();

void XT25_Erase();

void XT25_WriteSR(uint8_t sr);

void XT25_EraseSector();

void Delay_1s(void);

/*

*uart初始化

*clk 12MHZ

*115200 8 1 N

*FIFO 深度8

*/

void UARTInit(){

 

  //配置引脚

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<16);//使能IO

  LPC_SYSCON->SYSAHBCLKCTRL |=(1<<6) ;//使能GPIO

       LPC_IOCON->PIO1_6 |= 0x01; //设置成RXD 引脚

       LPC_IOCON->PIO1_7 |= 0x01; //设置成TXD 引脚

       LPC_UART->LCR=3; //数据8 停止1 无校验

       //设置波特率115384  近似115200

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<12);//使能UART

       LPC_SYSCON->UARTCLKDIV=4;  //设置分频值4  获得UART时钟为12Mhz

       LPC_UART->LCR=0X83; //DLAB=1

       LPC_UART->DLL=4;

       LPC_UART->DLM=0;

       LPC_UART->LCR=0x03; //DLAB=0

       LPC_UART->FDR=0X85; //MIV=8 DIV=5

      

      

       LPC_UART->FCR  =0X81; //使能FIFO 深度设置为8

       LPC_UART->IER |=1<<0; //使能接受中断

       NVIC_EnableIRQ(UART_IRQn); //启动中断

      

}

/*

*发送字符串

*/

void UART_Send(uint8_t str[],int lenght){

       int i;

       for(i=0;i

              LPC_UART->THR= str[i];

                     while((LPC_UART->LSR&0X40)==0);//等待数据发送完成

       }

}

/*

*发送 一个字节

*/

void UART_Send_Bit(uint8_t data){

       LPC_UART->THR= data;

                     while((LPC_UART->LSR&0X40)==0);//等待数据发送完成

}

#include

/*

*函数功能:I2C 初始化

*/

void I2CInit(){

       LPC_SYSCON->PRESETCTRL |= (1<<1); //复位取消

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<5);//使能I2C

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<16);//使能IO配置块

      

  //选择快速模式

       LPC_IOCON->PIO0_4 &=~(0X3F); //选择快速模式

       LPC_IOCON->PIO0_4 |=0X01;//选择SCL

       LPC_IOCON->PIO0_5 &=~(0X3F); //选择快速模式

       LPC_IOCON->PIO0_5 |=0X01;//选择SDA

      

       //设置SCL频率为400kHZ

       LPC_I2C->SCLH=40;

       LPC_I2C->SCLL=80;

      

       //使能I2C 同时将其他控制位清0

       LPC_I2C->CONCLR=0XFF;     //清所有标志

       LPC_I2C->CONSET |=(1<<6);    //使能I2C接口

}

/*

*函数功能:发送开始信号

*/

void I2c_Start(){

       LPC_I2C->CONSET =(1<<5);// 发送开始信号

       while(!(LPC_I2C->CONSET&(1<<3))){//等待开始信号发送完成 SI置位

       }

       LPC_I2C->CONCLR =(1<<5|1<<3); //清零START 和SI

}

/*

*函数功能:发送停止信号

*/

void I2C_Stop(){

       LPC_I2C->CONCLR =(1<<3);

       LPC_I2C->CONSET =(1<<4);// 发送停止信号

       while((LPC_I2C->CONSET&(1<<4))){//等待停止信号发送完成 SI置位

       }

}

/*

*函数功能:发送一个字节

*/

void I2C_Send_Byte(uint8_t data){

       LPC_I2C->DAT=data;

       LPC_I2C->CONCLR =(1<<3); //开始发送数据 清SI

              while(!(LPC_I2C->CONSET&(1<<3))){//等待数据发送完成 SI置位

       }

}

/*

*函数功能:接受一个字节

*/

uint8_t I2C_Recieve_Byte(){

       LPC_I2C->CONCLR =(1<<3);//开始接受数据  清SI

       while(!(LPC_I2C->CONSET&(1<<3))){//等待接受数据完成 SI置位

       }

       return (uint8_t)LPC_I2C->DAT;

}

#include

#define WREN    0X06            //写入使能

#define WRDI      0X04

#define RDSR      0X05

#define WRSR     0X01

#define READ      0X03

#define WRITE    0X02

extern uint8_t src_addr[16]; //写

extern uint8_t dest_addr[16];//读

void UART_Send(uint8_t str[],int lenght);

void UART_Send_Bit(uint8_t data);

void XT25_WriteEnable();

uint8_t XT25_ReadSR();

uint8_t SPI1_comunication(uint8_t TxData);

extern long int ADDR;

void Delay_1s(void){

       int i=SystemCoreClock/500;//0.01s

              while(--i);

}

/*

*函数功能:SSP1IO初始化

*/

void SSP1_IOConfig(){

       LPC_SYSCON->SYSAHBCLKCTRL |=((1<<6)|(1<<16)); //IO 和GPIO

       LPC_IOCON->PIO2_2 &=~(0X07); //

       LPC_IOCON->PIO2_2 |=0X02;// 把PIO2_3选择为MISO

      

       LPC_IOCON->PIO2_3 &=~(0X07); //

       LPC_IOCON->PIO2_3 |=0X02;//把PIO2_2选择为MOSI

       LPC_IOCON->PIO2_1 &=~(0X07); //

       LPC_IOCON->PIO2_1 |=0X02;//把PIO2_1选择为LPC_SSP   CLK

      

       LPC_GPIO2->DIR |= (1<<0);

       LPC_GPIO2->DATA |= (1<<0); //拉高

}

void SSP1_LOW(){

       LPC_GPIO2->DATA &= ~(1<<0); //拉低

}

void SSP1_HIGH(){

       LPC_GPIO2->DATA |= (1<<0); //拉高

}

/**

*函数功能:SSP1初始化

*/

void SSPI1_Init(){

       uint8_t Dummy=Dummy; //解决编译产生的Warning:never used

       uint8_t i;

      

       LPC_SYSCON->PRESETCTRL |=1<<2; //禁止LPC_ssp1复位

       LPC_SYSCON->SYSAHBCLKCTRL |=(1<<18); //ssp1 时钟使能

       LPC_SYSCON->SSP1CLKDIV=0X02 ;  //分频值 2 48/2=24

      

       SSP1_IOConfig(); //初始化SSP1 IO口

      

       LPC_SSP1->CR0=0X0707;   //CPSR=7 DATAbit= 8 CPOL=0 CPHA=0 SCR=7  选择spi

      

       LPC_SSP1->CPSR=0X02;   //SCLK=48/(2*2*8)= 1.5M

      

       LPC_SSP1->CR1 &=~(1<<0);//LBM=0 :正常模式

       LPC_SSP1->CR1 &=~(1<<2);//MS=0 主机模式

       LPC_SSP1->CR1 |=1<<1; //SSE=1 开启ssp1

      

       //清空RXFIFO

       for(i=0 ; i<8 ;i++){

              Dummy=LPC_SSP1->DR;

       }

       for(i=0;i<16;i++){

              dest_addr[i]=0;

              src_addr[i]=0;

       }

       ADDR=0xff0000;

}

/**

* 函数功能:SSP1通信

* 接受和发送一个字符

*/

uint8_t SPI1_comunication(uint8_t TxData){

       while(((LPC_SSP1->SR)&(1<<4))==(1<<4));//忙时等待

       LPC_SSP1->DR=TxData; //发送数据到TxFIFO

       while(((LPC_SSP1->SR)&(1<<2))!=(1<<2));//等待数据接受完

       return (LPC_SSP1->DR); //接受返回的数据

}

/**

*函数功能:SSP1发送

*/

void SSP1_Send(uint8_t *data,uint8_t Length){

       uint8_t i;

       for(i=0;i

              SPI1_comunication(data[i]);

       }

}

/**

* 函数功能:SSP1接受

*/

void SSP1_Receive(uint8_t *data,int Length){

       uint8_t Dummy=Dummy; //随机数 用于产生时钟

       uint8_t i;

       for(i=0 ; i

              data[i]=SPI1_comunication(0xff);

       }

}

/**

* 函数功能:写入使能

*/

void XT25_WriteEnable(){

       SSP1_LOW();

       SPI1_comunication(WREN);

       SSP1_HIGH();

}

/**

* 函数功能:读状态寄存器

*/

uint8_t XT25_ReadSR(){

       uint8_t sr;

       SSP1_LOW();

       SPI1_comunication(RDSR);//发送读取命令

       sr=SPI1_comunication(0xff);//得到寄存器数据

       SSP1_HIGH();

       return  sr;

}

/*

*函数功能:忙碌等待 写入等待

*/

void XT25_Write_Wait(){

       int stat_code=0;

       while(1){

              stat_code=XT25_ReadSR();

              if(((stat_code&1<<1)==0x02)&&(stat_code&1)==0){

                     break;

              }

       }

}

/*

*函数功能:忙碌等待 读出等待

*/

void XT25_Read_Wait(){

       int stat_code=0;

       while(1){

              stat_code=XT25_ReadSR();

              if((stat_code&1)==0){

                     break;

              }

       }

}

/*

*函数功能:写FLASH

*/

void SPI1_Write_FLASH(uint8_t *data, uint8_t Length){

       uint8_t i;

       uint8_t sr;

       XT25_WriteEnable();//写入使能

       Delay_1s();//延时1秒

       src_addr[0]=WRITE;//页面编程开始

       //地址1~3

       src_addr[1]=(uint8_t)((ADDR)>>16);

       src_addr[2]=(uint8_t)((ADDR)>>8);

       src_addr[3]=(uint8_t) ADDR;

       //写入的数据

       for(i=0;i

              src_addr[i+4]=data[i];

       }

       XT25_Write_Wait(); //忙时等待

       SSP1_LOW();//使能

       SSP1_Send((uint8_t *)src_addr,4+Length);

       SSP1_HIGH();//拉高

}

/**

* 函数功能:读flash

*/

void SPI1_Read_FLASH(uint8_t *data,uint8_t Length){

       int i;

       int stat_code=0;

       src_addr[0]=READ;

       //读取的地址

       src_addr[1]=(uint8_t)((ADDR)>>16);

       src_addr[2]=(uint8_t)((ADDR)>>8);

       src_addr[3]=(uint8_t) ADDR;

       XT25_Read_Wait();

       SSP1_LOW();

  SSP1_Send((uint8_t *)src_addr,4);

       SSP1_Receive((uint8_t *)dest_addr,Length);//接受温度

       SSP1_HIGH();

       for(i=0;i

                     data[i]=dest_addr[i];

       }

}

#include

void I2c_Start();

void I2C_Stop();

void I2C_Send_Byte();

uint8_t I2C_Recieve_Byte();

void Ds1307_WriteByte(uint8_t WriteAddr,uint8_t WriteData);

void DS1307_Write(uint8_t *data);

/*

* 函数功能:DS1307初始化

* 默认初始化为全0

*/

void DS1307Init(){

       Ds1307_WriteByte(0x00,0x01);  //秒

       Ds1307_WriteByte(0x01,0x01);  //分

       Ds1307_WriteByte(0x02,0x01);  //时

       Ds1307_WriteByte(0x03,0x01);  //星期

       Ds1307_WriteByte(0x04,0x01);  //日

  Ds1307_WriteByte(0x05,0x01);  //月

       Ds1307_WriteByte(0x06,0x01);  //年

       uint8_t time[7]={0x00,0x00,0x00,0x05,0x10,0x02,0x23};

       DS1307_Write(time);

}

/**

* 函数功能:DS1307读

*                                        全读

*/

void DS1307_Read(uint8_t *data){

      

       Ds1307_WriteByte(0x3f,0x01);//定位ds1307内部指针到0x3f(RAM尾部)处

       I2c_Start();//start

       I2C_Send_Byte(0xd1);//读

       LPC_I2C->CONSET =(1<<2);//AA=1

      

       data[0]=I2C_Recieve_Byte();

  data[1]=I2C_Recieve_Byte();

       data[2]=I2C_Recieve_Byte();

       data[3]=I2C_Recieve_Byte();

       data[4]=I2C_Recieve_Byte();

       data[5]=I2C_Recieve_Byte();

      

      

       LPC_I2C->CONCLR =(1<<2);//AA=0

       data[6]=I2C_Recieve_Byte();

       I2C_Stop();//STOP

      

}

/**

* 函数功能:DS1307写

*                                        全写

*/

void DS1307_Write(uint8_t *data){

      

      

       I2c_Start();//start

       I2C_Send_Byte(0xd0);//读

       LPC_I2C->CONSET =(1<<2);//AA=1

       I2C_Send_Byte(0x00);//从0x00开始写入

       I2C_Send_Byte(data[0]);

  I2C_Send_Byte(data[1]);

  I2C_Send_Byte(data[2]);

  I2C_Send_Byte(data[3]);

  I2C_Send_Byte(data[4]);

  I2C_Send_Byte(data[5]);    

      

       LPC_I2C->CONCLR =(1<<2);//AA=0

       I2C_Send_Byte(data[6]);

       I2C_Stop();//STOP

      

}

/*

*函数功能:DS1307写一个字节

*/

void Ds1307_WriteByte(uint8_t WriteAddr,uint8_t WriteData)

{

                     //I2C_Start();    

         I2c_Start();//start

             

    I2C_Send_Byte(0xd0);    // Device Addr + Write (operation)

    I2C_Send_Byte(WriteAddr);

      

              LPC_I2C->CONCLR =(1<<2);//AA=0    接受完下一个字节后返回非应答信号

    I2C_Send_Byte(WriteData);

  

    I2C_Stop();  

   

}

/*

* 函数功能:DS1307读一个字节

*/

uint8_t Ds1307_ReadByte()

{

  uint8_t RevData;

 

  I2c_Start();//start              

  I2C_Send_Byte(0xD1);     // Device Addr + Write (operation)  

 

       LPC_I2C->CONCLR =(1<<2);//AA=0

  RevData = I2C_Recieve_Byte();   

 

  I2C_Stop();  

 

  return RevData;

}

#include

void I2c_Start();

void I2C_Stop();

void I2C_Send_Byte();

void UART_Send(uint8_t str[],int lenght);

uint8_t I2C_Recieve_Byte();

extern uint8_t buf[100]; //存放温度

uint16_t Temputerature_Test(){

       uint16_t Temputerature_8,Temputerature_16;

      

       float Temputerature;

       I2c_Start();//start

       I2C_Send_Byte(0x91);//读

       LPC_I2C->CONSET =(1<<2);//AA=1

       Temputerature_8=I2C_Recieve_Byte();//高八位

       LPC_I2C->CONCLR =(1<<2);//AA=0

       Temputerature_16=(Temputerature_8<<8)+I2C_Recieve_Byte();//合成温度

       I2C_Stop();//STOP

       //温度转换

       Temputerature_16=Temputerature_16>>5;

       if(Temputerature_16&0x0400){

              Temputerature=-(~(Temputerature_16&0x03ff)+1)*0.125;

       }else{

              Temputerature=0.125*(float)(Temputerature_16);

       }

       return (uint16_t)(Temputerature*1000);

}

void Get_temputerature(){

       uint16_t temp;

      

       temp=Temputerature_Test();//获得温度

      

       //将int 转为char 同时'0'对应00000000 对数值无影响

       buf[0]=temp/100000+'0';//

       if((temp/100000)==0)

                     buf[0]=' ';//不显示0

       buf[1]=temp/10000%10+'0';

       buf[2]=temp/1000%10+'0';

       buf[3]='.';

       buf[4]=temp/100%10+'0';

       buf[5]=temp/10%10+'0';

       buf[6]=temp%10+'0';

}

 五、成本核算情况

嵌入式系统课程设计——温度记录仪_第17张图片

图16 成本核算表1

嵌入式系统课程设计——温度记录仪_第18张图片  图17 成本核算表2

嵌入式系统课程设计——温度记录仪_第19张图片

图18 成本核算表3 

嵌入式系统课程设计——温度记录仪_第20张图片

图19 成本核算表4 

嵌入式系统课程设计——温度记录仪_第21张图片

图20 成本核算表5

7.3代码调试

嵌入式系统课程设计——温度记录仪_第22张图片 图28编译通过图片

嵌入式系统课程设计——温度记录仪_第23张图片

图29调试图片 

7.4系统测试

测试过程:调试好代码之后,运行并下载到温度记录仪上,在PC端打开串口调试助手软件,设置好波特率数值为115200并打开串口。然后观察串口调试助手上接收到的室内的温度数据和时间,并进行必要的记录。

测试结果:程序代码成功下载到了温度记录仪上,温度记录仪绿色指示灯亮,表示温度记录仪正常运行,并且PC端的串口调试助手成功接收到了通过串口发送的室内空调下的温度数值—范围为24.750-25.200摄氏度,设计测试成功完成。

嵌入式系统课程设计——温度记录仪_第24张图片

图30 串口调试助手一 

嵌入式系统课程设计——温度记录仪_第25张图片

图31 串口调试助手二

7.5对结果的讨论与分析

通过把代码下载到课设电路板上,通过读取温度传感器采集到的室内温度,初始化LPC1114微控制器UART串行口,定时器、I2C总线接口、SSP串行端口为SPI帧格式;系统启动后,利用通用定时器实现定时1s中断,在定时器中断服务子程序中读取LM75BD(I2C总线)当前温度值和DS1307读取当前时间,当前时间通过UART接口发送到PC,并通过SPI接口将读到的温度值存储到FLASH存储器XT25F02中,在PC上利用串口调试助手向LPC1114的UART接口发送读取命令,从FLASH存储器中读出温度数据,并通过UART接口发送到PC。然后通过对比实际室内的温度数值——25摄氏度,有细微的误差,数值很接近实际室内温度,证明程序成功实现了温度和时间记录。

八、完成情况与问题分析

通过LPC1114课程设计电路板上的系统启动后,利用通用定时器实现定时1s中断,在定时器中断服务子程序中读取LM75BD(I2C总线)当前温度值和DS1307读取当前时间,当前时间通过UART接口发送到PC,并通过SPI接口将读到的温度值存储到FLASH存储器XT25F02中,在PC上利用串口调试助手向LPC1114的UART接口发送读取命令,从FLASH存储器中读出温度数据,并通过UART接口发送到PC。通过电脑上的串口助手即可得知该时刻LM75BD温度传感器所测得的数据,并不断更新。完成功能要求:(1)每秒检测一次环境温度并存储(2)存储数据与时间关联,可通过串行口导出(3)当前时间可通过串口进行设置和读取(4)USB供电(5)USB转串口数据传输(6)一个运行状态指示灯(7)一个功能按键

FLASH存储器XT25F02使用问题分析:

1.接口兼容性:LPC1114与XT25F02之间的通信接口必须兼容,以便LPC1114可以正确地读写XT25F02中的数据。可以通过查阅LPC1114和XT25F02的数据手册以及代码示例来解决接口兼容性的问题。

2.编程技巧:在LPC1114中使用XT25F02需要使用一些特定的编程技巧,如SPI接口配置、寄存器配置等。需要掌握这些技巧才能正确地将XT25F02集成到LPC1114应用中。

3.数据存储:使用XT25F02存储数据需要进行数据编码、存储器分配、读取校验等步骤。需要根据具体应用需求来实现这些功能,并且需要进行充分的测试和验证,以确保数据的正确性和可靠性。

解决以上问题的方法包括:

1.仔细研究LPC1114和XT25F02的数据手册和代码示例,确保接口兼容性和正确的接线方式。

2.学习和掌握相关的编程技巧,如SPI接口配置、寄存器配置等。

3.在实际应用中进行充分的测试和验证,确保数据的正确性和可靠性。

4.可以使用现成的开发工具和库,如Keil等,以加快开发过程。

九、学习心得

经过几天的努力学习和研究,我终于成功完成了课程报告。这些用于课程设计的时间完全没有白费,是一次非常宝贵的实践经验。通过这次课程设计,我得到了锻炼自己的机会,并且增强了自己的实际应用能力和解决问题的能力。在这次学习过程中,我也学到了很多东西。此外,在程序设计方面,我深刻地意识到了掌握基础知识的重要性。我更加清晰地了解了代码的实现,以及如何在实际开发过程中设计程序,以及如何实现程序的功能等等问题。

 

 

 

 

你可能感兴趣的:(嵌入式系统开发,单片机,嵌入式硬件)