|
#include <reg52.h>
#include "intrins.h"
sfr AUXR = 0x8E; //0000,0000 輔助寄存器
sfr T2H = 0xD6; //0000,0000 T2高字節(jié)
sfr T2L = 0xD7; //0000,0000 T2低字節(jié)
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr P7 = 0xF8;
//PWM模塊寄存器定義
sfr P_SW1 = 0xA2; //外設(shè)功能切換寄存器1 針腳選擇功能寄存器
#define CCP_S0 0x10 //P_SW1.4 選擇針腳功能
#define CCP_S1 0x20 //P_SW1.5 選擇針腳功能
#define S1_S1 0x80 //P_SW3.6 選擇針腳功能
#define S1_S0 0x40 //P_SW3.7 選擇針腳功能
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位結(jié)果
sfr ADC_LOW2 = 0xBE; //ADC低2位結(jié)果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標(biāo)志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個時鐘
#define ADC_SPEEDL 0x20 //360個時鐘
#define ADC_SPEEDH 0x40 //180個時鐘
#define ADC_SPEEDHH 0x60 //90個時鐘
sfr CCON = 0xD8; //PCA控制寄存器
sbit CCF0 = CCON^0; //PCA模塊0中斷標(biāo)志
sbit CCF1 = CCON^1; //PCA模塊1中斷標(biāo)志
sbit CR = CCON^6; //PCA定時器運(yùn)行控制位
sbit CF = CCON^7; //PCA定時器溢出標(biāo)志
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CL = 0xE9; //PCA定時器低字節(jié)
sfr CH = 0xF9; //PCA定時器高字節(jié)
sfr CCAPM0 = 0xDA; //PCA模塊0模式寄存器
sfr CCAP0L = 0xEA; //PCA模塊0捕獲寄存器 LOW
sfr CCAP0H = 0xFA; //PCA模塊0捕獲寄存器 HIGH
sfr CCAPM1 = 0xDB; //PCA模塊1模式寄存器
sfr CCAP1L = 0xEB; //PCA模塊1捕獲寄存器 LOW
sfr CCAP1H = 0xFB; //PCA模塊1捕獲寄存器 HIGH
sfr CCAPM2 = 0xDC; //PCA模塊2模式寄存器
sfr CCAP2L = 0xEC; //PCA模塊2捕獲寄存器 LOW
sfr CCAP2H = 0xFC; //PCA模塊2捕獲寄存器 HIGH
sfr PCA_PWM0 = 0xf2; //PCA模塊0的PWM寄存器
sfr PCA_PWM1 = 0xf3; //PCA模塊1的PWM寄存器
sfr PCA_PWM2 = 0xf4; //PCA模塊2的PWM寄存器
///////////////////////////////////////////////////////////函數(shù)列表、、、、、、、、、、、、、、、、、、、、、、、、、、、
void Timer0Init(); //初始化T0
void pwm(); //解析接受到的數(shù)據(jù)
void Delay(unsigned int n); //軟件延時 1.6毫秒左右
///////////////////////////////////////////////////////////定義的一些變量、、、、、、、、、、、、、、、、、、、、、、、、、、、
bit flagTxd = 0; //單字節(jié)發(fā)送完成標(biāo)志,用來替代 TXD 中斷標(biāo)志位
sbit s1 = P3^3; //切換繼電器
sbit km = P3^2; //功率繼電器接觸器
sbit pwmdip = P1^1;
sbit k1 = P3^0; //按鈕
sbit PCA_LED = P1^2;
unsigned char cntRxd = 0; //接收字節(jié)計數(shù)器
unsigned char pdata bufRxd[30]; //接收字節(jié)緩沖區(qū)
unsigned char code bufWxd[8] ={0x01,0x03,0x00,0x48,0x00,0x0A,0x45,0xDB,};//發(fā)送的數(shù)據(jù) 增加了code關(guān)鍵字,此數(shù)組寫在程序區(qū)減少使用內(nèi)部內(nèi)存128K
unsigned long pdata cnt = 0; //毫秒計數(shù)
//unsigned long pdata sec; //秒計數(shù)
//unsigned cha *but;// 發(fā)送指針
unsigned int pdata vcc; // 電壓
unsigned int pdata vci; // 電流
unsigned int pdata power; // 功率
unsigned long pdata kwh=0; // 電能
unsigned long pdata kwh1; // 初始電能
unsigned char pw; //設(shè)定的空占比%
unsigned int value; // 電壓
unsigned char cp; //充電樁PWM波形 cp電壓采集信號 120
//// 關(guān)于LCD 1602 /////////////////LCD的一些定義
sfr P5 = 0xC8;
unsigned char pdata lcd1[16]; //LCD第一行
unsigned char pdata lcd2[16]; //LCD第二行
sbit LCD1602_RS = P5^5; //命令、數(shù)據(jù)選擇 H\L
sbit LCD1602_E = P5^4; //使能
unsigned char pdata ki; //電流顯示1表示16A 2表示32A
#define LEDDATA P7 //定義P1口為數(shù)據(jù)端
#define T100Hz 256
void LcdWriteCom(unsigned char com); /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/
void LcdWriteData(unsigned char dat); /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/
void LcdInit(); /*LCD1602初始化子程序*/
void lcd1602(); //1602顯示刷新
void Lcd1602_Delay5ms();
void Lcd1602_Delay1ms();
void main(){
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
P_SW1=P_SW1|S1_S0;
EA = 1; //使能總中斷
pwm(); //初始化pwm模塊設(shè)置
Timer0Init(); //初始化T0
while (1){
}
}
void pwm(){ //PWM程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ACC = P_SW1; //累加器 等于外設(shè)寄存器
ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2) 讀取累加器的值寫進(jìn)外設(shè)寄存器
CCON = 0; //初始化PCA控制寄存器
//PCA定時器停止
//清除CF標(biāo)志
//清除模塊中斷標(biāo)志
CL = 0; //復(fù)位PCA寄存器
CH = 0;
CMOD = 0x04;
PCA_PWM0 = 0x00; //PCA模塊0工作于8位PWM
CCAP0H = CCAP0L =255-255*60/100; //PWM0的占空比為87.5% ((100H-20H)/100H) 255-255*設(shè)定空占比 /100
CCAPM0 = 0x42; //00101010 PCA模塊0允許比較功能 使用CCP0腳為可調(diào)脈沖輸出 P1.1
}
void Timer0Init() //T0作為PWM頻率基準(zhǔn)發(fā)生
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設(shè)置定時器模式
TL0 = 0xd5; //設(shè)置定時初值 計算方法,65536-晶振/(256*需要頻率)
TH0 = 0xFf; //設(shè)置定時初值
TR0 = 1; //定時器0開始計時
ET0 =0; // 禁止T0中斷
TF0 = 0; //清除TF0標(biāo)志
// EA =0; 關(guān)閉總總中斷
CR = 1;
} //PCA定時器開始工作
|
|