PIC单片机项目(1)——基于PIC16F877A的电子秤设计

        首先简要描述一下实现的功能:

        使用电位器,采用电阻分压的形式来改变电阻上的电压,以此来模拟电子秤上重量的变化。使用PIC16F877A的AD转换端口,测量电阻上的电压,用此数据来代替物体重量。同时用LCD1602显示器,将所测量的重量显示在屏幕上。

        整体电路图如下所示:

        首先简单介绍一下LCD1602模块,该模块具体的信息网上有很多资源可以参考:

         RS:数据或命名选择端。(0:命令   1:数据)

        RW:读写控制端。          (0:写    1:读)

        E:使能端

        D0-D7:数据端

        写指令的时候应该:RS=0,RW=0,D0-D7=data,E=1,延时一段时间,E=0;

        写数据的时候应该:RS=1,RW=0,D0-D7=data,E=1,延时一段时间,E=0;

        

        接下来详细介绍PIC16F877A的AD转换功能:

        直接看官方文档的介绍:

        

        从中可以知道,对于28脚系列的 器件,有5路模拟输入端,对于40/44脚的器件,有8路模拟输入端。输入的模拟电压会被转换为10位的数字量,也就是AD的有效位数为10位。AD转换的参考电压是软件可配置的。

        与AD转换模块密切相关的寄存器为:

        ADRESH:  AD转换结果的高位寄存器

         ADRESL:  AD转换结果的低位寄存器

        ADCON0:  AD转换模块的控制寄存器

        ADCON1:AD转换模块的控制寄存器

       

         ADCON0寄存器各个位的信息如下所示:

        

   

         该寄存器的第6-7位和ADCON1的<ADCS2>位一起,用于选择AD转换的时钟速率

        第5-3位,用于选择AD转换的通道

        第2位,AD转换的状态位。当手动将该位置1时,开启AD转换。AD转换结束后,硬件自动将该位置0。如果AD转换没有完成,那么该位一直为1.

        第1位,保留,没有作用。

        第0位,AD模块启用位。为1表示打开AD模块,启用AD。

        

        ADCON1寄存器各个位的信息如下所示:

   

 

         该寄存器第7位,控制AD转换结果的格式。1表示结果右对齐,左边空出来的位为0。0表示左对齐,右边空出的位为0.

         该寄存器第6位,和上面的ADCPN0一起控制AD转换的时钟速率。

        5-4位未实现,读为0.

        3-0位,用于控制AD转换引脚的工作模式以及AD转换模块的参考电压。

        基础知识铺垫完毕以后,就可以开始准备编写代码了。

        首先是配置好PIC16F877A单片机的配置位

        

        然后要包含一定的头文件:

         

        其中,头文件“ee302lcd.h”里面包含的是和液晶屏LCD1602相关的函数。

         然后定义一个全局字符串,用于存放测到的重量信息,也可以理解为测到的模拟电压值

        

         再定义一个变量,用于保存AD转换值

        

         接下来定义一个开启AD转换的函数

         最后就是主函数了。主函数里面包含了AD转换的配置模式,以及LCD1602的初始化函数、显示函数等等。

        全部main.c如下:

        

// 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


 unsigned char outString[5];	//character array for LCD string

 int adc_value;

void do_adc(void)
{
    __delay_us(30);					//Acqusition time delay set to 30us (>19.7us)
    GO_nDONE=1;						//Start ADC conversion
	while(GO_nDONE)continue;		//Wait until conversion finishes
    adc_value = ADRESH;					//Pass ADRESH value to adc_value variable
    
    sprintf(outString,"%dkg",ADRESH);	 //显示光照强度  光照阈值  运行时间
    Lcd8_Write_String(outString);
    //Lcd8_Set_Cursor(2,0);	
   
}


void main(void) 
{
    Lcd8_Init();				// Required initialisation of LCD to 8-bit mode

    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 
    while(1)
    {   
       
        Lcd8_Clear();							//clear LCD
       
        do_adc();
        
         __delay_ms(100);
    }
}

        需要完整工程(代码和仿真的)请留言或私信。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值