AD轉換控制直流電機轉速
阿新 • • 發佈:2019-01-12
#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++;
}
#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++;
}