⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 untitled.c

📁 基于PIC18F2580实现的 电压A/D转换程序 结果送液晶1602显示
💻 C
字号:
/******************************************  
*程序功能;采集0-5v电压经AD转换处理,结果送LCD显示       	   *		 
* 时钟频率:内部8MHz 				                           *
* 设    计:方  勇					                           *
* 修改日期:2008年08月20日				                       *
* 编译环境:maplab8.1					                       *
* 实验环境:自制试验板					                       *
* 使用端口:RC0~PCRC3,RC4,RC5                                  *
* 端口连接:RC0~PCRC3->DB4~DB7,RC4->E,RC5->R/S,GND->R/W	       *
*****************************************/
#include "pic18.h"              //包含单片机内部资源预定义
const char TABLE[]={0x30,0x31,0x32,0x33,0x34,
                    0x35,0X36,0X37,0X38,0X39,0X2E,0x56,0xA0};            //定义常数0-9及“.”的数据表格
int i,j,k,n;//用于调试的全局变量
#define E RC4        //定义液晶显示控制管脚
#define RS RC5
const int Twentyms=1250;  //说明一个用于20ms延时的常量
const int Fivems=300;
const int TwoHundredus=10;
const char TopMessage1[]="Fighting!AZa AZa";
const char BotMessage1[]="V=";
void  DELAY();              //delay函数申明
void  init();               //I/O口初始化函数申明
void  display(int x);       //显示函数申明
LCDWrite(int LCDData,int RSValue)
{
   PORTC=(LCDData>>4)&0x0f;//获取输出的高4位
   RS=RSValue;
   E=1;E=0;                //拨动开关高4位
   PORTC=LCDData&0x0f;    //获取输出低4位
   RS=RSValue;
   E=1;E=0;                //拨动开关低4位
   if((0==(LCDData&0x0f))&&(0==RSValue))
   n=TwoHundredus;                 //设置延时间隔
   else 
   n=Fivems;
   for(k=0;k<n;k++);        //字符延时
}   //LCDWrite函数结束
void LCDINIT()
{  
   PORTC=0;            //从C口所有位都为高电平开始
   TRISC=0;            //c口为输出
                       // 根据网页提供的信息初始化液晶显示
   j=Twentyms;
   for(i=0;i<j;i++);    //等待液晶显示通电
   PORTC=3;             //开始初始化过程
   E=1;E=0;             //发送复位命令
   j=Fivems;
   for(i=0;i<j;i++);    
   E=1;E=0;             //重复复位命令
   j=TwoHundredus;
   for(i=0;i<j;i++);    
   E=1;E=0;             //第三次复位
   j=TwoHundredus;    
   PORTC=2;             // 初始化液晶显示4位模式
   E=1;E=0;
   j=TwoHundredus;
   for(i=0;i<j;i++); 
   LCDWrite(0b00101000,0);   //液晶显示是4位I/F,双排的
   LCDWrite(0b00000001,0);   //清除液晶显示
   LCDWrite(0b00000110,0);   //在每个字符显示之后移动光标
   LCDWrite(0b00001110,0);   //接通液晶显示并激活光标
}




//------------------------------------------------
  //主程序开始
 void  main()               
 {
   int m;
   int result=0x00;          //定义转换结果寄存器 
   NOP (); 
   LCDINIT(); 
   for(i=0;TopMessage1[i]!=0;i++)   //显示LOGO
   LCDWrite(TopMessage1[i],1);  
   while(1)                  //死循环
   {                   
   result=0x00;              //转换结果清0
   for(m=5;m>0;m--)          //求5次转换结果的平均值
    {
       init();                //调用初始化函数
       while(GODONE);           //等待转换完成
       result=result+ADRESH;  //累计转换结果
    }
   result=result/5;       //求5次结果的平均值
   NOP ();
   display(result);        //调用显示函数

  }
}
//-----------------------------------------------
 //初始化函数
 void  init()               
  {
   
   PORTA=0XFF;               
   TRISA=0X01;                //设置RA0为输入,其他为输出            
   TRISC=0X00;               //设置D口全为输出
   ADCON0=0X00;              //选择通道0 
   ADCON1=0X0B;
   ADCON2=0X09;              //左对齐8个TAD时间  FOSC/8
                             //ADCON2=0XA1;右对齐
                             
                          
   ADON=1;                  //使能AD转换
   DELAY();                  //保证采样延时
   GODONE=1;                  
   }
//-----------------------------------------------
//显示函数
 void display(int x)          
   {
     
    int  bai,shi,ge,temp;   //定义4个临时变量
    temp=x;                //暂存AD转换的结果
    bai=temp/51;           //求显示的百位
    NOP ();

    temp=temp%51;           //求显示的十位
    temp=temp*10;
    shi=temp/51;


    temp=temp%51;
    temp=temp*10;
    ge=temp/51;  
 
    //LCDINIT();
   // for(i=0;TopMessage1[i]!=0;i++)
   // LCDWrite(TopMessage1[i],1);  
    LCDWrite(0b11000000,0); //将光标移动到第二排 
    LCDWrite(TABLE[12],1);
    LCDWrite(TABLE[12],1);
    LCDWrite(TABLE[12],1);
    for(i=0;BotMessage1[i]!=0;i++)
    LCDWrite(BotMessage1[i],1); 
    LCDWrite(TABLE[bai],1);
    LCDWrite(TABLE[10],1);
    LCDWrite(TABLE[shi],1);
    LCDWrite(TABLE[ge],1);
    LCDWrite(TABLE[11],1);

    //LCDWrite(0B11111111,1);
    NOP ();
  }

//----------------------------------------------
//延时程序
void  DELAY()              //延时程序
    {
     int i;
     for(i=0x100;i--;);     //延时
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -