PIC单片机ad采样在LCD上显示

2019-11-09来源: 51hei关键字:PIC单片机  ad采样  LCD上显示


/* Main.c file generated by New Project wizard

*

* Created:   周二 4月 10 2018

* Processor: PIC18F452

* Compiler:  MPLAB C18

*/

#include

#define RW PORTBbits.RB5

#define RS PORTBbits.RB6

#define EN PORTBbits.RB7

#define P0 PORTD

#define ADGO ADCON0bits.GO

void tmr(void);

void KeyInterrupt1 (void); //中断服务函数

void KeyInterrupt2 (void); //中断服务函数

void KeyInterrupt3 (void); //中断服务函数

void lcd_show(void);

void lcd_show1(void);

void lcd_show2(void);

void lcd_show3(void);

void lcd_show4(void);

void lcd_show5(void);

void lcd_show6(void);

unsigned int AD_Trs(void);

unsigned int AD_Trs1(void);

unsigned int AD_Trs2(void);

//int j=0;

//int time=0;

//int timem=0;

int intermode=0;

unsigned int lednum=0;

int  max=4000,max1=3900,max2=3800,max3=3700;

int   min=1000,min1=900,min2=800,min3=1000;

unsigned char time2[7]="wangkuod";

unsigned int a1=0,a2=0,a3=0;

    int init();    //声明初始化函数

     int write_com(unsigned char);//声明写命令函数

      int write_date(unsigned char);//声明写数据函数

      int delay(unsigned char);//声明延迟函数

      unsigned char x;

//sbit RS = P1^0;

  // sbit RW = P1^1;

  //sbit EN = P1^2;


//unsigned char table[]="HELLO!";

//unsigned char table1[]="2018/4/16";

void main(void)//主函数

{    

    TRISD=0;

TRISBbits.TRISB0=1;

TRISBbits.TRISB1=1;

TRISBbits.TRISB2=1;

    TRISBbits.TRISB5=0;

TRISBbits.TRISB6=0;

TRISBbits.TRISB7=0;

TRISAbits.TRISA0=1;

  TRISAbits.TRISA1=1; 

TRISAbits.TRISA2=1;

TRISAbits.TRISA6=0;


// INTCON |= 0xa0; //开全局中断及Timer0 中断

//INTCONbits.TMR0IE=1;

INTCONbits.GIE=1;

//INT0

INTCON2bits.INTEDG0=1;

INTCONbits.INT0IF=0;

INTCONbits.INT0IE=1;

//INT1

INTCON2bits.INTEDG1=1;

INTCON3bits.INT1IF=0;

INTCON3bits.INT1IE=1;

//int2

INTCON2bits.INTEDG2=1;

INTCON3bits.INT2IF=0;

INTCON3bits.INT2IE=1;


//TMR0H = 25536/256; //高8 位

//TMR0L = 25536%256; //低8 位

//T0CON = 0x88; //使能Timer0,并设置为16 位定时器,没有预分频

//AD

ADCON0=0x81;

//-- ADFM ADCS2 —— —— PCFG3 PCFG2 PCFG1 PCFG0

//-- 1 0 0 0 1 1 1 0

//右对齐(ADRESH 寄存器的高6 位读作0),AN0 为模拟输入位,参考正负电压

//分别为VDD 和VSS

ADCON1 = 0x8e;


     init();

  


   // write_com(0x80);    

//    for(x=0;x<6;x++)

//    {

//          write_date(table[x]);

//         delay(150);

//   }


//for(x=0;x<6;x++)

   //  {

   //       write_date(time);

//         delay(150);

//    } 




   //  write_com(0x80);    

  //   for(x=0;x<17;x++)

  //  {

//        write_date(table1[x]);

//        delay(150);

//   }

     while(1)

  {

   unsigned int a; 

   lednum = AD_Trs();

   write_com(0x80);

   time2[1]='0';

   lcd_show();

   

   lednum = AD_Trs1();

   write_com(0x80+0x08);

   time2[1]='1';

   lcd_show();

   

   lednum = AD_Trs2();

   write_com(0x80+0x40);

   time2[1]='2';

   lcd_show();

  switch(intermode) {

  case 0: {write_com(0x80+0x40+0x08);

  lcd_show1();break;

   }

      

case 1:

   {write_com(0x80+0x40+0x08);

   lcd_show2();break;}

   

  case 2: 

   {write_com(0x80+0x40+0x08);

   lcd_show3();break;

   }

   

  case 3: 

   {write_com(0x80+0x40+0x08);

   lcd_show4();break;

   }

  

  case 4: 

   {write_com(0x80+0x40+0x08);

   lcd_show5();break;

   }


  case 5: 

   {write_com(0x80+0x40+0x08);

   lcd_show6();break;

   }

   

default:

  {write_com(0x80);

   lcd_show1();break;

   }

  }

   

if(lednum>max1|lednum>max2|lednum>max3|lednum

//for(a=10;a>0;a--)

//{PORTAbits.RA3=0; 

//   delay(50);

  //   PORTAbits.RA3=1;

  //  delay(50);

   //  PORTAbits.RA3=0;  

   // delay(50);

   //  PORTAbits.RA3=1;  

  //  delay(50);} 

PORTAbits.RA6=1; }

  

  } 

   

}




