基于51单片机的电表电量采集系统程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include //AD7135直接与单片机相连采用查询的方法多路#include

#include

#define uchar u nsigned char

#define uint unsigned int

#define ulong unsigned long

#define ADP2 P2

#define ADP0 P0

#define CD4051 P1

#define fosc 12 // 晶振频率

#define time0 2000 // 定时2000us

#define jishu 1000 // 假设AD输入电压与对应瞬时功率的基数

// 1V对应1000w

uint idata jisuandu; // 临时变量,用于计算电度数

uint idata time0_0; // 临时变量,用于计算定时

sbit STA T7135= P1^7; // 7135的启动端

sbit busy = P2^6; // 7135的忙端

sbit st = P2^5; // 7135的选通端

sbit CS7221 = P1^5; // 7221的片选

sbit DIN7221 = P1^4; // 7221的数据端

sbit CLK7221 = P1^6; // 7221的时钟端

sbit SDA=P3^1; //2416的数据端

sbit SCL=P3^0; //2416的时钟端

//sbit en_24c16=P3^4;

uchar DISPBUF[8]={0,1,2,3,4,5,6,7}; //显示缓冲区

uchar ADBUF[40]=0; //AD缓冲区(万千百十个)*8

uchar TIME[2]=0; //用于定时

uchar BUF[5]=0; //数据处理缓冲区

void delay(uint n); //延时子程序

void Initial7221(void); //MAX7221初始化

void WR7221(uchar addr,uchar Data); //MAX7221写程序

void Max7221Display(uchar *buffer); //MAX7221显示程序

void time2ms(void); //定时器0初始化程序

void time0_int(void); //定时器0中断服务程序

void ICL7135(void); //ICL7135 8路信号AD转换程序

void SA VE(void); //电量存储转电度程序

void start_bit(void); //IIC开始条件

void stop_bit(void); //IIC停止条件

void mast_ack(void); //IIC应答

bit write_8bit(uchar ch); //IIC写8位数据

uchar read24c16(uint address,uchar *shu); //IIC读字节数据

uchar write24c16(uint address,uchar ddata); //IIC写字节数据

uchar page_wr(uint firstw_ad,uint counter,uchar *firstr_ad);//IIC页写uchar page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad);//IIC页读

main()

{ //while(page_wr(0,120,0)==0); //初次使用时清电量数Initial7221(); //初始化7221

Max7221Display(&DISPBUF[0]); //开机默认显示0~7 delay(40); //延时

time2ms(); //启动定时器

while(1)

{

if(TIME[1]%10==0) //5秒时间到

{ ICL7135(); //启动8路AD转换SA VE(); //存储电能

}

}

}

void WR7221(uchar addr,uchar Data) //MAX7221的写子程序{

uchar i;

CS7221 = 0; //片选有效

for (i=0;i<8;i++) //写8位地址

{

CLK7221 = 0; //时钟低

DIN7221 = (addr&(0x80>>i)) ? 1:0; //先发高位依次到低位

_nop_();

_nop_();

CLK7221 = 1; //时钟高上升沿锁数据

_nop_();

_nop_();

}

for (i=0;i<8;i++) //写8位数据

{

CLK7221 = 0; //时钟低

DIN7221 = (Data&(0x80>>i)) ? 1:0; //先发高位依次到低位

_nop_();

_nop_();

CLK7221 = 1; //时钟高上升沿锁数据

_nop_();

_nop_();

}

CS7221 = 1; //片选无效

}

void Initial7221(void) //MAX7221初始化

{

WR7221(0x0A,0x0A); //亮度地址0AH,0x00~0x0F,0x0F最亮

WR7221(0x0B,0x07); //扫描LED个数地址0BH,0x00~0x07,最多扫描8个数码管

WR7221(0x0C,0x01); //工作模式地址0x0C. 0x00:关断;0x01:正常

WR7221(0x09,0xFF); //编码模式地址0x09. 0x00~0xFF:哪一位为1,哪一位就支持编码}

void Max7221Display(uchar *buffer) //MAX7221显示子程序

{

uchar i;

for (i=0;i<8;i++) //MAX7221的8个数码管显示

{

WR7221(i+1,*(buffer+i)); //调MAX7221的写子程序

}

}

void delay(uint n) //延时程序

{

uint i,j;

for (i=0;i

for (j=0;j<1140;j++);

}

void time2ms(void) //T0定时器初始化

{

TMOD=0x01; // T0工作方式1

/* 2ms 定时设置*/

time0_0 = 65536-time0*fosc/12; //计算初值

TH0=(time0_0/256); //装定时器0初值

TL0=(time0_0%256);

TR0=1; //启动定时器0

ET0=1; //打开定时器0中断

EA=1; //打开总中断

}

相关文档
最新文档