PIC单片机项目(2)——基于PIC16F877A的温度测量与存储装置

这篇具有很好参考价值的文章主要介绍了PIC单片机项目(2)——基于PIC16F877A的温度测量与存储装置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        首先,简要描述一下所实现的功能。系统采用DS18B20传感器测量实时温度,将测量的温度显示在LCD1602显示器上。此外,还用了IIC协议的EEPROM模块24LC256存储温度的历史值,存储深度为10000.也就是从系统开始运行,就实时将测量值存入EEPROM里面,直到存满10000个值,新值再从0开始覆盖旧值。存储起来的历史数据可以通过按键触发,发送到串口进行显示。

        整个设计的电路图如下所示:

        pic16f877a project,PIC单片机,单片机,嵌入式硬件

         

        接下来就是思路及代码讲解。

        首先看如何配置按键吧。

        从电路图中可以看出,按键被我接在了RB2口,所以关注PIC单片机的管脚B相关寄存器即可。

pic16f877a project,PIC单片机,单片机,嵌入式硬件

 

                上面是官方文档中,关于PORTB的描述。首先PORTB是8位宽的双向端口,可以配置为输入模式或者输出模式。寄存器TRISB就是控制管脚的输出方向的。当配置为1时,控制对应的管脚为输入模式,为0时,控制对应的管脚为输出模式。PORTB的所有管脚都有内部上拉的控制,通过OPTION_REG寄存器的第7位控制。将该位清0,代表使能内部上拉。当PORTB配置为输出模式时,自动清除内部上拉。(需要注意的是,要配置管脚为输入模式,就必须使能内部上拉,否则读不出IO口的电平状态!)

        由于我用的是RB2,所以我关于PORTB的配置如下:

        

pic16f877a project,PIC单片机,单片机,嵌入式硬件

pic16f877a project,PIC单片机,单片机,嵌入式硬件

         接下来就是配置串口。

        USART,是通用同步异步接收器的简称,它是一种串行通信接口,可以与外围的串口通信设备进行数据交换。USART可以配置为一下几种工作方式;

        异步(全双工)

        同步主机(半双工)

        同步从机(半双工)

        和它相关的寄存器有:

        TXSTA:发送状态和控制寄存器。

     pic16f877a project,PIC单片机,单片机,嵌入式硬件

 

        pic16f877a project,PIC单片机,单片机,嵌入式硬件

        bit7: 时钟源选择位。如果是异步模式就不关心这一位,如果是同步模式,该位为1代表主机模式,为0代表从机模式,时钟源来自于外部。

        bit6: 选择发送数据的长度。为0的话,代表发送的数据是8位。

        bit5:是否使能发送模式。

        bit4: 选择工作模式,是同步模式还是异步模式。

        bit3: 未实现。

        bit2: 高波特率选择位。如果是同步模式下,该位不关心。

        bit1: 发送移位寄存器空/满标志

        bit0: 发送数据的第九位,可以是奇偶校验位.

       RCSTA: 接收状态和控制寄存器。

pic16f877a project,PIC单片机,单片机,嵌入式硬件

 pic16f877a project,PIC单片机,单片机,嵌入式硬件

         bit7: 串行口使能位

        bit6: 接收数据长度选择位。1代表接收数据长度为8位。

        bit5:单接收使能位。在同步从机模式下不必关注该位。

        bit4: 连续接收使能位

        bit3: 地址检测使能位

        bit2: 帧错误检测位

        bit1: 溢出错误位

        bit0: 接收数据的第九位.

        SPBRG 波特率控制寄存器。

        其中,波特率的计算如下:

        pic16f877a project,PIC单片机,单片机,嵌入式硬件

        X的值就是寄存器  SPBRG里面的值,范围是0-255.对于异步高速模式,可以查表得到常用的波特率下寄存器 SPBRG的值为多少。

        

        pic16f877a project,PIC单片机,单片机,嵌入式硬件

 

        本次对串口的配置如下:

        pic16f877a project,PIC单片机,单片机,嵌入式硬件

 

        接下来就是DS18B20测温模块了。关于该模块的资料,网上有很多,这里就不介绍了。主要讲下它的工作流程:

        初始化DS18B20
        执行ROM指令
        执行DS18B20功能指令

        第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。

        然后关于它的读写时序,这里也不做过多介绍,直接给出PIC单片机驱动DS18B20的代码如下:

        pic16f877a project,PIC单片机,单片机,嵌入式硬件

        pic16f877a project,PIC单片机,单片机,嵌入式硬件

pic16f877a project,PIC单片机,单片机,嵌入式硬件

 pic16f877a project,PIC单片机,单片机,嵌入式硬件

         再往下就是EEPROM模块啦。

        这个模块使用的是IIC协议,可以参考该模块数据手册。不详细展开,会用即可。

        我们在使用的的时候,配置一下PIC单片机的硬件IIC即可。

        关于LCD显示器的部分,可以看我写的PIC第一篇文章。

       仿真效果图如下:

        pic16f877a project,PIC单片机,单片机,嵌入式硬件

 pic16f877a project,PIC单片机,单片机,嵌入式硬件

 

