ACS712電流檢測與報警模塊系統的外觀:
0.jpg (48.42 KB, 下載次數: 146)
下載附件
2018-3-24 15:47 上傳
ACS712電路原理圖:
0.jpg (47.92 KB, 下載次數: 195)
下載附件
2018-3-24 15:47 上傳
ACS712單片機源程序如下:
- 實現功能:檢測電流,數碼管顯示電流值
- 使用芯片:STC12C2054AD
- 產品模塊編號:kzs1211-75150k (雙路輸入,繼電器單路輸出,三個按鍵,四位數碼管模塊)
- 晶振:片內晶振
- #include<STC12C56.h> //庫文件
- #include <intrins.h>
- #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)
- {
- if(key1==0)
- {
- delay(20);
- if(key1==0)
- {
- while(!key1);
- date++;
- if(date>=25)
- date=25;
- IapEraseSector(0);
- IapProgramByte(0,date);
- }
- }
- if(key2==0)
- {
- delay(20);
- if(key2==0)
- {
- while(!key2);
- date--;
- if(date<=2)
- date=2;
- IapEraseSector(0);
- IapProgramByte(0,date);
- }
- }
- t_to_dis(date); //數值變換
- // ad=GetADCResult(7);
- // if(times>=250)
- // {
- // times=0;
- // ad=ad-2;
- // ad1=(ad*50.0)/1024-25;
- // ad1=ad1*100;
- // t_to_dis(ad1); //數值變換
- // }
- }
- }
- /********************************************************************
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (44.79 KB, 下載次數: 152)
下載附件
2018-3-24 15:57 上傳
所有資料51hei提供下載:
電流報警模塊資料.rar
(2.37 MB, 下載次數: 705)
2018-3-24 11:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|