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

这篇具有很好参考价值的文章主要介绍了嵌入式系统课程设计——温度记录仪。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

课程设计目录

一、嵌入式系统基础实验

 二、项目需求分析

三、实验方案设计

四、实验程序设计

 五、成本核算情况

八、完成情况与问题分析

九、学习心得


一、嵌入式系统基础实验

1.1实验平台的使用

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

图1 建立新工程图片

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

图2 选择lpc1114芯片图片

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

图3 选择头文件图片

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

图4 编译新工程图片

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

图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编程器、在线仿真器、开发板等,可大大降低用户的设计成本和开发难度。

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

图9 LPC1114引脚图

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

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

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

图10 LM75BD引脚图  

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

DS1307的主要特性如下:

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

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

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

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

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

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

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

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

图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可以广泛应用于消费电子、通信设备、工业自动化、医疗设备、安防设备等领域。

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

图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系统框图

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

图13 系统方框图

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

图14 Lpc1114方框图

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

图15 开发板硬件图

四、实验程序设计

4.1软件流程图:

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

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

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

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

 4.2代码

#include <LPC11xx.h>

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 <LPC11xx.h>

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 <LPC11xx.h>

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(){

 文章来源地址https://www.toymoban.com/news/detail-498757.html

  //配置引脚

       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<lenght;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 <LPC11xx.h>

/*

*函数功能: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 <LPC11xx.h>

#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<Length;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<Length ;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<Length;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<Length;i++){ //温度为3个整数 1个小数点 2个小数

                     data[i]=dest_addr[i];

       }

}

#include <LPC11xx.h>

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 <LPC11xx.h>

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';

}

 五、成本核算情况

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

图16 成本核算表1

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

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

图18 成本核算表3 

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

图19 成本核算表4 

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

图20 成本核算表5

7.3代码调试

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

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

图29调试图片 

7.4系统测试

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

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

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

图30 串口调试助手一 

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

图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等,以加快开发过程。

九、学习心得

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

 

 

 

 

到了这里,关于嵌入式系统课程设计——温度记录仪的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软考-嵌入式系统设计师:[嵌入式系统基础:笔记(一)]

    大家不要只收藏不关注呀,哪怕只是点个赞也可以呀!🤣 粉丝私信发邮箱,免费发你PDF!!! 因为准备备考中级嵌入式设计师证书,所以买了一些资料回来准备复习,本书为倪奕文老师编制的书,如果大家有时间和精力还是很建议大家去买一本的,这本书反而是能够让小白很快

    2023年04月08日
    浏览(103)
  • 【嵌入式】STM32进阶-OLED显示时间+温度和湿度

    0.前言 在本次实验中,我们将学习如何使用STM32微控制器和OLED显示屏,实现显示时间、温度和湿度的功能。这个应用场景在很多项目中都非常常见,例如室内温湿度监测、气象站等。 在现代生活中,对时间、温度和湿度的监测和显示具有重要的意义。无论是在家庭、办公室还

    2024年02月03日
    浏览(54)
  • 2022嵌入式芯片与系统设计竞赛

    2022嵌入式芯片与系统设计竞赛 这是我们第一次参加相关的学科竞赛,基本上算是摸着石头过河,尽管有老师和同学的帮助但是还是走了不少的弯路。我们属于中部赛区,选的是芯片应用赛道,使用的是赤菟CH32V307开发板。 我们的项目是:基于(CH32V307VCT6)的智能配送小车 该

    2023年04月09日
    浏览(38)
  • 【新版】系统架构设计师 - 嵌入式技术

    个人总结,仅供参考,欢迎加好友一起讨论 嵌入式系统概述(★) 嵌入式系统开发与设计(★) 嵌入式硬件(★★) 嵌入式操作系统(★★★★) 嵌入式数据库(★) 嵌入式系统是一种以应用为中心,以计算机技术为基础,可以适应不同应用对功能、可靠性、成本、体积

    2024年02月09日
    浏览(178)
  • ARM简单程序设计【嵌入式系统】

    2023-4-6 20:26:54 以下内容源自《【嵌入式系统】》 仅供学习交流使用 Keil 4 安装教程及简单使用【嵌入式系统】 新建工程xxx 芯片:ARM7 (Little Endian) 设置工程属性 Build结果必须是0Error的 如果是下图看配置是否正确 注意这个: 1.每一次修改代码就需要重写Build 2.READWRITE区变量初始

    2023年04月20日
    浏览(62)
  • 嵌入式系统项目设计——电子琴(完整代码)

    内容摘自上学期嵌入式系统课程设计最终的实验报告,我作为小组组长负责代码部分的编写,与上一个实验相比,使用了相同的硬件,所以硬件示意图完全相同,实现的功能不同但原理类似。因为CSDN不支持上传word资料,所以我就摘录下来写进文章里了,希望可以帮助到你。

    2024年02月08日
    浏览(42)
  • 嵌入式室内环境参数监控系统设计

    本次课设要求学生们掌握四个方面,第一是文献检索及实验研究方法,第二是室内环境监控系统一般组成; 第三是掌握技术方案比选方法;最后是掌握STM32 ADC使用,同时本次课设需要做到以下几个方面: 了解国内室内环境参数监控系统组成及技术架构; 设计室内环境参数监

    2024年01月18日
    浏览(43)
  • 嵌入式实时操作系统的设计与开发

    在RTOS中,时钟具有非常重要的作用,通过时钟可实现延时任务、周期性触发任务执行、任务有限等待的计时。 大多数嵌入式系统有两种时钟源,分别为实时时钟RTC(Real-Time Clock)和定时器/计数器。 实时时钟一般是靠电池供电,即使系统断电,也可以维持日期和时间。由于实

    2024年02月11日
    浏览(38)
  • 毕业设计 嵌入式 扫地机器人系统

    Hi,大家好,学长今天向大家介绍一个 单片机项目,大家可用于 课程设计 或 毕业设计 基于stm32的智能扫地机器人设计与实现 随着人口老龄化的到来和人民对提升生活品质的需要, 人们对在现实生活场景中取代人力的服务机器人有着迫切的需要。 同时, 机电、 自动控制、

    2024年02月11日
    浏览(48)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第六天-Linux信号(物联技术666)

     更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客 物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单

    2024年01月19日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包