按下按键后

pic16f877a project,PIC单片机,单片机,嵌入式硬件

 

 主程序代码如下:

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#include <xc.h>
#include "ee302lcd.h"	// Include LCD header file
#include <stdio.h>	// Include Standard I/O header file
#include "I2C_EE302.h"

#define uchar unsigned char
#define uint unsigned int

#define KEY1 RB2		//label RB2 as key1

#define temp_h (PORTC|=0x20)        //DS18B20--->RC5
#define temp_l (PORTC&=0xdf) 
#define temp_o (TRISC&=0xdf)
#define temp_i (TRISC|=0x20)

unsigned char dat1,dat2;//保存读出的温度z
unsigned long int dat;

 unsigned char outString[5];	//character array for LCD string
 unsigned char outString2[5];	//存放光照阈值  用于显示
 

void delayms(int x) //4M晶振下,延时1ms
{
	int y,z;
	for(y=x;y>0;y--)
		for(z=110;z>0;z--);
}
void Ds18b20_reset(void)//DS18B20初始化
{
	uint count;
    uchar temp;
	uchar i,flag=1;
	temp_o;
	temp_l;
	for(count=60;count>0;count--);//延时480us
	temp_i;
	while(flag)
	{
		
		if(RC5)
			flag=1;
		else
			flag=0;	
	}
	for(count=60;count>0;count--);//延时480us
}
void Ds18b20_write(uchar datt)//向DS18B20写一个字节
{
	uchar count;
	uchar i;
	temp_o;
	for(i=8;i>0;i--)
	{
		temp_o;
		temp_l;
		for(count=1;count>0;count--);
		
		if(datt&0x01==0x01)
			temp_i;
		else
		{	
			temp_o;
			temp_l;
		}
		for(count=23;count>0;count--);//延时60us
		temp_i;
		for(count=1;count>0;count--);
		datt>>=1;	
	}	
}

uchar Ds18b20_read(void) //从DS18B20读一个字节
{
	uchar i,datt;
	uchar count;
	for(i=8;i>0;i--)
	{
		datt>>=1;
		temp_o;
		temp_l;
		for(count=1;count>0;count--);
		temp_i;//改为输入方向时,上拉电阻把数据线拉高,释放总线,此语句必须有,参考datasheet的P15
		for(count=1;count>0;count--);
		if(RC5)
			datt|=0x80;
		for(count=23;count>0;count--);//延时60us	
	}
	return datt;
}



//串口发送
void transmit_string (char *p)
	{
		while (*p != '\0')			//While string does not equal Null character
									//do the following.
		{
			while (!TXIF);			//Wait until TXREG empty.
			TXREG = *p;				//Load TXREG with character from string pointed to
			p++;					// by p, then increment p.
		}
	}



void main(void) 
{
    int addr=0;
    int i=0;
    int dat_read=0;
    i2c_init();			//do i2c intialisation, TRISC modified here
    Lcd8_Init();				// Required initialisation of LCD to 8-bit mode
   
    TRISB=0x0C;					// Set PORTB bit 2  3 as input for switch
    PORTB=0X0C;                 //enable internal pull up
    OPTION_REG=0X00;            //turn on pull up in port B
    
    //iic
    TRISC 	|= 0x18;		// RC6 and RC7 must be configured as inputs to enable the UART
						// RC4 and RC3 high from I2C_init 
    
    TRISA=0x04;					// Set PORTA bit 3 as input for AN2
    ADCON0 = 0b01010001;		// ADCS1:ADCS0 set to 0:1 for Tosc x8 (Fosc/8)
								// Channel 2
								// ADC On
    ADCON1 = 0b00000010;		// Left justified result
                                // ADCS2 = 0 for Tosc x8 (Fosc/8)
								// RA2/AN2 selected as analog input
								// Vref+ : Vdd   Vref- : Vss
								// AN7, AN6 and AN5 selected for Digital I/O for LCD
    
    //USART
    TRISC 	|= 0xC0;		// RC6 and RC7 must be configured as inputs to enable the UART 
	TXSTA 	= 0x24;		// Set TXEN and BRGH
	RCSTA 	= 0x80;		// Enable serial port by setting SPEN bit
	SPBRG	= 0x19;		// Select 9600 baud rate.
    
    while(1)
    {   
        Ds18b20_reset();
		Ds18b20_write(0xcc);
		Ds18b20_write(0x44);//发送温度转换命令
		delayms(1000);//延时1s,等待温度转换完成
		Ds18b20_reset();
		Ds18b20_write(0xcc);
		Ds18b20_write(0xbe);//发送读温度寄存器命令
		dat1=Ds18b20_read();
		dat2=Ds18b20_read();
        dat=(dat2*256+dat1)*(0.0625*10);
        
        write_ext_eeprom(addr/256, addr%256, dat);           //store the data to eeprom
        addr++;
        if(addr==10000)
            addr=0;                                         //存储长度为10000
        
        dat1=dat/10;
        dat2=dat%10;
        sprintf(outString,"%d.%d",dat1,dat2);	
        Lcd8_Clear();							//clear LCD
       
        Lcd8_Write_String(outString);
        
        if(KEY1==0)
        {   
             __delay_ms(100);	
             if(KEY1==0)
             {
                 for(i=0;i<addr;i++)
                 {
                     dat_read=read_ext_eeprom(i/256, i%256);		// Read byte at address 0x0001 on EEPROM
                    
                     sprintf(outString2,"%d\r\n",dat_read);	
                     transmit_string(outString2);             //将读到的存储值通过串口打印出去
                     __delay_ms(100);
                 }
          
             }
        }
       
    }
}

