ACS712电流检测与报警模块系统的外观:
ACS712电路原理图:
ACS712单片机源程序如下:
实现功能:检测电流,数码管显示电流值
使用芯片:STC12C2054AD
产品模块编号:kzs1211-75150k (双路输入,继电器单路输出,三个按键,四位数码管模块)
晶振:片内晶振
#include
#include
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
#define FOSC 11059200L
#define BAUD 9600
#define ADC_POWER 0x80 //ADC 电源控制位
#define ADC_FLAG 0x10 //ADC 转换结束标志位
#define ADC_START 0x08 //ADC 开始转换控制位
#define ADC_SPEEDLL 0x00 //1080个时钟周期转换一次
#define ADC_SPEEDL 0x20 //810 个时钟周期转换一次
#define ADC_SPEEDH 0x40 //540个时钟周期转换一次
#define ADC_SPEEDHH 0x60 //270个时钟周期转换一次
sfr ADC_DATA=0xc6; //70个时钟周期转换一次
void display(void); //显示函数
void t_to_dis(uint num);
#define DUAN P2 //P0口控制段
#define WEI P1 //P2口控制位
/********************************************************************
初始定义
*********************************************************************/
//数码管显示段码
code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
//数码管位控制端
sbit wei1=P1^0;
sbit wei2=P1^1;
sbit wei3=P1^2;
sbit wei4=P1^3;
//继电器输出控制端
sbit OUT=P3^7;
//按键输入控制端
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
//两路输入控制端可做ad采样
sbit IN1=P1^6;
sbit IN2=P1^5;
sbit IC=P1^7;
uchar numb[4]; //定义字符串用于数值转换
uint tcnt;
uchar cnt,times,date;
uint ad,ad2;
float ad1;
/********************************************************************
命令定义
*********************************************************************/
#define CMD_IDLE 0 //EEPROM无操作
#define CMD_READ 1 //读取字节
#define CMD_PROGRAM 2 //写入字节
#define CMD_ERASE 3 //擦除字节
/********************************************************************
编程周期由晶振决定
*********************************************************************/
#define ENABLE_IAP 0X83 //编程周期由晶振决定(如果<12MHZ选用此项)
#define IAP_ADDRESS 0X0000 //内部EEPROM地址
/********************************************************************
操作函数
*********************************************************************/
void IapIdle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}
/********************************************************************
读取一个字节函数
*********************************************************************/
uchar IapReadByte(uint addr)
{
uchar dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X46;
IAP_TRIG=0XB9;
_nop_();
_nop_();
_nop_();
dat=IAP_DATA;
IapIdle();
return dat;
}
/********************************************************************
写入一个字节函数
*********************************************************************/
void IapProgramByte(uint addr,uchar dat)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0X46;
IAP_TRIG=0XB9;
_nop_();
_nop_();
_nop_();
IapIdle();
}
/********************************************************************
擦除一个字节函数
*********************************************************************/
void IapEraseSector(uint addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X46;
IAP_TRIG=0XB9;
_nop_();
_nop_();
_nop_();
IapIdle();
}
/********************************************************************
延时函数
*********************************************************************/
void delay(uint x)//延时程序 0.1秒
{
uint m,n,s;
for(m=x;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/********************************************************************
AD转换初始化程序
*********************************************************************/
void InitADC()
{
P1=P1M0|=0xf0;
P1M1=0x00;
ADC_DATA=0; //AD数据寄存器清空
ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START;//打开AD电源,转换周期XX
delay(10); //延时
}
/********************************************************************
AD转换控制程序
*********************************************************************/
uint GetADCResult(uchar px) //转换输出的数据 (PX为通道口)
{
uint t;
ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//开始转换
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
_nop_(); //延时一个机器周期
while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
ADC_CONTR &= ~ADC_FLAG; //关闭AD转换
t=(ADC_DATA<<2)|ADC_LOW2;
return t;
}
/********************************************************************
IO口初始化函数
*********************************************************************/
void init_all(void)
{
P2M1=0;
P2M0=0xff;
P1M1=0x80;
P1M0=0x0f;
P3M1&=0x7f;
P3M0|=0x80;
}
/********************************************************************
定时器T1初始化
*********************************************************************/
void timer0init(void)
{
TMOD=0X01; //设定定时器工作方式
TH0 =(655336-1000)/256;
TL0 =(655336-1000)%256;
ET0=1;
TR0=1;
EA=1;
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
init_all(); //初始化IO
timer0init();//定时器初始化
// InitADC(); //AD初始化
date=IapReadByte(0);
while(1)
{
联系客服