?? aaa.c
字號:
#include <upsd3300.h>
#include <intrins.h>
#include <string.h>
#include <absacc.h>
//#include "upsd33_adc.h"
//#include <Turbo_adc.h>
//#include <Turbo_timer.h>
//#include <Turbo_PCA-PWM.h>
//#include <test.h>
#define uchar unsigned char
#define uint unsigned int
//#define PSD_REG_ADDR 0x0800 //PSD寄存器IO基址
#define scan P3 //鍵掃
#define POWK P1_7 //交流接觸器開關(guān),0有效
#define POWZ P4_7 //電阻短接,0有效
#define ST P4_6 //脈沖使能
#define RS P1_6 //液晶命令口
#define RW P1_5
#define E P1_4
#define PSD_REG_ADDR 0x0200
/*********管腳定義****************/
//#define lcdport PSD33_reg.DATAOUT_A //P4 //P4液晶數(shù)據(jù)口,必須用雙通道IO
xdata PSD_REGS PSD33_reg _at_ PSD_REG_ADDR ;
uchar bdata temp; //判忙用字節(jié)
sbit busy = temp^7;
uchar keyv ;
uchar pinlv[3] = {0,0,0}; //頻率值
uchar dianya[2] = {0,0}; //電壓值
//uchar mm[3] = {1,6,0}; //調(diào)制度,30-210
uchar code OK[]={"OK"};
uchar i;
/******************************************************************************
* PWM變量定義
******************************************************************************/
/*------------------------------------------------------------------------------
Local Variable Declarations
------------------------------------------------------------------------------*/
//時鐘周期為30ns,(板上33.1776M晶振)
//固定頻率采樣,載波頻率5K,周期200us,計數(shù)值=200us/(30ns*12)=556
//采樣周期 = 1/2載波周期 = 278
//long Fc;
long idata F;
long idata F_min;
uint data N; //載波比
long data M; //調(diào)制系數(shù)
uint data Ts; //采樣周期 = 1/2 載波周期
long data Half_Ts; //1/2采樣周期
long idata K_M; //調(diào)制系數(shù)放大倍數(shù)
long idata K_F; //輸入頻率放大倍數(shù)
//uint idata K_sin; //sin表放大倍數(shù)
//uint idata K_coe; //總放大倍數(shù),K_M * K_sin;
//int idata dead_time;
uint data U_angle;
uint data V_angle;
uint data W_angle;
uint data K; //采樣個數(shù),偶數(shù)為頂點采樣,奇數(shù)為底點采樣
uint data U_Toff; //頂點采樣開通延時
uint data U_Ton; //底點采樣關(guān)斷延時
uint data V_Toff;
uint data V_Ton;
uint data W_Toff;
uint data W_Ton;
uint Tm;
code uint u36 = 0x125;
unsigned char data P_flag,aa; //奇偶采樣點標志
static unsigned int idata timer0_tick;
static unsigned int idata timer0_value;
static unsigned int idata timer1_tick;
static unsigned int idata timer1_value;
int data M_angle;
unsigned long idata Fm;
unsigned int data PCA0;
//0--180度正弦表
unsigned char code sin_table[181] = { 0,4,9,13,18,22,27,31,35,40,
44,49,53,57,62,66,70,75,79,83,
87,91,96,100,104,108,112,116,120,124,
128,131,135,139,143,146,150,153,157,160,
164,167,171,174,177,180,183,186,190,192,
195,198,201,204,206,209,211,214,216,219,
221,223,225,227,229,231,233,235,236,238,
240,241,243,244,245,246,247,248,249,250,
251,252,253,253,254,254,254,255,255,255,
255,255,255,255,254,254,254,253,253,252,
251,250,249,248,247,246,245,244,243,241,
240,238,236,235,233,231,229,227,225,223,
221,219,216,214,211,209,206,204,201,198,
195,192,190,186,183,180,177,174,171,167,
164,160,157,153,150,146,143,139,135,131,
128,124,120,116,112,108,104,100,96,91,
87,83,79,75,70,66,62,57,53,48,
44,40,35,31,27,22,18,13,9,4,0 };
/********************************************************************
*鍵盤碼
********************************************************************/
uchar code key_tab[] =
{
0x01,0x02,0x03,0x0a,
0x04,0x05,0x06,0x0b,
0x07,0x08,0x09,0x0c,
0x0f,0x00,0x0e,0x0d,
};
/********************************************************************/
/*******************************函數(shù)聲明*****************************/
/********************************************************************/
/*---------------------------------------------------------------
* LCD函數(shù)聲明
*---------------------------------------------------------------*/
void lcdbusytest();
void writelcdcom(uchar com);
void writelcddat(uchar dat);
void mdelay(uchar j); //upsd 40M延時
void initlcd(); //初始化
void clrlcd(); //清屏
void printchar(uchar xpos,uchar ypos,uchar str); //寫一個字符
void printstr(uchar xpos,uchar ypos,uchar *str); //寫字符串
/*-------------------------------------------------------------
* 鍵盤掃描
*-------------------------------------------------------------*/
uchar getkey (void);
/*-------------------------------------------------------------
* ADC 程序聲明
-------------------------------------------------------------*/
void ADC_EnableAll(void) ;
void ADC_Init (unsigned char channel);
unsigned int ADC_Read( unsigned char channel );
/*-------------------------------------------------------------
* 得到電壓電壓值,并在液晶上顯示
-------------------------------------------------------------*/
void getVA (uchar channel);
/*-------------------------------------------------------------
* 得到功率和頻率
-------------------------------------------------------------*/
void getPf (void);
/*******************************************************************
************************PWM部分聲明*********************************
*******************************************************************/
/*-------------------------------------------------------------
//定時器0中斷服務程序,PWM
//定時器0用于產(chǎn)生采樣周期的定時中斷,采樣周期Ts =1/2載波周期 = 278 時鐘周期
-------------------------------------------------------------*/
static void timer0_isr (void); //interrupt TF0_VECTOR using 1
/*-------------------------------------------------------------
* int sin_angle(long angle )
*功能描述:角度換算函數(shù),使角度值控制在180以內(nèi)
*
-------------------------------------------------------------*/
int sin_angle(long angle );
/*-------------------------------------------------------------
* void first(void )
*第一個采樣點計算函數(shù),在K=0時計算
-------------------------------------------------------------*/
void first(void );
/*-------------------------------------------------------------
*定時器0初始化
-------------------------------------------------------------*/
void timer0_init (void);
/*--------------------------------------------------------------------
*PCA中斷服務程序
---------------------------------------------------------------------*/
static void PCA_isr (void); //interrupt PCA_VECTOR using 1
/*-------------------------------------------------------------------
* PCA0初始化
--------------------------------------------------------------------*/
void PCA_init() ;
void pwmwork();
/***********************PWM聲明結(jié)束***********************************/
/*********************************************************************
***************************函數(shù)聲明結(jié)束*******************************
**********************************************************************/
/****************************************************************
*延時子程序,1ms
****************************************************************/
void delay1ms(uint x)
{
uint i;
while(x--) //((11+7*i)*x+5 )T
{ i= 450;
while((i--)>0); //i=141,x=1,t=1003T
}
}
/******************************************************************
* uchar keyscan()
*功能:鍵盤掃描程序
*說明: 4*4鍵盤,無上拉電阻。P0~P3為行輸出,P4~P7為列輸入
*返回值:0x(lie)(hang)
******************************************************************/
uchar getkey (void)
{
static uchar kn;
uchar lie=0,hang,x=0;
//E = 0;
//RS = 0;
scan = 0xf0;
if((scan & 0xf0) !=0xf0)
{ delay1ms(10);
if((scan & 0xf0) !=0xf0)
{ hang = 0xfe;
for(i=0;i<4;i++ )
{ scan = hang;
if((scan & 0xf0) != 0xf0)
{
lie = ~(scan | 0x0f );
switch (lie)
{ case 0x10:kn = *(key_tab + i);break;
case 0x20:kn = *(key_tab+i+4) ;break;
case 0x40:kn = *(key_tab+i+8) ;break;
case 0x80:kn = *(key_tab+i+12) ;break;
default:break;
}
return( kn);
}
else hang = (hang<<1)|0x01;
}
}
}
return(kn);
}
/**********延時子程序*************/
void mdelay(uchar j)
{uint i;
for(;j>0;j--)
{ for(i=0;i<200;i++)
{;}
}
}
/**********判忙子程序*************/
void lcdbusytest()
{
PSD33_reg.DATAOUT_A = 0xff;
// lcdport=0xff;
RS=0;
RW=1;
E=1;
PSD33_reg.DIRECTION_A =0; //PB為輸入模式
do{temp=PSD33_reg.DATAIN_A;} while(busy);
//do{temp=lcdport;}while(busy);
E=0;
PSD33_reg.DIRECTION_A =0xff;
}
/*********寫命令******************/
void writelcdcom(uchar com)
{
lcdbusytest();
RS=0;
RW=0;
E=1;
PSD33_reg.DATAOUT_A = com;
//lcdport=com;
E=0;
}
/**********寫數(shù)據(jù)****************/
void writelcddat(uchar dat)
{
lcdbusytest();
RS=1;
RW=0;
E=1;
PSD33_reg.DATAOUT_A = dat;
//lcdport=dat;
E=0;
}
/***********LCD清屏****************/
void clrlcd()
{writelcdcom(0x01);}
/***********LCD初始化**************/
void init_lcd()
{ mdelay(15);
RS=0;
RW=0;
E=1;
PSD33_reg.DATAOUT_A = 0x38;
// lcdport=0x38;
E=0;
mdelay(5);
RS=0;
RW=0;
E=1;
PSD33_reg.DATAOUT_A = 0x38;
//lcdport=0x38;
E=0;
mdelay(5);
RS=0;
RW=0;
E=1;
PSD33_reg.DATAOUT_A = 0x38;
// lcdport=0x38;
E=0;
writelcdcom(0x38);
writelcdcom(0x08);
clrlcd();
writelcdcom(0x06);
writelcdcom(0x0c);
}
/*********寫一個字符****************/
void printchar(uchar xpos,uchar ypos,uchar str)
{uchar m=0;
switch (ypos)
{ case 0: xpos|=0x80;break;
case 1: xpos|=0xc0;break;
default: break;
}
writelcdcom(xpos);
writelcddat(str);
}
/*********寫字符串函數(shù)*************/
void printstr(uchar xpos,uchar ypos,uchar *str)
{
//uchar n;
uchar m=0;
switch (ypos)
{ case 0: xpos|=0x80;break; //寫入顯示地址要求D7恒為高電平
case 1: xpos|=0xc0;break;
default: break;
}
writelcdcom(xpos); //此處的Xpos已轉(zhuǎn)換為LCM的顯示寄存器實際地址
for(i=0;i<strlen(str);i++)
{
writelcddat(str[m++]);
}
}
/*****************************************************************************
* ADC_EnableAll()
*功能:ADC使能,設(shè)置P1口通道為ADC輸入,選擇ADC時鐘頻率
*參數(shù):無
******************************************************************************/
void ADC_EnableAll(void)
{
ACON = 0; // 關(guān)閉ADC
ADCPS =(0x08 + 1); //使能ADC時鐘,設(shè)置時鐘頻率
_nop_();
_nop_();
P1SFS0 |= 0x07;
P1SFS1 |= 0x07; // 選擇P1口相應位為ADC輸入
ACON = 0x20;
// 使能ADC;Enable ADC
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -