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) {
|
|