📄 testhwgad-cha0a1.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 + -