#pragma code xx=0x0008 //MCC18 的中断必需用一段汇编实现

void inter(void) //xx 为优先级,没有优先级时,可省略xx

{

if(INTCONbits.INT0IF){

  _asm  

  goto KeyInterrupt1

  _endasm}

else if(INTCON3bits.INT1IF){

   _asm  

   goto KeyInterrupt2

   _endasm

  }

else {

   _asm  

   goto KeyInterrupt3

   _endasm

  }

  

}


//=======中断服务函数==========

#pragma interrupt KeyInterrupt1

void KeyInterrupt1 (void)

{

if (INTCONbits.INT0IF && INTCONbits.INT0IE) //中断标志位判断

{

//T0CONbits.TMR0ON=~T0CONbits.TMR0ON;

INTCONbits.INT0IF = 0; //中断标志位清零

switch(intermode) {

  case 0: 

   {max1=max1+100; break;

   }

      

case 1:

   {max2=max2+100;break;}

   

  case 2: 

   {max3=max2+100;break;

   }

   

  case 3: 

   {min1=min1+100;break;

   }

  

  case 4: 

   {min2=min2+100;break;

   }


  case 5: 

   {min3=min3+100;break;

   }

   

default:

  {max1=max1+100;break;

   }

  } 


}

}

#pragma code

//=======中断服务函数==========

#pragma interrupt KeyInterrupt2

void KeyInterrupt2 (void)

{

if (INTCON3bits.INT1IF && INTCON3bits.INT1IE) //中断标志位判断

{

//T0CONbits.TMR0ON=~T0CONbits.TMR0ON;

//intermode=~intermode;

INTCON3bits.INT1IF = 0; //中断标志位清零

intermode++;

if(intermode>5)

{intermode=0;}

}

}

#pragma code

#pragma interrupt KeyInterrupt3

void KeyInterrupt3 (void)

{

if (INTCON3bits.INT2IF && INTCON3bits.INT2IE) //中断标志位判断

{

//time=timem=j=0;

// T0CONbits.TMR0ON=0;


INTCON3bits.INT2IF = 0; //中断标志位清零

switch(intermode) {

  case 0: 

   {max1=max1-100; break;

   }

      

case 1:

   {max2=max2-100;break;}

   

  case 2: 

   {max3=max2-100;break;

   }

   

  case 3: 

   {min1=min1-100;break;

   }

  

  case 4: 

   {min2=min2-100;break;

   }


  case 5: 

   {min3=min3-100;break;

   }

   

default:

  {max1=max1-100;break;

   }

  } 


}

}

#pragma code


int init()//初始化函数体

{

    EN = 0;

     write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口

     write_com(0X0C);//设置开显示,不显示光标

     write_com(0X06);//写一个字符时,整屏右移

     write_com(0X01);//显示清零

    return 0;

}

int write_com(unsigned char com)//写命令的函数体

{

    RS = 0;

    RW = 0;

    P0 = com;

     delay(5);

     EN = 1;

     delay(5);

     EN = 0;

    return 0;        

}


int write_date(unsigned char date)//写数据的函数体

{

     RS = 1;

     RW = 0;

     P0 = date;

     delay(5);

     EN = 1;

     delay(5);

     EN = 0;

     return 0;        

}


int delay(unsigned char xms)

{

     unsigned char x,y;

     for(x=xms;x>0;x--)

         for(y=110;y>0;y--);

     return 0;

}

void lcd_show1(void)

{

// unsigned char a,b;

//  unsigned char time2[7];

//   unsigned int time1[2];

//   unsigned int time3[2];

   

  

  //time3[0]=j/10;

   //time3[1]=j%10;

   

   //time1[0]=time/10;

   //time1[1]=time%10;

  

  

  //此算法用于取出一个整数的各个位,来显示在LCD 上

  a1 = max1/1000;

  a2 = max1%1000/100;

  a3 = max1%100/10;

  //a4 = lednum%10;

   

   time2[0]='A';

   time2[1]='0';

   time2[2]='M';

   time2[3]='0'+a1;

   time2[4]='.';

    time2[5]='0'+a2;

   time2[6]='0'+a3;

       

     for(x=0;x<7;x++)

    {

          write_date(time2[x]);

        delay(15);

    }

   

   

   

  

  

  }

  

  

  

  void lcd_show2(void)

