7022b.docx
- 文档编号:17810559
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:18
- 大小:18.71KB
7022b.docx
《7022b.docx》由会员分享,可在线阅读,更多相关《7022b.docx(18页珍藏版)》请在冰点文库上搜索。
7022b
ATT7022B
这是匆忙中写的,但是好用,而且读出来的数据十分准确,硬件是鹤仙人搭的,我负责程序,atmega16,iccavr编译环境,密码是应付公事儿的,eeprom也是,主要是希望SPI通信模块与校准模块可以给您带来帮助,在这里共享了!
代码不是很优化,新手,时间紧迫,请原谅。
#include
#include
#include
///////////////////头文件包含/////////////////////
//////////////////////////////////////////////////
#defineucharunsignedchar
#defineuintunsignedint
/////////////////////////////////////////////////
uchar table[]={"welcometouse 李润华 制作者:
张鹤pleasewait......... "};
uchar tablea[]={"校正中...... pleasewait "};
uchar tableb[]={"校正完毕 pleasechoose "};
uchar tablec[]={"测量中...... pleasewait "};
uchar tabled[]={"测量完毕 pleasechoose "};
uchar tablen[]={"pleaseinsertyourpassword "};
voiddelay(uintms)//通用延时函数,8M外部晶振下,延时nms
{
uinti,j;
for(i=0;i { for(j=0;j<1141;j++); } } ///////////////下面是用于128*64液晶显示的子程序/////////////// #defineRS(1<<4) #defineRW(1<<5) #defineEN(1<<6) voids_ms(uintms)//用于液晶的延时函数 { for(;ms>1;ms--); } //写数据 voidWriteDataLCM(unsignedcharWDLCM) { s_ms(100); PORTA|=RS; //RS=1 s_ms(100); PORTA&=~RW; //RW=0 s_ms(100); PORTA|=EN; //EN=1 s_ms(100); PORTB=WDLCM; //输出数据 s_ms(100); PORTA&=~EN; //EN=0 s_ms(100); } //写指令 voidWriteCommandLCM(unsignedcharWCLCM) { s_ms(100); PORTA&=~RS; //RS=0 s_ms(100); PORTA&=~RW; //RW=0 s_ms(100); PORTA|=EN; //EN=1 s_ms(100); PORTB=WCLCM; //输出指令 s_ms(100); PORTA&=~EN; //EN=0 s_ms(100); } voidLCMInit(void)//液晶初始化 { DDRB=0XFF; DDRA=0XFF;//数据口于液晶控制口配置为输出 WriteCommandLCM(0x38); //三次显示模式设置,不检测忙信号 s_ms(1000); WriteCommandLCM(0x38); s_ms(1000); WriteCommandLCM(0x38); s_ms(1000); WriteCommandLCM(0x38); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08); //关闭显示 WriteCommandLCM(0x01); //显示清屏 WriteCommandLCM(0x06); //显示光标移动设置 WriteCommandLCM(0x0C); //显示开及光标设置 } voidsz(unsignedlongintsz,charadress,chari)//指定地址并且显示八位数字 { charj; charshuma[8]; shuma[0]=sz%10;//最低位 shuma[1]=sz/10%10; shuma[2]=sz/10/10%10; shuma[3]=sz/10/10/10%10; shuma[4]=sz/10/10/10/10%10; shuma[5]=sz/10/10/10/10/10%10; shuma[6]=sz/10/10/10/10/10/10%10; shuma[7]=sz/10/10/10/10/10/10/10%10;//最高位 WriteCommandLCM(adress);//写入数据显示地址 delay (1); for(j=8;j--;j>=0) { if(j==(i-1)) { WriteDataLCM(0x2e); delay (1); } WriteDataLCM(0X30+shuma[j]); //delay (1); } } ///////////////液晶显示函数结束/////////////////////// ///////////////矩阵键盘扫描检测函数/////////////////// /////由于硬键盘接口接上软键盘后不能用,矩阵按键子程序重新编写,无消抖检测/////// ucharkey_value() { ucharkey; chartem1,tem2,rem,i; rem=0; //不清零会返回一个不可预知的值 DDRD=0x0f; //D口高四位输出低四位输入 PORTD=0xf0; //输入有上拉电阻输出低电平 s_ms (1); tem1=PIND; //读取端口D tem1=tem1&0xf0; if(tem1! =0xf0) //判断是否有键被按下 { s_ms(200); //延时 tem2=PIND; //读取端口D tem2=tem2&0xf0; if(tem1==tem2) //判断是否为干扰 { DDRD=0xf0; //D口高四位输入低四位输出 PORTD=0x0f; //反相输出 s_ms(50); //换向后要延时 rem=PIND; //读取端口D rem=rem&0x0f; //取高四位 rem=rem+tem1; //合并 rem=~rem; //反向输出 } } key=rem; switch(key) { case0x11: key=0x01;break; case0x12: key=0x02;break; case0x14: key=0x03;break; case0x18: key=0x04;break; case0x21: key=0x05;break; case0x22: key=0x06;break; case0x24: key=0x07;break; case0x28: key=0x08;break; case0x41: key=0x09;break; case0x42: key=0x0a;break; case0x44: key=0x0b;break; case0x48: key=0x0c;break; case0x81: key=0x0d;break; case0x82: key=0x0e;break; case0x84: key=0x0f;break; case0x88: key=0x10;break; default: key=16; } returnkey; } ////////////矩阵键盘扫描检测函数结束/////////////// unsignedlongintreadatt7022(ucharcom) { unsignedlongintdata=0; uchari,h; DDRC|=0xff;//PC0PC1PC2口设置为输出 DDRC&=~BIT(3);//pc3口配置为输入,获取芯片中的数据 PORTC|=BIT(0);//cs=1; PORTC&=~BIT (1);//sclk=0; PORTC&=~BIT(0);//cs=0; delay (1); for(i=0;i<8;i++) { PORTC|=BIT (1); if((com&0x80)) PORTC|=BIT (2);//PC2置位 else PORTC&=~BIT (2);//PC2清零 com<<=1; PORTC&=~BIT (1); } delay(3); for(i=0;i<=23;i++) { PORTC|=BIT (1); delay (1); PORTC&=~BIT (1); delay (1); if((PINC&0X08)) h=1; else h=0; data=(data<<1)|h; delay (1); } PORTC|=BIT(0); returndata; }//读数据程序完成 voidwriteatt7022(ucharcom,unsignedlongdata) { uchari; DDRC|=0x07;//PC0PC1PC2口设置为输出 DDRC&=~BIT(3);//pc3口配置为输入,获取芯片中的数据 PORTC|=BIT(0); delay (1); PORTC&=~BIT (1); delay (1); PORTC&=~BIT(0); delay (2); PORTC|=BIT (1); delay (2); if(com&0x80) PORTC|=BIT (2); else PORTC&=~BIT (2); com<<=1; delay (1); PORTC&=~BIT (1); delay(3); //写入地址 for(i=0;i<7;i++) { PORTC|=BIT (1); delay (1); if(com&0x80) PORTC|=BIT (2); else PORTC&=~BIT (2); com<<=1; delay (1); PORTC&=~BIT (1); delay (2); } delay(4); //写入数据 for(i=0;i<=23;i++) { PORTC|=BIT (1); delay (1); if(data&0x00800000) PORTC|=BIT (2); else PORTC&=~BIT (2); data<<=1; delay (1); PORTC&=~BIT (1); delay (2); } delay(3); PORTC|=BIT(0); delay (1); }//写程序完成 /////////////单片机与ATT7022的SPI通信程序结束////////////////////////////////// ///////////////////////////////校正子程序/////////////////////////////// voidcheck() { uchari; DDRC&=~BIT(4); PORTC&=~BIT(4);//reset信号置零 delay (1);//延时1ms(>2us).复位 PORTC|=BIT(4);//复位结束reset接口重新拉高 delay(1000);//延时1m,等待AT7022正常工作 writeatt7022(0xc3,0x000000); //清校表数据 writeatt7022(0xc9,0x000000); //校表数据写使能 //----------------------------------- //5760000000*0.648*0.648*0.5*0.1/(220*1.5*3200)=34=22H writeatt7022(0x20,0x000022); //脉冲常数3200(默认值) //------------------------- writeatt7022(0x1E,0x000000); //单点补偿比差补偿区域设置 //------------------------------------------ writeatt7022(0x02,0x000000); //相位补偿区域设置1 writeatt7022(0x03,0x000000); //相位补偿区域设置2 writeatt7022(0x04,0x000000); //相位补偿区域设置3 writeatt7022(0x05,0x000000); //相位补偿区域设置4 NOP(); //------------------设置合相能量累加模式 writeatt7022(0x2A,0x000000); //-------------------------- writeatt7022(0x86,12293737); //A相功率增益0 pa writeatt7022(0x89,12293737); //A相功率增益1 //------------------------- writeatt7022(0x87,9277740); //B相功率增益0 pb writeatt7022(0x8A,9277740); //B相功率增益1 //------------------------- writeatt7022(0x88,9438312); //C相功率增益0 pc writeatt7022(0x8B,9538312); //C相功率增益1 //------------------------- writeatt7022(0x0C,0); //A相区域0相位校正 writeatt7022(0x0D,0); //A相区域1相位校正 writeatt7022(0x0E,0); //A相区域2相位校正 writeatt7022(0x0F,0); //A相区域3相位校正 writeatt7022(0x10,0); //A相区域4相位校正 //------------------------- writeatt7022(0x11,0); //B相区域0相位校正 writeatt7022(0x12,0); //B相区域1相位校正 writeatt7022(0x13,0); //B相区域2相位校正 writeatt7022(0x14,0); //B相区域3相位校正 writeatt7022(0x15,0); //B相区域4相位校正 //------------------------- writeatt7022(0x16,0); //C相区域0相位校正 writeatt7022(0x17,0); //C相区域1相位校正 writeatt7022(0x18,0); //C相区域2相位校正 writeatt7022(0x19,0); //C相区域3相位校正 writeatt7022(0x1A,0); //C相区域4相位校正 //------------------------- writeatt7022(0x9B,15689803); //A相电压校正 //------------------------- writeatt7022(0x9C,1006951); //B相电压校正 //------------------------- writeatt7022(0x9D,71697); //C相电压校正,x //------------------------- writeatt7022(0xa6,8880843); //A相电流校正 //------------------------- writeatt7022(0xa7,8476057); //B相电流校正 //------------------------- writeatt7022(0xa8,8503241); //C相电流校正 //------------------------- writeatt7022(0x2c,0x000003); //温度/第七路ADC选择控制 writeatt7022(0xb0,0x5678);//电流相序检测时能 writeatt7022(0xae,0x3584); //------------------关闭写校表使能 writeatt7022(0xc9,0x000001); //---------------读电参数使能 writeatt7022(0xc6,0x000011); } voidmain() { ucharflag,i,skey; unsignedlonginta,b,c; uchard=0,e=0,f=0,h=0; LCMInit();//LCD初始化 WriteCommandLCM(0x08); WriteCommandLCM(80); WriteCommandLCM(0x06); WriteCommandLCM(0x0C); WriteCommandLCM(0x80); for(i=0;i<=64;i++) { WriteDataLCM(table[i]); } delay(1000); WriteCommandLCM(0x01); //显示清屏 WriteCommandLCM(0x80); for(i=0;i<=64;i++) { WriteDataLCM(tablen[i]); } while(! ((d==1)&&(e==2)&&(f==3))) { h=key_value(); if(h==1) d=1; if(h==2) e=2; if(h==3) f=3; } WriteCommandLCM(0x01); //显示清屏 DDRC|=BIT(4); PORTC&=~BIT(4);//复位ATT7022b delay (1);//延时一段时间,等待复位完成 PORTC|=BIT(4);//复位引脚重新拉高 delay (1);//延时一毫秒,芯片开始正常工作 WriteCommandLCM(0x01); //显示清屏 //写入12864液晶屏上应该写入的数据及文字 WriteCommandLCM(0x08); WriteCommandLCM(80); WriteCommandLCM(0x06); WriteCommandLCM(0x0C); WriteCommandLCM(0x80); for(i=0;i<=64;i++) { WriteDataLCM(tablea[i]); } delay(1000); check(); WriteCommandLCM(0x01); //显示清屏 WriteCommandLCM(0x08); WriteCommandLCM(80); WriteCommandLCM(0x06); WriteCommandLCM(0x0C); WriteCommandLCM(0x80); for(i=0;i<=64;i++) { WriteDataLCM(tableb[i]); } delay(1000); WriteCommandLCM(0x01); //显示清屏 while (1) { skey=key_value(); if(skey==16) flag=flag; else flag=skey; if(flag==1) { //delay (1); a=readatt7022(0x10); a=(unsignedlongint)((a/(8192.0))*10000);//电流电压有效值转换 sz(a,0x80,4);//A相电流 //delay (1); b=readatt7022(0x11); //SJZH(0x90,1,b); b=(unsignedlongint)((b/(8192.0))*10000); sz(b,0x90,4);//B相电流 //delay (1); c=readatt7022(0x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 7022