需要完整工程和仿真文件的可以私信,或者在评论区留言!!文章来源地址https://www.toymoban.com/news/detail-768399.html

到了这里,关于PIC单片机项目(2)——基于PIC16F877A的温度测量与存储装置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于单片机16路多路抢答器仿真系统设计

    ** 单片机设计介绍,基于单片机16路多路抢答器仿真系统设计   基于单片机16路多路抢答器仿真系统的设计概要主要涵盖硬件设计、软件编程以及功能实现等方面。以下是针对该设计的详细概述: 一、系统概述 该设计旨在开发一个基于单片机的16路多路抢答器仿真系统,能

    2024年04月27日
    浏览(26)
  • 126、仿真-基于51单片机16×16点阵滚动显示仿真设计(Proteus仿真+程序+配套资料等)

    方案选择 单片机的选择 方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节的闪存程序存储器,也就是说代码量可以写到128k字

    2024年02月17日
    浏览(38)
  • 16、基于51单片机智能浇花自动浇水灌溉土壤湿度检测报警系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图   五、PCB图 六、Proteus仿真 七、程序源码 八、资料包括 本次盆栽植物自动浇灌系统,系统是用AT89C51单片机作为控制中心,使用YL-69作为土壤湿度传感模块,LC

    2024年02月06日
    浏览(31)
  • 基于51单片机的16键电子琴音乐盒设计proteus仿真原理图程序

    功能: 0.本项目采用STC89C52作为单片机系统的控制MCU 1.LCD1602液晶实时显示时间和当前工作模式 2.支持电子琴模式和歌曲模式(内置8首歌曲) 3.短触’设置/切换’键可切换工作模式 4.长按’设置/切换‘键可进入时间设置模式 5.采用DC002作为电源接口可直接输入5V给整个系统供电

    2024年02月12日
    浏览(30)
  • 51单片机项目(9)——基于51单片机的电子琴设计

    简易电子琴设计设计内容: 1.用矩阵键盘代表琴键,至少能弹出8个音符,分别是:音符1.23.4.,5,6,  2.键按下的时间长短表征节拍的长短,用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 (代码及其工程文件放在最后) 电路图如下: 51单片机电子琴是一种基于51单片机(

    2024年02月09日
    浏览(32)
  • 51单片机项目(7)——基于51单片机的温湿度测量仿真

    本次做的设计,是利用DHT11传感器,测量环境的温度以及湿度,同时具备温度报警的功能:利用两个按键,设置温度阈值的加和减,当所测温度大于温度阈值的时候,蜂鸣器就会响起,进行报警提示。 同时系统还有一个LCD1602屏幕,用于显示实时的温度湿度,还可以显示温度阈

    2024年02月10日
    浏览(34)
  • 基于51单片机的项目作品汇总

     篇记录下自己做的项目作品,作品有实物也有仿真,以实物居多,主要是以单片机为主,单片机有HC32,STM32,STC,51等,本人从事单片机行业5年,拥有丰富的经验。也涉及QT,LVGL,嵌入式,IPC等,如有需求,请私信。 注:仿真文件是以protues8.13版本画的仿真图,低版本自行修改

    2024年02月07日
    浏览(22)
  • 【毕业设计】16-基于单片机的酒精浓度监测系统设计(原理图+仿真+源代码+实物图+答辩论文+答辩PPT)

    包含此题目毕业设计全套资料: 1.原理图工程 2.源代码工程 3.仿真工程 4.实物焊接过程图+实物图 5.详细设计文档,22518字 6.答辩PPT 主要内容: 理解并掌握单片机的基本知识;了解STC89C52单片机的工作原理和基本结构;设计基于单片机的具有酒精浓度检测功能的电路;制作具有

    2024年02月03日
    浏览(33)
  • 单片机项目分享 基于stm32的便携用电功率统计系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月19日
    浏览(76)
  • 单片机项目分享 基于Stm32的家庭智能监控系统 - 单片机 图像识别 人体检测 AI

    hr style=\\\" border:solid; width:100px; height:1px;\\\" color=#000000 size=1\\\" 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最

    2024年01月16日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包