📄 单相复费率.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; //选择波特率发生器用于产生UART的波特率,禁止使能
//晶振12M通讯速率1200
BRGR1=0x27; //装载高字节
BRGR0=0x00; //装载低字节
//晶振11.0592通讯速率1200
//BRGR1=0x23; //装载高字节
//BRGR0=0xF0; //装载低字节
BRGCON=BRGCON | 0x01; //使能拨特率发生器
DIR=1;
ESR=1; //使能串口中断
}
void InitCpuIo(void)
{
P0M1=0x00;
P0M2=0x38; //设置P0.3、P0.4、P0.5为仅为输入
P1M1=0x2c;
P1M2=0x0c;
P2M1=0x40; //设置P26为开漏
P2M2=0x40;
}
void InitTime0(void)
{
TMOD=TMOD | 0X01; //
TAMOD=TAMOD | 0X00; //定时器工作于模式1
TH0=0X02;
TL0=0X40;
AUXR1=AUXR1 | 0X10; //定时器0中断反转IO口
TR0=0;
ET0=0; //使能中断
}
void InitTime1(void)
{
TMOD=TMOD | 0X10; //
TAMOD=TAMOD | 0X00; //定时器工作于模式1
TH1=0X00;
TL1=0X00;
TR1=1;
ET1=1; //使能中断
}
void InitWDT(void)
{
ACC=WDCON; //看门狗启动,并选择看门狗定时器作为定时
ACC=ACC|0x84;
WDL=0x4E;
WDCON=ACC;
WFEED1=0xA5; //喂狗
WFEED2=0x5A;
}
void InitINT0(void)
{
TCON=TCON | 0X00; //外部中断0采用低电平触发中断
EX0=1; //开启中断
}
void InitINT1(void)
{
TCON=TCON | 0X00; //外部中断1采用低电平触发中断
EX1=1; //使能外部中断
}
void Initkey(void) //初始化键盘中断
{
//KBPATN=0xff; //
KBCON=0x00;
KBMASK=0x38; //设置P0.1->P0.0为中断源
EKBI=1;
}
void InitCclk(void)
{
DIVM=0x00; //CCLK=11059200/2;
}
void InitEEPROM(void)
{
DEECON=0x30;
EIEE=0;
}
void InitPWM() //使用外部12M振荡器时:CCU频率=((12000000/2)/6)*16=16000000MHz
{
TOR2H=0x03; //定时器重装值=CCU频率/红外线载频=16000000/38000=421=0x1a5
TOR2L=0x4a;
OCRAH=0x01; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
OCRAL=0xa4;
TCR21=0x85; //PLL预分频为5+1
CCCRA=1; //非反相的PWM比较匹配时置位,在CCU定时器向下溢出时清0
PLLEN=1; //启动PLL
PWM=1;
while(PLLEN==0);
TCR20=0x82; // 设置输出模式,非反相PWM
}
void InitCMP(void)
{
PT0AD=0x06; //禁止CIN2A上的数字输入功能
CMP2=0x28; //0010 1000,CMP1使能,内部Ref,CIN1A
Delay(10); //延迟10us,以等待比较器稳定
CMP2&=0xFE; //清除比较器中断标志位
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>
//数据发送
void SeriesSend(void)
{
unsigned char data i,CheckSum;
//发送标志有效,开始发送(上位机延时接收)
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;
}
}
//编程密码校验---清零密码校验
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;
}
//接收到的数据减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;
}
}
//数据提取
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;
}
//接收到的数据保存
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];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -