?? 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 + -