|
功能描述: 此電路板的作用是,模塊供電后,數碼管顯示設定數值,板子有兩個獨立按鍵,客戶可根據需求自定義編程其功能。 可實現的功能:單片機可以自己編程、定時控制、0~10V電壓輸入控制、按鍵控制數碼管顯示。 【簡要說明】
一、 尺寸:長78mmX寬47mmX高24mm
二、 主要芯片:STC單片機
三、 工作電壓:直流6~36V 需要5V的需要特別說明
四、特點:
可編程控制,提供原理圖,例程及相關資料,提供程序源代碼,提供相關資料!客戶可以通過按鍵設置對繼電器進行開關控制,也可以通過編程自由控制!
1、電源指示燈,繼電器吸合指示燈。
2、板子功耗小于1W
3、額定切換電流10A以內,切換電壓250V以內
4、最大切換功率300W
5、繼電器壽命1000000次以上。
6、電器絕緣電阻100M
7、觸電耐壓1000V
8、繼電器最大吸合時間15mS 毫秒
9、繼電器最大釋放時間5mS 毫秒
10、工作溫度-40度至 +70度
11、工作濕度 40% ~ 80%RH
適用場合:遠程通信控制,可編程控制,輸入輸出控制,儀器儀表監控。
單片機源程序如下:
- #include<STC15W408AS.h> //庫文件
- #include<intrins.h>
- #define uchar unsigned char//宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- #define ADC_POWER 0x80 //ADC 電源控制位
- #define ADC_FLAG 0x10 //ADC 轉換結束標志位
- #define ADC_START 0x08 //ADC 開始轉換控制位
- #define ADC_SPEEDLL 0x00 //210 個時鐘周期轉換一次
- #define ADC_SPEEDL 0x20 //420 個時鐘周期轉換一次
- #define ADC_SPEEDH 0x40 //630 個時鐘周期轉換一次
- #define ADC_SPEEDHH 0x60 //840 個時鐘周期轉換一次
- typedef unsigned char INT8U;
- typedef unsigned int INT16U;
- #define ENABLE_ISP 0x82 //系統工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
- #define WD1 0x5a //使用STC11xx系列單片機時,先寫入0x5a,然寫入0xa5
- #define WD2 0xa5
- char IAPAddr=0;
- /********************************************************************
- 初始定義
- *********************************************************************/
- code uchar seg7code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //顯示段碼 數碼管字跟
- /********************************************************************
- I/O定義
- *********************************************************************/
- bit z=0,ba=0,k=0,zs=0;
- uchar y=0,smg2=0,s1=0,s2=0;
- uint s=0,bai=0,shi=0,ge=0,js=0,dat=0,dat1=0;
- sbit aj1=P5^4;
- sbit aj2=P5^5;
- sbit out=P3^4;
- sbit L1=P3^5;//數碼管位控制
- sbit L2=P3^6;//數碼管位控制
- sbit L3=P3^7;//數碼管位控制
- sbit dp=P3^3;//小數點
- bit kt=0,kt_1=0;
- uchar trg=0,trg_1=0,cont=0,cont_1=0;
- uchar ReadData=0,ReadData_1=0;
- /********************************************************************
- E2P函數
- *********************************************************************/
- union union_temp16
- {
- INT16U un_temp16;
- INT8U un_temp8[2];
- }my_unTemp16;
- INT8U Byte_Read(INT16U add); //讀一字節,調用前需打開IAP 功能
- void Byte_Program(INT16U add, INT8U ch); //字節編程,調用前需打開IAP 功能
- void Sector_Erase(INT16U add); //擦除扇區
- void IAP_Disable(); //關閉IAP 功能
- /********************************************************************
- AD轉換初始化程序
- *********************************************************************/
- void InitADC()
- {
- P1ASF = 0x80; //設置P1.7口AD轉換,必須加
- P1M0=0X80;
- P1M1=0X80; //設置P1.7口為開漏模式,使用AD功能
- ADC_RES = 0; //AD數據寄存器清空
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打開AD電源,轉換周期210
- _nop_(); //延時一個機器周期
- _nop_();
- _nop_(); //延時一個機器周期
- }
- /********************************************************************
- AD轉換控制程序
- *********************************************************************/
- uchar ADCRead(uchar px) //轉換輸出的數據 (PX為通道口)
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//開始轉換
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- while (!(ADC_CONTR & ADC_FLAG));//等待轉換結束
- ADC_CONTR &= ~ADC_FLAG; //關閉AD轉換
- return ADC_RES; //返回數據
- }
- /*******************************************************************
- * 讀取按鍵狀態
- ********************************************************************/
- void KeyRead()//讀取按鍵IO口函數
- {
- ReadData = aj1^0xff; // 讀取按鍵狀態取反后賦值給ReadData
- trg = ReadData & (ReadData ^ cont); //trg短按,每按下按鍵trg=1;抬手后為trg=0,長按為trg=0
- cont = ReadData; //cont長按,長按cont=1,抬手后cont=0
- ReadData_1 = aj2^0xff; // 讀取按鍵狀態取反后賦值給ReadData
- trg_1 = ReadData_1 & (ReadData_1 ^ cont_1); //trg短按,每按下按鍵trg=1;抬手后為trg=0,長按為trg=0
- cont_1 = ReadData_1; //cont長按,長按cont=1,抬手后cont=0
- }
- /*******************************************************************
- * 按鍵
- ********************************************************************/
- void key_1()
- {
- if(trg & 0x01) //短按
- {
- kt_1=0;
- kt=1; //這是短按標志位,kt=1說明短按了
- }
- if((aj1!=0)&&(kt==1))//判斷
- {
- z=1; // 選位標志位
- y++; //選位
- out=1;
- if(y==4)
- {
- z=0;
- k=1;
- y=0;
- // s=s1+s2+s3;
- }
- kt=0;
- } // 短按
- }
- void key_2()
- {
- if(trg_1 & 0x01) //短按
- {
- kt=0;
- kt_1=1; //這是短按標志位,kt=1說明短按了
- }
- if((aj2!=0)&&(kt_1==1))//判斷
- {
- if(y==1)
- {
- s1++;
- if(s1>9)
- {
- s1=0;
- }
- }
- if(y==2)
- {
- s2+=10;
- if(s2>90)
- {
- s2=0;
- }
- }
- s=s1+s2;
- kt_1=0;
- } // 短按
- }
- /*******************************************************************
- * 定時器配置
- ********************************************************************/
- void ConfigTimer0(){
- TMOD=0x01;//將定時器0,1都設置為模式1
- TH0=0XFC;//1ms
- TL0=0X66;
- TR0=1;//開啟定時器0
- ET0=1;//開定時器0的中斷
- EA=1;//開總中斷
- }
- /*******************************************************************
- * 顯示
- ********************************************************************/
- void led(uint date)
- {
- bai=date/100;
- shi=date%100/10;
- ge=date%10;
- }
- /*******************************************************************
- * t0定時器
- ********************************************************************/
- void timer0() interrupt 1
- {
- TH0=0XFC;//1ms
- TL0=0X66;
- js++;
- if(js==200){ba=1;js=0;}
-
- if(z==0){
- smg2++;
- }
- else{
- smg2=y;//讓逐個顯示位
- }
- switch(smg2){ //數碼管掃描
- /**************數碼管-開始*****************/
- case 1: P1=seg7code[ge];L3=1;L2=1;L1=0;dp=0;break;//從P2進P0出
- case 2: P1=seg7code[shi];L3=1;L2=0;L1=1;if(zs==0){dp=0;}else{dp=1;}break;
- case 3: P1=seg7code[bai]; L3=0;L2=1;L1=1;dp=0;break;
- /**************數碼管-結束*****************/
- default: smg2=0; L3=1;L2=1;L1=1; break;
- }
- }
- /********************************************************************
- 主函數
- *********************************************************************/
- void main()
- {
- ConfigTimer0(); //定時器初始化
- InitADC(); //AD初始化
- P1M0 = 0xff; //設置強推挽和開漏模式
- P1M1 = 0x80;
- P3M0 = 0x08; //小數點使用
- P3M1 = 0x00;
- if(Byte_Read(0X0001)==0xff){s1=0;s2=0;}//首次讀取,如果讀到0xFF說明沒有存過數據,直接付給00值
- else
- {
- s1=Byte_Read(0X0001);
- s2=Byte_Read(0X0002);
- }
- s2=s2*10;
- s=s2+s1;
- while(1)
- {
- // if(ba==1){dat=((ADCRead(7)*1000)/249);ba=0;}
- if(ba==1){dat=((ADCRead(7)*51)/255);dat1=dat*2;ba=0;} //51是單片機的工作電壓,單片機的工作電壓是多少這個就是多少
- // if(ba==1){dat=ADCRead(7);dat1=dat*100/249;ba=0;}
- if((y==0)&&(z==0)){zs=1;led(dat1);} //zs標志位控制小數點
- if(y==1){zs=0;led(s1);}
- if(y==2){zs=0;led(s2);}
- if(y==3){zs=1;z=0;led(s);}
- if(dat1>s){out=0;}else{out=1;}
- KeyRead(); //按鍵掃描
- key_1();
- key_2();
- if(k==1)
- {
- Sector_Erase(0);
- Byte_Program(0x0001,s1); //寫入扇區
- Byte_Program(0x0002,(s2/10)); //寫入扇區
- k=0;
- }
- }
- }
- //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
- INT8U Byte_Read(INT16U add)
- {
- IAP_DATA = 0x00;
- IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節讀命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- //EA = 0;
- IAP_TRIG = WD1; //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = WD2; //送完WD2 后,ISP/IAP 命令立即被觸發起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- return (IAP_DATA);
- }
- /*********************************************************************************************/
- //字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
- void Byte_Program(INT16U add, INT8U ch)
- {
- IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節編程命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- IAP_DATA = ch; //要編程的數據先送進IAP_DATA 寄存器
- //EA = 0;
- IAP_TRIG = WD1; //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = WD2; //送完WD2 后,ISP/IAP 命令立即被觸發起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- }
- /*********************************************************************************************
- //擦除扇區, 入口:DPTR = 扇區地址 */
- void Sector_Erase(INT16U add)
- {
- IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區擦除命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- //EA = 0;
- IAP_TRIG = WD1; //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = WD2; //送完WD2 后,ISP/IAP 命令立即被觸發起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- }
- /*********************************************************************************************/
- void IAP_Disable()
- {
- //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- IAP_CONTR = 0; //關閉IAP 功能
- IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
- IAP_TRIG = 0; //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
- IAP_ADDRH = 0;
- IAP_ADDRL = 0;
- }
復制代碼 |
-
image004.jpg
(21 KB, 下載次數: 75)
下載附件
2020-10-9 23:23 上傳
-
image006.jpg
(21.69 KB, 下載次數: 77)
下載附件
2020-10-9 23:23 上傳
-
image010.jpg
(38.38 KB, 下載次數: 84)
下載附件
2020-10-9 23:23 上傳
-
image014.jpg
(30.55 KB, 下載次數: 77)
下載附件
2020-10-9 23:23 上傳
-
-
GYJ-0298_0~10V電壓報警模塊開關量干節點輸出測試程序.rar
2020-10-9 23:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
52.1 KB, 下載次數: 24, 下載積分: 黑幣 -5
-
-
GYJ-0298_0~10V電壓報警模塊開關量干節點輸出工程原理圖及PCB圖.pdf
2020-10-9 23:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
402.8 KB, 下載次數: 22, 下載積分: 黑幣 -5
-
-
GYJ-0298_0~10V電壓報警模塊開關量干節點輸出使用手冊.pdf
2020-10-9 23:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.52 MB, 下載次數: 20, 下載積分: 黑幣 -5
|