?? 單相復(fù)費(fèi)率.c
字號:
SeriesBufDptr=0;
LcdRunData=1;
LcdTimeFg=1;
ReverseFgToLcd=0;
ReverseFgToData=0;
PulseParseFg=0;
PowerStA=0x55;
PowerStB=0xaa;
ii=IicByteRead(0xa0,0x00);
if(ii==0xff)
{
ii=IicByteRead(0xa0,0x80);
if(ii==0xbb)
{
ii=IicByteRead(0xa0,0xf0);
if(ii==0xff)
{
IicByteWrite(0xa0,0x00,0xbb);
ii=IicByteRead(0xa0,0x00);
if(ii==0xaa)
{
IicByteWrite(0xa0,0x80,0xaa);
ii=IicByteRead(0xa0,0x80);
if(ii==0xaa)
{
IicByteWrite(0xa0,0xf0,0xaa);
ii=IicByteRead(0xa0,0xf0);
if(ii==0xaa)
{
ClerData();
}
}
}
}
}
}
}
}
使用LPC932制作的一款電表---InitCpu
#include <REG932.H>
#include <define.h>
#include <Stdio.h>
#include <Intrins.h>
//-----***-CPU寄存器以及外圍接口初始化-***-----//
void InitSeries(void)
{
PCON=PCON | 0x30; //SMOD1=0;SMOD0=0;通訊速率不加倍,SCON.7作為UART的SM0位
SCON=SCON | 0xd0; //串口工作在模式3,禁止串口接收
SSTAT=0x60; //串口工作在普通模式
BRGCON=BRGCON | 0x02; //選擇波特率發(fā)生器用于產(chǎn)生UART的波特率,禁止使能
//晶振12M通訊速率1200
BRGR1=0x27; //裝載高字節(jié)
BRGR0=0x00; //裝載低字節(jié)
//晶振11.0592通訊速率1200
//BRGR1=0x23; //裝載高字節(jié)
//BRGR0=0xF0; //裝載低字節(jié)
BRGCON=BRGCON | 0x01; //使能撥特率發(fā)生器
DIR=1;
ESR=1; //使能串口中斷
}
void InitCpuIo(void)
{
P0M1=0x00;
P0M2=0x38; //設(shè)置P0.3、P0.4、P0.5為僅為輸入
P1M1=0x2c;
P1M2=0x0c;
P2M1=0x40; //設(shè)置P26為開漏
P2M2=0x40;
}
void InitTime0(void)
{
TMOD=TMOD | 0X01; //
TAMOD=TAMOD | 0X00; //定時(shí)器工作于模式1
TH0=0X02;
TL0=0X40;
AUXR1=AUXR1 | 0X10; //定時(shí)器0中斷反轉(zhuǎn)IO口
TR0=0;
ET0=0; //使能中斷
}
void InitTime1(void)
{
TMOD=TMOD | 0X10; //
TAMOD=TAMOD | 0X00; //定時(shí)器工作于模式1
TH1=0X00;
TL1=0X00;
TR1=1;
ET1=1; //使能中斷
}
void InitWDT(void)
{
ACC=WDCON; //看門狗啟動,并選擇看門狗定時(shí)器作為定時(shí)
ACC=ACC|0x84;
WDL=0x4E;
WDCON=ACC;
WFEED1=0xA5; //喂狗
WFEED2=0x5A;
}
void InitINT0(void)
{
TCON=TCON | 0X00; //外部中斷0采用低電平觸發(fā)中斷
EX0=1; //開啟中斷
}
void InitINT1(void)
{
TCON=TCON | 0X00; //外部中斷1采用低電平觸發(fā)中斷
EX1=1; //使能外部中斷
}
void Initkey(void) //初始化鍵盤中斷
{
//KBPATN=0xff; //
KBCON=0x00;
KBMASK=0x38; //設(shè)置P0.1->P0.0為中斷源
EKBI=1;
}
void InitCclk(void)
{
DIVM=0x00; //CCLK=11059200/2;
}
void InitEEPROM(void)
{
DEECON=0x30;
EIEE=0;
}
void InitPWM() //使用外部12M振蕩器時(shí):CCU頻率=((12000000/2)/6)*16=16000000MHz
{
TOR2H=0x03; //定時(shí)器重裝值=CCU頻率/紅外線載頻=16000000/38000=421=0x1a5
TOR2L=0x4a;
OCRAH=0x01; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比為50%
OCRAL=0xa4;
TCR21=0x85; //PLL預(yù)分頻為5+1
CCCRA=1; //非反相的PWM比較匹配時(shí)置位,在CCU定時(shí)器向下溢出時(shí)清0
PLLEN=1; //啟動PLL
PWM=1;
while(PLLEN==0);
TCR20=0x82; // 設(shè)置輸出模式,非反相PWM
}
void InitCMP(void)
{
PT0AD=0x06; //禁止CIN2A上的數(shù)字輸入功能
CMP2=0x28; //0010 1000,CMP1使能,內(nèi)部Ref,CIN1A
Delay(10); //延遲10us,以等待比較器穩(wěn)定
CMP2&=0xFE; //清除比較器中斷標(biāo)志位
EC=1; //比較器中斷輸出使能
}
void InitCpu(void)
{
InitWDT();
InitSeries();
InitCpuIo();
InitTime0();
InitTime1();
InitINT0();
InitINT1();
InitCclk();
Initkey();
InitEEPROM();
InitPWM();
InitCMP();
}
使用LPC932制作的一款電表---CmdParse
#include <REG932.H>
#include <Define.h>
#include <Stdio.h>
#include <Intrins.h>
//數(shù)據(jù)發(fā)送
void SeriesSend(void)
{
unsigned char data i,CheckSum;
//發(fā)送標(biāo)志有效,開始發(fā)送(上位機(jī)延時(shí)接收)
if(SeriesSendFg)
{
ComDataBuf[8]=ComDataBuf[8]|0x80;
CheckSum=0;
ComDataBuf[0]=0x68;
for(i=10;i<(ComDataBuf[9]+11);i++)
{
ComDataBuf[i]=ComDataBuf[i]+0x33;
}
for(i=0;i<(ComDataBuf[9]+10);i++)
{
CheckSum=CheckSum+ComDataBuf[i];
}
ComDataBuf[ComDataBuf][9]+10]=CheckSum;
ComDataBuf[ComDataBuf][9]+11]=0x16;
SeriesSentByte(0xfe);
SeriesSentByte(0xfe);
for(i=0;i<ComDataBuf[9]+12;i++)
{
SeriesSentByte(ComDataBuf[i]);
}
SeriesSentByte(0xff);
SeriesSentByte(0xff);
ClerBuf();
SeriesSendFg=0;
SendOverFg=1;
}
}
//編程密碼校驗(yàn)---清零密碼校驗(yàn)
unsigned char SnCheck(void)
{
unsigned char i,j,k,m,n,SnIdA,SnIdB,SnCheckData;
j=0x4c;
k=0x50;
m=13;
SnCheckData=0;
for(i=0;i<3;i++)
{
n=IicByteRead(0xa0,j);
if(ComDataBuf[m]==IicByteRead(0xa0,j))
{
SnIdA=0x55;
}
else
{
SnIdA=0x00;
break;
}
j++;
}
m=13;
for(i=0;i<3;i++)
{
if(ComDataBuf[m]==IicByteRead(0xa0,k))
{
SnIdB=0x55;
}
else
{
SnIdB=0x00;
break;
}
k++;
}
if(SnIdA==0x55)
{
SnCheckData=0x01;
}
else
{
SnCheckData=0;
}
if(SnIdB==0x55)
{
SnCheckData=0x01;
}
return SnCheckData;
}
//接收到的數(shù)據(jù)減0x33
void DataDeal(void)
{
unsigned char i;
CmdParseFg=0;
for(i=10;i<ComDataBuf[9]+10;i++)
{
ComDataBuf[i]=ComDataBuf[i]-0x33;
ComDataBuf[ComDataBuf][9]+10]=ComDataBuf[ComDataBuf][9]+10]-0x33;
}
}
//數(shù)據(jù)提取
void CmdPick(unsigned char Device,unsigned char PickupAdd,unsigned char DataLen,bit MoveBit,unsigned char *value,unsigned char Lend,bit DataForIic,bit BcdChange)
{
unsigned char i,j;
if(DataForIic)
{
if(MoveBit)
{
for(i=12;i<DataLen+12;i++)
{
j=PickupAdd;
ComDataBuf[i]=IicByteRead(Device,j<<4);
PickupAdd++;
}
}
else
{
for(i=12;i<DataLen+12;i++)
{
ComDataBuf[i]=IicByteRead(Device,PickupAdd);
PickupAdd++;
}
}
Lend=DataLen;
}
else
{
if(BcdChange)
{
for(i=12;i<Lend+12;i++)
{
ComDataBuf[i]=HexToBcd(*value);
value++;
}
}
else
{
for(i=12;i<Lend+12;i++)
{
ComDataBuf[i]=*value;
value++;
}
}
}
ComDataBuf[9]=Lend+2;
SeriesSendFg=1;
}
//接收到的數(shù)據(jù)保存
void CmdSave(unsigned char Device,unsigned char PickupAdd,unsigned char SaveAdd,unsigned char DataLen,bit MoveBit)
{
unsigned char i,j,k;
k=SnCheck();
if(k)
{
if(MoveBit)
{
for(i=0;i<DataLen;i++)
{
j=SaveAdd;
IicByteWrite(Device,j<<4,ComDataBuf[PickupAdd+i]);
SaveAdd++;
}
}
else
{
for(i=0;i<DataLen;i++)
{
IicByteWrite(Device,SaveAdd,ComDataBuf[PickupAdd+i]);
SaveAdd++;
}
}
for(i=10;i<14;i++)
{
ComDataBuf[i]=ComDataBuf[i+4];
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -