完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
代码没有问题,只是有测量误差,还有再调试!!
#include "stc15f2k60s2.h" #include #define uchar unsigned char #define uint unsigned int /************* 12864LCD引脚定义 *************/ #define LCD_data P7 //数据口 ***it LCD_RS = P4^4; //寄存器选择输入 ***it LCD_RW = P4^3; //液晶读/写控制 ***it LCD_EN = P4^2; //液晶使能控制 ***it LCD_PSB = P4^6; //串/并方式控制 ***it LCD_RST = P4^1; //液晶复位端口 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; /*********************************************************/ uchar code DIS1[] = {" 测量市电 "}; uchar code DIS2[] = {" STC15W4K56S4 "}; uchar code DIS3[] = {" LXXCJ "}; unsigned char code asc[] = "0123456789"; unsigned char buf_U[3]; uchar a,flag,Vo; uchar r[3]={0x00,0x00,0x00}; int e; /****************************************************************** 接口定义 ******************************************************************/ ***it SDO=P0^5; ***it INT=P0^4; ***it SCLK=P0^7; ***it SDI=P0^6; ***it CS=P0^3; ***it RESET=P0^2; void IO_init(void) { 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; } /*******************************************************************/ /* */ /* 延时函数 */ /* */ /*******************************************************************/ void delay(uint ms) { while(ms--) { uint i; for(i=0;i<350;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } /****************************************************************** CS5463串口初始化 ******************************************************************/ void handshake(void) { uchar l; RESET=1; delay(5); RESET=0; delay(5); RESET=1; delay(5); SDI=0; SCLK=0; CS=0; delay(5); SDI=1; for(l=0;l<32;l++) { delay(10); SCLK=1; delay(10); SCLK=0; delay(10); } SDI=0; delay(10); SCLK=1; delay(10); SCLK=0; delay(10); } /****************************************************************** 从CS5463读取一字节数据 ******************************************************************/ read_byte() { uchar dat,m; SDI=1; // Set SDI when not in use dat=0; for(m=0;m<8;m++) { SCLK=1; delay(10); dat<<=1; if(SDO) {dat|=0x01;} else {dat|=0x00;} SCLK=0; delay(10); } return(dat); } /****************************************************************** 向CS5463写入一字节数据 ******************************************************************/ void write_byte(uchar BYTE) { uchar ctrl,n; SCLK=0; ctrl=0x80; for(n=0;n<8;n++) { if((BYTE&ctrl)==ctrl) {SDI=1;} else {SDI=0;} SCLK=1; delay(10); SCLK=0; delay(10); ctrl>>=1; } SDI=1; } /****************************************************************** 读CS5463寄存器的值 ******************************************************************/ void read_register(uchar command,void *dd) { uchar *ch; ch=(uchar *)dd; write_byte(command); ch[0]=read_byte(); // high ch[1]=read_byte(); // mid ch[2]=read_byte(); // low } /****************************************************************** 向CS5463写入数据 ******************************************************************/ void write_to_register(unsigned char command,unsigned char high,unsigned char mid,unsigned char low) { write_byte(command); write_byte(high); write_byte(mid); write_byte(low); } /****************************************************************** 串口初始化函数 ******************************************************************/ void com_init() { TMOD=0x01; TH0=(65536-40000)/256; TL0=(65536-40000)%256; EA=1; ET0=1; TR0=1; } /*************************************************************** *电压有效值采集函数 **************************************************************/ float get_VRMS(unsigned char cs5460_command) { unsigned char j,i; float VRMS; float G=1.0/2.0,temp=0.0; //Wait_DRDY_High(); read_register(cs5460_command,(void*)r); buf_U[0] = r[0]; buf_U[1] = r[1]; buf_U[2] = r[2]; for(i=0;i<3;i++) { for(j=0;j<8;j++) { if(buf_U[i]&0x80) temp+=G; G=G/2.0; buf_U[i]<<=1; } } //VRMS = 536.59*temp+1.50; VRMS = (22.831*temp-1.206)*44.0; return(VRMS); } /*************************************************************** *有功功率采集函数 **************************************************************/ float get_PW(unsigned char cs5460_command) { unsigned char buf_PW[3]; unsigned char j,i; float PW; float G=1.0/2.0,temp=0.0; read_register(cs5460_command,(void*)r); buf_PW[0] = 0x01; buf_PW[1] = 0x01; buf_PW[2] = 0x01; for(i=0;i<3;i++) { for(j=0;j<8;j++) { if(buf_PW[i]&0x80) temp+=G; G=G/2.0; buf_PW[i]<<=1; } } PW = 10000.0*temp; return(PW); } /*电流有效值采集函数 *********************************************************************/ unsigned int get_IRMS(unsigned char cs5460_command) { unsigned char buf_I[3]; unsigned char j,i; float IRMS; unsigned int II_RMS_INT; float G=1.0/2.0,temp=0.0; read_register(cs5460_command,(void*)r); buf_I[0] = r[0]; buf_I[1] = r[1]; buf_I[2] = r[2]; for(i=0;i<3;i++) { for(j=0;j<8;j++) { if(buf_I[i]&0x80) temp+=G; G=G/2.0; buf_I[i]<<=1; } } IRMS = 11.9402*temp+0.0586; II_RMS_INT=(unsigned int)(temp*10000.0); // IRMS = 11.9402*temp+0.0586; IRMS = 0.0464*((float)temp)-0.0114; return(II_RMS_INT); } /*******************************************************************/ /* */ /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */ /* */ /*******************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(LCD_data&0x80); LCD_EN = 0; return(result); } /*******************************************************************/ /* */ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /* */ /*******************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); LCD_data = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /* */ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /* */ /*******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; LCD_data = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /* */ /* LCD初始化设定 */ /* */ /*******************************************************************/ void lcd_init() { LCD_PSB = 1; //并口方式 LCD_RST = 0; //液晶复位 delay(300); LCD_RST = 1; delay(30); lcd_wcmd(0x34); //扩充指令操作 delay(1); lcd_wcmd(0x30); //基本指令操作 delay(5); lcd_wcmd(0x0C); //显示开,关光标 delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1); } /*********************************************************/ /* */ /* 设定显示位置 */ /* */ /*********************************************************/ void lcd_pos(uchar X,uchar Y) { uchar pos; if (X==1) {X=0x80;} else if (X==2) {X=0x90;} else if (X==3) {X=0x88;} else if (X==4) {X=0x98;} pos = X+Y ; lcd_wcmd(pos); //显示地址 } main() { uchar i; delay(100); //上电,等待稳定 IO_init(); //真对 IAP15W4K61S4 IO口初始化 //对灯和蜂鸣器进行测试 ////////////////////// lcd_init(); //初始化LCD com_init(); handshake(); while(1) { P45= ~P45; delay(6); delay(20); write_to_register(0x5e,0x80,0x00,0x00); delay(80); write_to_register(0x40,0x01,0x00,0x01); delay(80); write_to_register(0x4A,0x00,0x0f,0xa0); delay(80); write_to_register(0x74,0x00,0x00,0x00); delay(80); write_to_register(0x64,0x00,0x00,0x01); delay(80); write_byte(0xe8); // Wait_DRDY_High(); Vo=(int)get_VRMS(0x18); lcd_pos(2,0); lcd_wdat(asc[Vo/100]); delay(1); lcd_wdat(asc[Vo%100/10]); delay(1); lcd_wdat(asc[Vo%10]); Vo=(int)get_IRMS(0x16); lcd_pos(3,0); lcd_wdat(asc[Vo/10000]); delay(1); lcd_wdat(asc[Vo%10000/1000]); delay(1); lcd_wdat(asc[Vo%1000/100]); delay(1); lcd_wdat(asc[Vo%100/10]); delay(1); lcd_wdat(asc[Vo%10]); Vo=(int)get_PW(0x14); lcd_pos(4,0); lcd_wdat(asc[Vo/10000]); delay(1); lcd_wdat(asc[Vo%10000/1000]); delay(1); lcd_wdat(asc[Vo%1000/100]); delay(1); lcd_wdat(asc[Vo%100/10]); delay(1); lcd_wdat(asc[Vo%10]); } } void srei() interrupt 1 //定时器 0 { TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; e++; if(e==20) { e=0; } } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2076 浏览 1 评论
3486 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2329 浏览 2 评论
2754 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4012 浏览 5 评论
956浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6343浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 09:03 , Processed in 0.696576 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号