找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4035|回复: 3
打印 上一主题 下一主题
收起左侧

PIC16F877A单片机做个电压电流表

[复制链接]
跳转到指定楼层
楼主
ID:159270 发表于 2017-1-5 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
手头上有PIC16F877A,LCD1602,想DIY个直流电压电流显示器,菜鸟一个,手上有LED显示的电压表程序,哪位有1602显示的程序,分享下行吗
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:159270 发表于 2017-1-5 14:19 | 只看该作者
//////////////////////////////////////////////////
//  Author     :   Toby
//  Date       :   2009/03/08
//  Function   :   数字电压表程序,用数字滤波的方式,并在LCD 1602上显示
//  MCU        :   PIC16F877A
//  C Compiler :   PICC 8.05
//  IDE        :   MPLAB IDE v8.10               
/////////////////////////////////////////////////

__CONFIG(0x1832);        
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

union  adres                                                            //定义一个共用体,用于存放10位A/D转换的结果
{int  y1;
unsigned  char  adre[2];
}adresult;

unsigned int ADC=0;

void adinitial_voltage(void);// RA0为AD输入

const char TABLE[]={'0','1','2','3','4','5','6','7','8','9'};  //定义常数0-9的数据表格
const char data[4]={'0','0','0','0'};
#define rs RA1
#define rw RA2
#define e  RA3

const char voltage[ ]={'V','O','L','T','A','G','E','='};

unsigned char ge=0,shi=0,bai=0,qian=0;   //定义6个临时变量
void init();                   //申明I/O口初始化函数
void lcd_init();               //申明LCD初始化函数
void lcd_dis();
void write_voltage();            
void write(char x);            //申明显示1字节数据函数
void lcd_enable();             //申明LCD显示设置函数
void delay();                  //申明延时函数

//---------------------------------------
//主函数
void main()
{     
    unsigned char a;
    init();                //调用I/O口初始化函数
    while(1)
      {
   
         adinitial_voltage();
         lcd_init();    //调用LCD初始化函数
         for(a=10;a>=1;a--)
          {   
            PORTD=0X80;               
            lcd_enable();

            write_voltage();

            PORTD=TABLE[qian];                   //待显示数据送PORTD口
            lcd_dis();
           
            PORTD='.';                          //待显示数据送PORTD口
            lcd_dis();

            PORTD=TABLE[bai];                   //待显示数据送PORTD口
            lcd_dis();
      
            PORTD=TABLE[shi];                   //待显示数据送PORTD口
            lcd_dis();
      
            PORTD=TABLE[ge];                   //待显示数据送PORTD口
            lcd_dis();

      }         
  
      }
}

//---------------------------------------
//I/O口初始化函数
void init()
{
    ADCON1=0X0;                //设置A口为普通I/O口
    TRISA=0B00000001;          //设置A口为输出
    TRISD=0X00;                //设置D口为输出
}

//---------------------------------------
//LCD初始化函数
void lcd_init()
{
    PORTD=0X1;                 //清除显示
    lcd_enable();
    PORTD=0X38;                //8位2行5*7点阵
    lcd_enable();
    PORTD=0X0c;                //显示开,光标开,闪烁
    lcd_enable();
    PORTD=0X06;                //文字不动,光标右移
    lcd_enable();
   
}


//--------------------------------------
//显示公司tel函数
void write_voltage()
{
    unsigned char  i;
    for(i=0;i<=7;i++)       //一共显示16字节数据
       {
         write(voltage[i]);       //查表获取数据并调用写一个字节数据函数送LCD显示
       }
}
  
//--------------------------------------
//写一个字节数据函数  
void write(char x)
{
  PORTD=x;                   //待显示数据送PORTD口
  lcd_dis();
}

//--------------------------------------
//LCD显示设置函数
void lcd_enable()
{
   rs=0;                     //该字节数据为命令,而不是数据     RS=1数据RS=0命令
   rw=0;                     //此次操作为写,而不是读           RW=1读RW=0写
   e=0;                      //拉低使能信号
   delay();                  //保持使能信号为低一段时间
   e=1;                      //拉高使能信号,建立LCD操作所需要的上升沿
}
void lcd_dis()
{
   rs=1;                     //该字节数据为命令,而不是数据     RS=1数据RS=0命令
   rw=0;                     //此次操作为写,而不是读           RW=1读RW=0写
   e=0;                      //拉低使能信号
   delay();                  //保持使能信号为低一段时间
   e=1;                      //拉高使能信号,建立LCD操作所需要的上升沿
}
  
//延时函数
void delay()
{
   int i;
   for(i=0;i<50;i++);
}


void adinitial_voltage(void)// RA0为AD输入
{   
         unsigned int AD_data[5]={0,0,0,0,0};
         for(j=0;j<=4;++j)
           {
             ADCON0=0B01000001;     //A/D 转换器模块工作;但AD转换不进行;FOSC/8
             ADCON1=0B11101110;     //ADRESH 寄存器的高6 位读为0;6位与7位须置1
             ADGO=1;
             while(ADGO);             //等AD转换完成
             adresult.adre[0]=ADRESL;
             adresult.adre[1]=ADRESH;  //读取并存储A/D转换结果
             AD_data[j]=adresult.y1;
            
          }
             for(j=0;j<=4;++j)
               if(AD_data[j]>AD_data[j+1])
                {temp=AD_data[j];AD_data[j]=AD_data[j+1];AD_data[j+1]=temp;}//找出最大的数,

                    for(j=0;j<=3;++j)
                      if(AD_data[j]<AD_data[j+1])
                         {temp=AD_data[j];AD_data[j]=AD_data[j+1];AD_data[j+1]=temp;} //找出最小数

                            ADC=((AD_data[0]+AD_data[1]+AD_data[2])/3)/213.20008328128253175098896523006*1000;//中间数作平均
        
                                 qian=ADC/1000;
                                  bai=ADC%1000/100;            
                                   shi=ADC%100/10;            
                                     ge=ADC%10;               
}
回复

使用道具 举报

板凳
ID:159270 发表于 2017-1-5 14:26 | 只看该作者
网上下的,编译不了
回复

使用道具 举报

地板
ID:160143 发表于 2017-1-5 15:27 来自手机 | 只看该作者
帮忙顶,,,,,,,,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表