基于51单片机的电表电量采集系统程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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; //打开总中断 }