電路原理圖如下:
功能描述: 此工業(yè)級板的作用是,模塊供電后,數(shù)碼管顯示設(shè)定數(shù)值,板子有兩個獨立按鍵,客戶可根據(jù)需求自定義編程其功能。 可實現(xiàn)的功能:定時輸出控制、計數(shù)器技術(shù)控制、0~5V模擬量輸入控制、按鍵控制數(shù)碼管顯示、開關(guān)量輸入控制。 【簡要說明】 一、板子尺寸:長72mmX寬42mmX高18mm
二、主要器件:STC12C2052AD單片機、數(shù)碼管、繼電器
三、工作電壓:有6V至24V
四、板子功耗:小于150mA
五、特點:
1、具有繼電器輸出信號指示功能。
2、供電即可工作,具有電源指示燈。
3、多種工作模式。
4、如果您會單片機,可以根據(jù)自己需要,任意編程,我們可提供參考程序和相關(guān)資料。
5、兩個按鍵任意調(diào)節(jié)和編程功能。
6、繼電器吸合時間10ms 釋放時間15ms。
7、可以和72MM卡槽板配合安裝在DIN導(dǎo)軌上。
8、繼電器觸點干接點輸出,可以控制交流或者直流250V以內(nèi)任何負載。 9、端子采用螺旋壓接端子
10、工作溫度-40度至 +70度 11、工作濕度 10% ~ 80%RH 12、四周有4個固定安裝孔
13、具有電磁抗干擾能力 14、板子穩(wěn)定工作可靠
設(shè)定值控制0~100具有上下限值設(shè)定共陰數(shù)碼管 - 氣體傳感器單片機源程序如下:
- #include<STC12C2052AD.h> //庫文件
- #include<intrins.h>
- #define uchar unsigned char //宏定義字符型變量
- #define uint unsigned int //宏定義整型變量
- /****************************模擬量開始*********************************************/
- /*聲明 SFR 相關(guān) 與 的 IAP*/
- sfr IAP_DATA = 0xE2;
- sfr IAP_ADDRH = 0xE3;
- sfr IAP_ADDRL = 0xE4;
- sfr IAP_CMD = 0xE5;
- sfr IAP_TRIG = 0xE6;
- sfr IAP_CONTR = 0xE7;
- #define ADC_POWER 0x80 //ADC 電源控制位
- #define ADC_FLAG 0x10 //ADC 轉(zhuǎn)換結(jié)束標志位
- #define ADC_START 0x08 //ADC 開始轉(zhuǎn)換控制位
- #define ADC_SPEEDLL 0x00 //210 個時鐘周期轉(zhuǎn)換一次
- #define ADC_SPEEDL 0x20 //420 個時鐘周期轉(zhuǎn)換一次
- #define ADC_SPEEDH 0x40 //630 個時鐘周期轉(zhuǎn)換一次
- #define ADC_SPEEDHH 0x60 //840 個時鐘周期轉(zhuǎn)換一次
- /******************************模擬量結(jié)束*******************************************/
- /********************************************************************
- 定義 ISP/IAP/EEPROM 命令
- *********************************************************************/
- #define CMD_IDLE 0jm
- #define CMD_READ 1
- #define CMD_PROGRAM 2
- #define CMD_ERASE 3
- #define ENABLE_IAP 0x83//SYSCLK<12MH
- #define IAP_ADDRESS 0x0000 //存儲地址
- void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態(tài)
- uchar IapReadByte(uint addr);//讀數(shù)據(jù)
- void IapProgramByte(uint addr, uchar dat);//寫數(shù)據(jù)
- void IapEraseSector(uint addr);//擦除數(shù)據(jù)
- sbit P10=P1^0;//數(shù)碼管段
- sbit P11=P1^1;//數(shù)碼管段
- sbit P12=P1^2;//數(shù)碼管段
- sbit P13=P1^3;//數(shù)碼管段
- sbit P14=P1^4;//數(shù)碼管段
- sbit P15=P1^5;//數(shù)碼管段
- sbit P16=P1^6;//數(shù)碼管段
- sbit P32=P3^2;//數(shù)碼管位
- sbit P33=P3^3;//數(shù)碼管位
- sbit P35=P3^5;//數(shù)碼管位
- sbit AIN1=P1^7;//AD信號輸入
- sbit key1=P3^0;//按鍵輸入
- sbit key2=P3^1;//按鍵輸入
- sbit OUT=P3^7; //繼電器輸出
- static uchar presstime=0;//用于延時
- uint tcnt1=0;//用于刷新數(shù)碼管
- uint bainum1,shinum1,genum1;//數(shù)碼管上顯示
- uint bainum11=0,shinum11=0,genum11=0,shinum12=0,genum12=0;//用于傳到數(shù)碼管上顯示
- uint kf0=1,if0=0;//按鍵用的標志位
- uint kt0=0;//按鍵用的標志位
- uint keynum=0;//數(shù)碼管的位
- uint datas=0;
- bit flag_eeprom1=1;//掉電存儲的標志位
- uint inum1=0;//觸發(fā)端子用的計數(shù)
- uchar inum11=0,inum12=0;//掉電存儲
- uint ad=0,ad1=0;
- code uchar seg7code[13]={0x84,0xf6,0x8a,0xa2,0xf0,0xa1,0x81,0xb6,0x80,0xa0,0x6f,0x3e,0x72}; //顯示段碼 數(shù)碼管字跟
- extern void p31s();//將p3口的235置為1
- uint GetADCResult(uchar px);
- uint meanval1,meanval2;//平均值
- void InitADC();
- void keycan();
- void keyflag();//按鍵結(jié)束調(diào)用
- void displaynum();//將數(shù)字傳到數(shù)碼管上顯示
- void saveeepro();
- void timer0(void)interrupt 1 {//定時器0
- //500等于1秒
- TL0 = 0xCD; //重新設(shè)置定時器0時間為2ms
- TH0 = 0xF8; //重新設(shè)置定時器0的初始值
- tcnt1++;//用于刷新數(shù)碼管
- presstime++;
- if (if0==0){
- meanval1++;
- if(meanval1==50){
- meanval2=GetADCResult(7)/2.5;
- //meanval2=meanval2-20;
- if(meanval2>=100){meanval2=99;}
- if(meanval2<=1){meanval2=0;}
- meanval1=0;
- }
- }
- switch(tcnt1){//數(shù)碼管部分
- case 1: p31s(); P1=seg7code[bainum1];P32=0;break;
- case 2: p31s(); P1=~seg7code[shinum1];if(keynum==1 || keynum==3 || keynum==0){P33=0;}break;
- case 3: p31s(); P1=~seg7code[genum1]; if(keynum==2 || keynum==4 || keynum==0){P35=0;}break;
- default: tcnt1=0; p31s(); break;
- }
- }//定時器0結(jié)束
- void displaynum(){//將數(shù)字傳到數(shù)碼管上顯示
- if (if0==0){//當if0==0時num1三個數(shù)碼管進行顯示
- AIN1=1;
- ad=meanval2;
- // if((ad<inum11)||(ad>inum12)){OUT=0;}else{OUT=1;} //inum11是上線值 inum12是下線線值
- // if(ad>inum11){OUT=0;} //如果AD值大于上線值繼電器吸合
- // if(ad<inum12){OUT=1;} //如果AD值小于下線值繼電器斷開
- if(ad>inum11){OUT=1;} //如果AD值大于上線值繼電器斷開
- if(ad<inum12){OUT=0;} //如果AD值小于下線值繼電器吸合
- genum1=ad%10;//個位
- shinum1=ad/10%10;//十位
- bainum1=10;//百
- }else{
- if(keynum<3){
- bainum1=11;
- shinum1=shinum11;
- genum1=genum11;
- inum11=shinum11*10+genum11; //將num1三個數(shù)碼管的值付給inum
- }else{
- bainum1=12;
- shinum1=shinum12;
- genum1=genum12;
- inum12=shinum12*10+genum12; //將num1三個數(shù)碼管的值付給inum
-
- }
- }
- }
- void timer0_1init(void){//定時配置
- TMOD=0x11;//將定時器0,1都設(shè)置為模式1
- TL0 = 0xCD;//設(shè)置定時器0時間為2ms
- TH0 = 0xF8;//設(shè)置定時器0的初始值
- TR0=1;//開啟定時器0
- TR1=1;//開啟定時器1
- EA=1;//開總中斷
- ET0=1;//開定時器0的中斷
- }
- void main(){
- P1M0=0X00;//強推挽輸出
- P1M1=0X7F;//強推挽輸出
- AIN1=1;
- InitADC(); //AD轉(zhuǎn)換初始化
- timer0_1init(); //定時器配置
- inum11= IapReadByte(0x01);//讀取存儲的值
- inum12= IapReadByte(0x02);
- // inum1=inum11*100+inum12;
- shinum11=inum11/10%10;
- genum11=inum11%10;
- shinum12=inum12/10%10;
- genum12=inum12%10;
- while(1){
- keycan();
- }
- }
- void keycan(){//按鍵
- if(keynum==0){//當按鍵值等于0的時候調(diào)用顯示
- displaynum();
- }
- if(key1==0){//當按鍵1按下
- if(kf0){//當標志位kf0=1的時候進行
- if(presstime>50){//當時間值大于一百的時候
- kf0=0;//標志位kf0=0
- kt0=1;//標志位kt0=0
- if0=1;
- presstime=0;//時間清零,重新進行
- keynum++;//數(shù)碼管的位
- if(keynum==5){//當位到7則置位0
- keynum=0;if0=0;
- }
- }
- }
- }else{//當按鍵松開
- keyflag();displaynum();
- }//按鍵1結(jié)束
- if(key2==0){if(kf0){if(presstime>50){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉電存儲的標志位改為1,進行存值操作
- switch(keynum){
- case 0:if(if0==1){if0=0;}else{if0=1;}break;
- case 1:shinum11++;if(shinum11>9){shinum11=0;}break;
- case 2:genum11++;if(genum11>9){genum11=0;}break;
- case 3:shinum12++;if(shinum12>9){shinum12=0;}break;
- case 4:genum12++;if(genum12>9){genum12=0;}break;
- default:break;
- }
- }}}else{keyflag();displaynum();
- if(bainum11==1){shinum11=0;genum11=0;}
- if((flag_eeprom1==1))//加掉電存儲,必需加到這,不然有一些小問題
- { flag_eeprom1=0;
- saveeepro();//掉電存儲
- }
- }//松開按鍵進行顯示
- }
- void saveeepro(){//掉電存儲
- inum11=shinum11*10+genum11; //將num1三個數(shù)碼管的值付給inum
- inum12=shinum12*10+genum12; //將num1三個數(shù)碼管的值付給inum
- // inum11=inum1/100;//把int型的值拆分到char型
- // inum12=inum1%100;
- IapEraseSector(0); //擦除扇區(qū)
- IapProgramByte(0x01,inum11);//寫入數(shù)據(jù)
- IapProgramByte(0x02,inum12);//寫入數(shù)據(jù)
- // IapProgramByte(0x03,inum13);//寫入數(shù)據(jù)
- // IapProgramByte(0x04,inum14);//寫入數(shù)據(jù)
- }
- void p31s(){//將p3口的235置為1
- P32=1;P33=1;P35=1;
- }
- void keyflag(){//按鍵結(jié)束調(diào)用,按鍵的建議使用,這樣可以減小code,但是觸發(fā)的不建議
- if(kt0){//當標志位kt0=1的時候進行
- if(presstime>50){//當時間值大于一百的時候
- kf0=1;//標志位kf0=1
- kt0=0;//標志位kt0=0
- presstime=0;//時間清零,重新進行
- }
- }
- }
- // AD轉(zhuǎn)換初始化程序
- void InitADC(){
- // P1 = P1M0 = P1M1 = 0xff; //設(shè)置P1口為開漏模式,使用AD功能
- ADC_DATA = 0; //AD數(shù)據(jù)寄存器清空
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打開AD電源,轉(zhuǎn)換周期210
- _nop_(); //延時
- }
- //AD轉(zhuǎn)換控制程序
- uint GetADCResult(uchar px){ //轉(zhuǎn)換輸出的數(shù)據(jù) (PX為通道口)
- uint t=0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//開始轉(zhuǎn)換
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//等待轉(zhuǎn)換結(jié)束
- ADC_CONTR &= ~ADC_FLAG; //關(guān)閉AD轉(zhuǎn)換
- t=(ADC_DATA<<2)|ADC_LOW2;
- return ADC_DATA; //返回數(shù)據(jù)
- }
- void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態(tài)
- IAP_CONTR = 0; //
- IAP_CMD = 0; //
- IAP_TRIG = 0; //
- IAP_ADDRH = 0x80; //
- IAP_ADDRL = 0; //
- }
- uchar IapReadByte(uint addr){//讀數(shù)據(jù)
- uchar dat;
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_READ;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_TRIG = 0x46;
- IAP_TRIG = 0xb9;
- _nop_();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
GYJ-0083_模擬量轉(zhuǎn)開關(guān)量傳感器模塊發(fā)貨資料.rar
(15.1 MB, 下載次數(shù): 32)
2018-3-18 00:48 上傳
點擊文件名下載附件
|