{

// unsigned char a,b;

   

//   unsigned int time1[2];

//   unsigned int time3[2];

//  unsigned int a1=0,a2=0,a3=0;

  

  //time3[0]=j/10;

   //time3[1]=j%10;

   

   //time1[0]=time/10;

   //time1[1]=time%10;

  

  

  //此算法用于取出一个整数的各个位,来显示在LCD 上

  a1 = max2/1000;

  a2 = max2%1000/100;

  a3 = max2%100/10;

  //a4 = lednum%10;

   

   time2[0]='A';

   time2[1]='1';

   time2[2]='M';

   time2[3]='0'+a1;

   time2[4]='.';

    time2[5]='0'+a2;

   time2[6]='0'+a3;

       

     for(x=0;x<7;x++)

    {

[1] [2]
关键字:PIC单片机  ad采样  LCD上显示 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479505.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PIC单片机驱动LCD12864显示字符源代码
下一篇:PIC16F877A单片机PPM调制的激光通信Proteus仿真及源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PIC单片机调试心得
我是一位初学者,pic初学者,但是在单片机行当已经混迹多年了。说句实话,c开发环境都大同小异,只不过烧写和在线仿真大同小异。钻研了两天,收到了很多回应和启发。下面应soso的请求,把最近的调试心得和大家分享1、 先说说我要做的东西说来惭愧,这是临时的一个小任务,做一个采集和现实的部分,用两路ad采集模拟量,通过开关进行切换,简单的说就是开关打开,显示一路模拟量;开关关闭,显示另一路模拟量。主电路及其简单,我就直接说了,不附图了。电源通过一个负载(滑动变阻器就可以)回到电源负极,在回路中接入一个电流传感器,实时采集电流信号(如果条件不允许,也可以用康铜丝或者一个大瓦数小数值的采样电阻采集电流信号。然后通过放大,隔离后送入单片机
发表于 2019-11-16
PIC单片机调试心得
PIC单片机USART的应用
//★★★★★★★★★PIC单片机USART的应用(串口通信)★★★★★★★★★★★\//单征机型号:PIC16F877A//功能描述:PIC单片机USART的应用,串口调试助手发送数据给877,877收到后再转发回串口助手//通过“串口调试助手”协助工作#include<pic.h>              //包含单片机内部资源预定义__CONFIG(0xf73a);        //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M
发表于 2019-11-16
0802LCD 4位显示程序 PIC单片机C语言程序
;   delay_nus(200);      LCD_write_cmd(0x30);     delay_nms(1);     LCD_write_cmd(0x20);    LCD_write_cmd(0x20); //4位显示    LCD_write_cmd(0x80);     LCD_write_cmd(0x00); //显示开 游标、闪烁不显示    LCD_write_cmd(0x80);    
发表于 2019-11-16
pic16f887单片机用AD590高精度测温的电路和程序
一、 前言AD590 为Analog Devices 公司出品的一种双端温度转换电流源的单晶IC。图为AD590内部的线路结构,及其二种常用的包装。二、原理与暂存器设定说明原理:AD 590是一个良好的温度-电流转换的感测元件,具有良好的线性关系,其转换率为1μA/°K。&#1048708;图(左边)所示为AD 590转换电路,其输出转换率有100mV/°C(Vo15)输出。由于AD 590之转换率为1μA/°K。因运算放大器具有极高的输入阻抗,极小的输入电流的特性,使得AD 590电流完全流过R2与R3,故U1 的输出电压为1μA/°K.(R2+R3),当调整R2使得R2+R3=10KΩ时,U1 的输出电压为10mV/°K
发表于 2019-11-15
pic16f887单片机用AD590高精度测温的电路和程序
PIC单片机上实时时钟PCF8563测试程序
;WDTE_OFF&MCLRE_OFF);  //PIC配置位设置void init_fosc()    //PIC内部晶振设置{OSCCON=0x61;}...................在PCF8563.h头文件里定义的结构体.....................struct Time{uchar second;uchar minute;uchar hour;uchar day;uchar week;uchar month;uchar year
发表于 2019-11-15
PIC18f4520单片机驱动H1632的C语言程序
#include<p18f4520.h>#include <delays.h>//#pragma config OSC = HS //配置内部振荡器Fosc/4 RA7,IO口RA7//#pragma config PWRT =OFF//#pragma config BOREN = OFF//#pragma config WDT = OFF//#pragma config MCLRE = ON//#pragma config PBADEN = OFF//#pragma config LVP = OFF#define CLK PORTCbits.RC3 #define DAT PORTCbits.RC
发表于 2019-11-15
PIC18f4520单片机驱动H1632的C语言程序
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved