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

📄 testhwgad-cha0a1.c

📁 PIC系列单片机实现小车控制部分
💻 C
字号:
//8.23更改XPWM.C为ADRA0.C程序,服务AD采集,采集端口为RA0.
//去掉了PWM波型产生部分
//实现了双通道A0,A1,口的采集
#include<pic.h>
//#include<math.h>
#include<stdio.h>
/******************************************************
**定义全局变量
*****************************************************/
unsigned char Position_X,Position_Y;
bank1 char String[32]="Hello,everyone!";
int x,y,k;
void Delay(int i);
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *str);
void LCD1602_cls();
void delay(int k);
//////////////////////////////////////
//---------------------全局变量定义-------/
//////////////////////////PWM波型///////////////////////
static char TIMERNUMBER,sec;
//static float Adresul;
bank1 char ADFLAG=0;
bank1 static unsigned int Adresult,ADsmp,ADX;

static char  DIS_FLAG,CHA1_FLAG,ADINTCONTER;
bank1 static unsigned int Adresult_A0,ADsmp_A0;
bank1 static unsigned int Adresult_A1,ADsmp_A1;
void initvar();     //数据初试值初试化
void T1inti();

void Portinit();          //端口初始化函数
void ADinit();            //AD初始化函数
void dealad();      //AD数据处理函数

/********************************************************************
中断程序程序:                                                    
功能:执行对RB0外部中断,读红外口
********************************************************************/
void interrupt INT()
{

  if(TMR1IF&&TMR1IE)
    {   
	 TMR1IF=0;        //清除中断标志位   
     TMR1H=0xa3;      //T1时间高位赋值
     TMR1L=0x00;     //T1时间低位赋初值
	// ADON=1;   //打开AD转换,次部可有可无
	 sec=sec+1;
	 
	 if(sec==10)
	   { 
		ADGO=1;
        DIS_FLAG=1;
        sec=0;
        }
   }	 

  if(ADIF&&ADIE)
      {
	        ADIF=0;
	        ADINTCONTER=ADINTCONTER+1;
	        
	            if((ADCON0&0X38)==0X00)
	             {
	               ADsmp_A0=ADRESL+(ADRESH<<8);          //取采样结果
                   Adresult_A0=((((ADsmp*50)>>6)*50)>>4)*2; 
	               ADsmp=ADsmp_A0;
	               if(ADINTCONTER>=2)
	                  {
		                  CHS0 = 1;                       //准备进入3通道
                          CHS1 = 0;
                          CHS2 = 0;
                          ADINTCONTER=0;
                      }  
                  else
                      ADGO = 1;        
	              }
	           if((ADCON0&0X38)==0X08)
	             {
		           ADsmp_A1=ADRESL+(ADRESH<<8);          //取采样结果
                   Adresult_A1=((((ADsmp*50)>>6)*50)>>4)*2; 
                   ADsmp=ADsmp_A1; 
                   if(ADINTCONTER>=2)
	                  {
		                  CHS0 = 0;                       //准备进入3通道
                          CHS1 = 0;
                          CHS2 = 0;
                          ADINTCONTER=0;
                      } 
                   else
                       ADGO = 1;  
                 } 
          
	    }	  
	          
          
}
/*****************************************
//函数名称:void initvar()
//函数功能:为系统调用值赋初值
//函数调用:主函数调用
*****************************************/
void initvar()
{
	TIMERNUMBER=0;//输出大约20MS的低电平
	ADsmp=0;
	Adresult=0;
	
	ADX=0;
	ADsmp_A0=0;
	Adresult_A0=0;
	ADsmp_A1=0;
	Adresult_A1=0;
	
	sec=0;

}
/*****************************************
//函数名称:void T1inti()
//函数功能:T1初试化
//函数调用:主函数调用
*****************************************/ 
void T1inti()
{     
         TMR1H=0xa3;   //给T1赋值,32K晶振,计数值为0.1S
         TMR1L=0x00;   //给T1赋值   
         T1CON=0x30;   //T1为定时器
         TMR1ON=1;     //打开T1进行计数 
         
} 
void  ADinit()          
 {       
          ADCON1=0x82;       //转换结果右移,及ADRESH 寄存器的高6 位为"0"
          ADCON0=0x85;         
          //10 010 000选择A/D 通道为RA2,打开A/D转换器,等待中断打开标志位ADGO
          //在工作状态,且使AD 转换时钟为Fosc/8
          //ADGO位至1,启动AD转换
          ADIF=0; 
          ADIE=1;          
}
void Portinit()
{	     
	      TRISA=0x1f;          //相应的位作为AD采集位   
	      TRISB=0x00;
	      TRISC=0X10;
          TRISD=0x00;         
          TRISE=0X00;         

 }  	  
/*******************************************************************************
**函数名称:void LCD1602_Write_Command()
**功能描述:LCD写命令
******************************************************************************/
void LCD1602_Write_Command(unsigned char x)
{  RE0=0;
   RE1=0;
   RE2=1;           //RS=0;RW=0;E=1;
   PORTD=x;
   RE2=0;
}
/*******************************************************************************
**函数名称:char Locate_Position()
**函数描述:确定写入数据的位置
*******************************************************************************/
char Locate_Position(unsigned char x,unsigned char y)
{    unsigned char Position;                 //数据的位置
     Position_X=x;
     Position_Y=y;
     Position=Position_X&0x0f;         //第几个字符
     Position_Y=Position_Y&0x01;       //第几行
     switch(Position_Y)
     { case 0:break;
       case 1:Position=Position|0x40;     //计算出在第几个存储器
       default:;
     }
     Position=Position|0x80;
     return(Position);
}
/*******************************************************************************
**函数名称:void LCD1602_Write_Word(char x,char Position)
**功能描述:LCD写数据
********************************************************************************/
void LCD1602_Write_Word(unsigned char x)
{ RE0=1;
  RE1=0;
  RE2=1;
  PORTD=x;           //写入数据
  RE2=0;
}
/******************************************************************************
**函数名称:void Delay ()
**功能描述:延时一段时间
*******************************************************************************/
void Delay(int j)
{    int i;
	 for(i=j;i>0;i--);
}
/******************************************************************************
**函数名称:void LCD_Write_String()
**函数描述:写入一串字符
******************************************************************************/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *str)
{ unsigned char i,j=0;
  unsigned char Position;
  while(str[j]>31) {j++;}
  for(i=0;i<j;i++)
  {   Position=Locate_Position(x,y);      //确定显示的位置
      LCD1602_Write_Command(Position);   //写入显示的位置
      Delay(50);
      LCD1602_Write_Word(str[i]);         //写入字符
      Delay(50);
      x++;
      if(x==16)
      {x=0;y^=1;}                      //如果写到第16个则换行
  }
}
/*******************************************************************************
**函数名称:void LCD1602_cls()
**功能描述:显示屏清屏
********************************************************************************/
void LCD1602_cls()
{     
	LCD1602_Write_Command(0x01);           //显示清屏
}

/*******************************************************************************
**函数名称 :void LCD1602_Initial()
**功能描述:显示器初始化
********************************************************************************/
void LCD1602_Initial()
{    TRISD=TRISD&0x00;
     TRISE=TRISE&0xf8;
     LCD1602_Write_Command(0x38);
     Delay(25000);      
     LCD1602_Write_Command(0x38);
     Delay(25000);
     LCD1602_Write_Command(0x38);
     Delay(25000);
     LCD1602_Write_Command(0x38);
     Delay(1000);     //设置显示的方式
     LCD1602_Write_Command(0x08);;       //显示关闭
     Delay(1000);
     LCD1602_Write_Command(0x01);   //清除显示
     Delay(1000);
     LCD1602_Write_Command(0x06);      //显示光标移动设置
     Delay(1000);
     LCD1602_Write_Command(0x0c);      //显示开及光标设置
     Delay(1000);
}

/********************************************************
-----------------主函数----------------------------------
********************************************************/
void main()
{
  initvar();     //数据初试值初试化
  Portinit();
  T1inti();      //采样周期
  INTCON=0XC0;
  ADinit();      //AD相关寄存器初试化
  TMR1IE=1;      //打开采样时钟中断标志位
  ADON=1;
  LCD1602_Initial();
  LCD_Write_String(0,1,String);
  while(1)
  {
    
	if(DIS_FLAG==1)
	   {    
		     //LCD1602_cls();
	         sprintf(String,"%umv %u      ",Adresult_A0,ADsmp_A0);
             LCD_Write_String(0,0,String);
             sprintf(String,"%umv %u      ",Adresult_A1,ADsmp_A1);
             LCD_Write_String(0,1,String);
             DIS_FLAG=0;
        }
    }
}
 //----------------------------------------------------------
 //----------------------end file----------------------------
 //----------------------------------------------------------

⌨️ 快捷键说明

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