1. 程式人生 > >AD轉換控制直流電機轉速

AD轉換控制直流電機轉速

#ifndef   __XPT2046_H_
#define   __XPT2046_H_ //---包含標頭檔案---//
#include<reg52.h>
#include<intrins.h> //---重定義關鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif #ifndef uint
#define uint  unsigned int
#endif #ifndef ulong
#define ulong  unsigned long
#endif //---定義使用的IO口---//
sbit DOUT = P3^7;   //輸出
sbit CLK  = P3^6;   //時鐘
sbit DIN  = P3^4;   //輸入
sbit CS   = P3^5;   //片選 uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat); #endif

/**************************************************************************************
*                電位器AD實驗              *
實現現象: 具體接線操作請參考視訊
   下載程式後數碼管前4位顯示電位器檢測的AD值,範圍是0-4095,一般達不到最大,這個受
   你供電電壓的影響.
注意事項:                     
***************************************************************************************/ #include "reg52.h"    //此檔案中定義了微控制器的一些特殊功能暫存器
#include"XPT2046.h" 
//--定義使用的IO口--//
sbit PWM=P1^0; //--定義一個全域性變數--//
unsigned char timer1; void Time1Config();
typedef unsigned int u16;   //對資料型別進行宣告定義
typedef unsigned char u8; sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4; u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u16 temp;
u16 x; /*******************************************************************************
* 函 數 名         : delay
* 函式功能     : 延時函式,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
 while(i--); 
} /*******************************************************************************
* 函式名         :datapros()
* 函式功能   :資料處理函式
* 輸入           : 無
* 輸出           : 無
*******************************************************************************/
void datapros()
{
 
 static u8 i;
 if(i==50)
 {
  i=0;
  temp = Read_AD_Data(0x94);  //   AIN0 電位器
 }
 i++;
 disp[0]=smgduan[temp/1000];//千位
 disp[1]=smgduan[temp%1000/100];//百位
 disp[2]=smgduan[temp%1000%100/10];//個位
 disp[3]=smgduan[temp%1000%100%10];  
}
/*******************************************************************************
* 函式名         :DigDisplay()
* 函式功能   :數碼管顯示函式
* 輸入           : 無
* 輸出           : 無
*******************************************************************************/
void DigDisplay()
{
 u8 i;
 for(i=0;i<4;i++)
 {
  switch(i)  //位選,選擇點亮的數碼管,
  {
   case(0):
    LSA=0;LSB=0;LSC=1; break;//顯示第0位
   case(1):
    LSA=1;LSB=0;LSC=1; break;//顯示第1位
   case(2):
    LSA=0;LSB=1;LSC=1; break;//顯示第2位
   case(3):
    LSA=1;LSB=1;LSC=1; break;//顯示第3位 
  }
  P0=disp[i];//傳送資料
  delay(100); //間隔一段時間掃描 
  P0=0x00;//消隱
 }  
} /*******************************************************************************
* 函 數 名       : main
* 函式功能   : 主函式
* 輸    入       : 無
* 輸    出      : 無
*******************************************************************************/
void main()

 Time1Config();
// x=100/1024;
 while(1)
 {
  datapros();  //資料處理函式
  DigDisplay();//數碼管顯示函式 
  if(timer1>100)  //PWM週期為100*0.5ms
  {
   timer1=0;
  }
  if(timer1 < (temp*0.0122070)) //改變30這個值可以改變直流電機的速度
  {
   PWM=1;
  }
  else
  {
   PWM=0;
  } 
 }  
}


/*******************************************************************************
* 函 數 名       : Time1Config
* 函式功能   : 設定定時器
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/ void Time1Config()
{
 TMOD|= 0x10;   //設定定時計數器工作方式1為定時器  //--定時器賦初始值,12MHZ下定時0.5ms--// 
 TH1 = 0xFE;
 TL1 = 0x0C;  
 ET1 = 1;   //開啟定時器1中斷
 EA = 1;
 TR1 = 1;  //開啟定時器 
} /*******************************************************************************
* 函 數 名       : Time1
* 函式功能   : 定時器1的中斷函式
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/ void Time1(void) interrupt 3    //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串列埠中斷
{
 TH1 = 0xFE;  //重新賦初值
 TL1 = 0x0C;
 timer1++;   
}