GYJ-0094_16路輸入6路輸出繼電器可編程模塊使用說明 簡要說明: 一、 尺寸:長133mmX寬107mmX高25mm 二、 主要芯片:STC12C5A60S2 是51單片機的8~12倍 (兼容51系列單片機) 三、 工作電壓:直流12伏(另有24V繼電器可選)
四、通過9針串口下載程序 (同時支持TTL下載程序) 五、 特點: 1、具有電源指示。(供電電源有防接反保護)
2、16路輸入(包括:2路模擬量輸入,2路高速光電輸入,12路光電隔離輸入)。
3、6路光電隔離繼電器輸出控制。
4、標準的11.0592M晶振。(便于設置串口波特率)
5、具有上電復位和手動復位。
6、獨立的串口通信及485通信。
7、可以接315M帶解碼的無線接收模塊。
8、輸入輸出均有信號指示燈。
9、繼電器開關量輸出,最大切換電壓220V,最大切換電流7A。最大切換功率200W。
10、電流加有,光電隔離,續流二極管,壓敏電阻,抗干擾能力強。
11、四周有固定安裝孔,也可插入PCB107mm卡槽,安裝在DIN導軌上。
12、通訊穩定,提供原理圖,及板子的參考例程。
13、單片機無加密,可插拔更換,帶有程序下載口,可隨意更改程序 14、、端子采用螺旋壓接端子
15、工作溫度-40度至 +70度 16、工作濕度 40% ~ 80%RH 使用說明: 【標示圖】 【供電接線圖】
【通訊及下載接線圖】
【模擬量輸入接線圖】 【光電隔離輸入接線圖】 特別聲明:IN3至IN14低電平有效,輸入信號電壓支持0~36V。 【高速光耦輸入接線圖】 【外接315M無線遙控模塊】(默認發貨不提供接收模塊和遙控器需要另外聯系銷售購買)通過編程實現控制。提供相關例程。 【輸出部分標注說明】 【原理圖】(提供PDF文件) 【PCB圖】(提供PDF文件)
【原件清單】 (提供PDF文件) 【測試程序】(提供源代碼及各個模塊功能的代碼)
【圖片展示】 【裝殼后效果展示】(可以裝在配電柜的DIN導軌上) 【配無線遙控效果圖】    【裝殼后效果展示】(可以裝在配電柜的DIN導軌上)參考圖
- 01.一對一點動輸出程序
- /********************************************************************
- 匯誠科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序說明:
- //模擬量輸入(這里用作普通IO口,高電平觸發)
- 當IN1口與+5V口接通后, 對應的繼電器吸合,OUT1接通
-
- //第一組普通開光量輸入(可做脈沖輸入,最大1Khz的脈沖)
- 當IN2口與GND口接通后, 對應的繼電器吸合,OUT2接通
- 當IN3口與GND口接通后, 對應的繼電器吸合,OUT3接通
- 當IN4口與GND口接通后, 對應的繼電器吸合,OUT4接通
- 當IN5口與GND口接通后, 對應的繼電器吸合,OUT5接通
- 當IN6口與GND口接通后, 對應的繼電器吸合,OUT6接通
- 當IN7口與GND口接通后, 對應的繼電器吸合,OUT7接通
- //第二組普通開光量輸入(可做脈沖輸入,最大1Khz的脈沖)
- 當IN8口與GND口接通后, 對應的繼電器吸合,OUT8接通
- 當IN9口與GND口接通后, 對應的繼電器吸合,OUT9接通
- 當IN10口與GND口接通后,對應的繼電器吸合,OUT10接通
- 當IN11口與GND口接通后,對應的繼電器吸合,OUT11接通
- 當IN12口與GND口接通后,對應的繼電器吸合,OUT12接通
- 當IN13口與GND口接通后,對應的繼電器吸合,OUT1接通
- //高速脈沖輸入(最大100KHz)(也可作普通IO口用)
- 當IN14口與GND口接通后,對應的繼電器吸合,OUT2接通
- 當IN15口與GND口接通后,對應的繼電器吸合,OUT3接通
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- /********************************************************************
- 初始定義
- *********************************************************************/
- /*定義十四個輸入*/
- //模擬量接口,做普通IO口時,高定平有效(這里用做普通IO口)
- sbit IN1=P1^0;
- //開光量輸入 低電平有效
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^4;
- sbit IN8=P3^5;
- sbit IN9=P3^6;
- sbit IN10=P3^7;
- sbit IN11=P4^6;
- sbit IN12=P4^5;
- sbit IN13=P4^4;
- //高速脈沖輸入, 觸發信號高低可選
- sbit IN14=P3^2;
- sbit IN15=P3^3;
-
- /*定義八位輸出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- sbit OUT5= P2^7;
- sbit OUT6= P2^6;
- sbit OUT7= P2^5;
- sbit OUT8= P2^4;
- sbit OUT9= P2^3;
- sbit OUT10=P2^2;
- sbit OUT11=P2^1;
- sbit OUT12=P2^0;
- void main()
- {
- P1M1|=0X01; //0000 0001 //因為此IO口直接引出,外加下拉電阻。所以配置IO口的時候需要把它設定為“開漏模式”
- P1M0|=0X01; //0000 0001
- P4M1|=0x70; //0111 0000 //P4口設置為“輸入模式”
- P4M0 =0x00; //0000 0000
- P4SW|=0x40; //0100 0000 //P4^6設置成普通IO口
- while(1)
- {
- if(IN1==1) OUT1=0; else OUT1=1;
- if(IN2==0) OUT2=0; else OUT2=1;
- if(IN3==0) OUT3=0; else OUT3=1;
- if(IN4==0) OUT4=0; else OUT4=1;
- if(IN5==0) OUT5=0; else OUT5=1;
- if(IN6==0) OUT6=0; else OUT6=1;
- if(IN7==0) OUT7=0; else OUT7=1;
- if(IN8==0) OUT8=0; else OUT8=1;
- if(IN9==0) OUT9=0; else OUT9=1;
- if(IN10==0) OUT10=0; else OUT10=1;
- if(IN11==0) OUT11=0; else OUT11=1;
- if(IN12==0) OUT12=0; else OUT12=1;
- if(IN13==0) OUT1=0; else OUT1=1;
- if(IN14==0) OUT2=0; else OUT2=1;
- if(IN15==0) OUT3=0; else OUT3=1;
- }
- }
- 02.串口通訊程序
- /********************************************************************
- 匯誠科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- 【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!
-
- *********************************************************************/
- /********************************************************************
- 程序說明:
- 上位機通過串口一發送十六進制0xff 繼電器全開
- 發送十六進制0x00 繼電器全關
- 觸發IN2,板子會向上位機發送 0x01
-
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- /********************************************************************
- 初始定義
- *********************************************************************/
- /*定義十四個輸入*/
- //模擬量接口,做普通IO口時,高定平有效(這里用做普通IO口)
- sbit IN1=P1^0;
- //開光量輸入 低電平有效
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^4;
- sbit IN8=P3^5;
- sbit IN9=P3^6;
- sbit IN10=P3^7;
- sbit IN11=P4^6;
- sbit IN12=P4^5;
- sbit IN13=P4^4;
- //高速脈沖輸入, 觸發信號高低可選
- sbit IN14=P3^2;
- sbit IN15=P3^3;
- /*定義八位輸出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- sbit OUT5= P2^7;
- sbit OUT6= P2^6;
- sbit OUT7= P2^5;
- sbit OUT8= P2^4;
- sbit OUT9= P2^3;
- sbit OUT10=P2^2;
- sbit OUT11=P2^1;
- sbit OUT12=P2^0;
- /***********************************************************
- 數據定義
- ***********************************************************/
- unsigned char dat=0xA1;
-
- /********************************************************************
- 函數定義
- *********************************************************************/
- //延時函數
- void delay ( unsigned char t )
- {
- unsigned char i,j;
- for( i=0; i<t; i++)
- for( j=0; j<250; j++);
- }
- //初始化定義函數
- void init()
- {
- //IO口配置
- P1M1|=0X01; //0000 0001 //因為此IO口直接引出,外加下拉電阻。所以配置IO口的時候需要把它設定為“開漏模式”
- P1M0|=0X01; //0000 0001
- P4M1|=0x70; //0111 0000 //P4口設置為“輸入模式”
- P4M0 =0x00; //0000 0000
- P4SW|=0x40; //0100 0000 //P4^6設置成普通IO口
-
- //串口一配置
- TMOD=0x20; //定時器一產生波特率
- SCON=0x50; //方式一,八位數據位,一位停止位
- TH1=0XFD; //波特率9600
- TL1=0xFD;
- TR1=1;
- ES=1;
- EA=1;
- }
- void main()
- {
-
- init();
-
- while(1)
- {
- if(dat==0xFF)
- {
- dat=0xA1;
- OUT1=0;
- OUT2=0;
- OUT3=0;
- OUT4=0;
- OUT5=0;
- OUT6=0;
- OUT7=0;
- OUT8=0;
- OUT9=0;
- OUT10=0;
- OUT11=0;
- OUT12=0;
- }
- if(dat==0x00)
- {
- dat=0xA1;
- OUT1=1;
- OUT2=1;
- OUT3=1;
- OUT4=1;
- OUT5=1;
- OUT6=1;
- OUT7=1;
- OUT8=1;
- OUT9=1;
- OUT10=1;
- OUT11=1;
- OUT12=1;
- }
- if(IN2==0x00)
- {
- delay(10);
- if(IN2==0X00)
- SBUF=0X01;
- while(!IN2);
- }
- }
- }
-
- /*--------------------------------------
- 串口一 接收中斷函數
- --------------------------------------*/
-
- void uart_isr() interrupt 4 using 2
- {
- if( RI )
- {
- RI=0;
- dat=SBUF;
- }
- if(TI)
- TI=0;
-
- }
- 03.485通訊程序
- /********************************************************************
- 匯誠科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序說明:
- 上位機通過485發送十六進制0xff 繼電器全開
- 發送十六進制0x00 繼電器全關
- 觸發IN2,板子會向上位機發送 0x01
-
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- /********************************************************************
- 初始定義
- *********************************************************************/
- /*定義十四個輸入*/
- //模擬量接口,做普通IO口時,高定平有效(這里用做普通IO口)
- sbit IN1=P1^0;
- //開光量輸入 低電平有效
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^4;
- sbit IN8=P3^5;
- sbit IN9=P3^6;
- sbit IN10=P3^7;
- sbit IN11=P4^6;
- sbit IN12=P4^5;
- sbit IN13=P4^4;
- //高速脈沖輸入, 觸發信號高低可選
- sbit IN14=P3^2;
- sbit IN15=P3^3;
- /*定義八位輸出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- sbit OUT5= P2^7;
- sbit OUT6= P2^6;
- sbit OUT7= P2^5;
- sbit OUT8= P2^4;
- sbit OUT9= P2^3;
- sbit OUT10=P2^2;
- sbit OUT11=P2^1;
- sbit OUT12=P2^0;
- /***********************************************************
- 數據定義
- ***********************************************************/
- unsigned char dat=0xA1;
-
- /********************************************************************
- 函數定義
- *********************************************************************/
- //延時函數
- void delay ( unsigned char t )
- {
- unsigned char i,j;
- for( i=0; i<t; i++)
- for( j=0; j<250; j++);
- }
- //初始化定義函數
- void init()
- {
- //IO口配置
- P1M1|=0X01; //0000 0001 //因為此IO口直接引出,外加下拉電阻。所以配置IO口的時候需要把它設定為“開漏模式”
- P1M0|=0X01; //0000 0001
- P4M1|=0x70; //0111 0000 //P4口設置為“輸入模式”
- P4M0 =0x00; //0000 0000
- P4SW|=0x40; //0100 0000 //P4^6設置成普通IO口
-
- //485配置
- S2CON=0x50; //方式1,八位數據,可變波特率
- AUXR1=0x00; //1T工作方式
- BRT = 256 - (11059200/12/32)/9600; //BRT=0XFD; //設置波特率9600
-
- AUXR=0x10; //啟動波特率發生器
- IE2=0x01; //開串口2中斷
- EA=1;
- }
- void main()
- {
-
- init();
-
- while(1)
- {
- if(dat==0xFF)
- {
- dat=0xA1;
- OUT1=0;
- OUT2=0;
- OUT3=0;
- OUT4=0;
- OUT5=0;
- OUT6=0;
- OUT7=0;
- OUT8=0;
- OUT9=0;
- OUT10=0;
- OUT11=0;
- OUT12=0;
- }
- if(dat==0x00)
- {
- dat=0xA1;
- OUT1=1;
- OUT2=1;
- OUT3=1;
- OUT4=1;
- OUT5=1;
- OUT6=1;
- OUT7=1;
- OUT8=1;
- OUT9=1;
- OUT10=1;
- OUT11=1;
- OUT12=1;
- }
- if(IN2==0x00)
- {
- delay(10);
- if(IN2==0X00)
- S2BUF=0X01;
- while(!IN2);
- }
- }
- }
-
- /************485發送接收中斷函數******/
- void uart2_isr() interrupt 8
- {
- if( S2CON & 0x01 )
- {
- S2CON &=~0x01;
- dat = S2BUF;
- }
- if( S2CON & 0x02 )
- {
- S2CON&=0xfd;
- }
- }
- 04.掉電存儲程序
- /********************************************************************
- 匯誠科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序說明:
- 向內部eeprom中寫數據,然后再讀取出來,
- 如果正確繼電器全部吸合,
- 如果不正確繼電器全部斷開
-
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- #include <intrins.h> //用nop函數延時的頭文件
-
- typedef unsigned char uint8;
- typedef unsigned int uint16;
-
- #define ENABLE_ISP 0x82 //系統工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
- /********************************************************************
- 初始定義
- *********************************************************************/
- /*定義十四個輸入*/
- //模擬量接口,做普通IO口時,高定平有效(這里用做普通IO口)
- sbit IN1=P1^0;
- //開光量輸入 低電平有效
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^4;
- sbit IN8=P3^5;
- sbit IN9=P3^6;
- sbit IN10=P3^7;
- sbit IN11=P4^6;
- sbit IN12=P4^5;
- sbit IN13=P4^4;
- //高速脈沖輸入, 觸發信號高低可選
- sbit IN14=P3^2;
- sbit IN15=P3^3;
- /*定義八位輸出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- sbit OUT5= P2^7;
- sbit OUT6= P2^6;
- sbit OUT7= P2^5;
- sbit OUT8= P2^4;
- sbit OUT9= P2^3;
- sbit OUT10=P2^2;
- sbit OUT11=P2^1;
- sbit OUT12=P2^0;
- /***********************************************************
- 數據定義
- ***********************************************************/
- unsigned char dat;
-
- /***********************************************************
- 函數定義
- ************************************************************/
- uint8 Byte_Read(uint16 add); //讀一字節,調用前需打開IAP 功能
- void Byte_Program(uint16 add, uint16 ch); //字節編程,調用前需打開IAP 功能
- void Sector_Erase(uint16 add); //擦除扇區
- void IAP_Disable(); //關閉IAP 功能
- void main()
- {
- Sector_Erase(0); //擦除整個扇區0,用于重新寫新的數據到EEPROM
- // Byte_Program(0x01,0x65); //擦除完成就可以向對應地址寫入數據, 第一個0x01是地址 0x66是要保存的數據
- Byte_Program(0x01,0x66); //擦除完成就可以向對應地址寫入數據, 第一個0x01是地址 0x66是要保存的數據
- dat = Byte_Read(0x01); //讀取對應地址0x01中eeprom的值
-
- while(1)
- {
- if(dat==0x66) //如果和寫入EEPROM的值一樣,則吸合繼電器
- {
- OUT1=0;
- OUT2=0;
- OUT3=0;
- OUT4=0;
- OUT5=0;
- OUT6=0;
- OUT7=0;
- OUT8=0;
- OUT9=0;
- OUT10=0;
- OUT11=0;
- OUT12=0;
- }
- }
- }
- union union_temp16
- {
- uint16 un_temp16;
- uint8 un_temp8[2];
- }my_unTemp16;
-
- //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
- uint8 Byte_Read(uint16 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 = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- return (IAP_DATA);
- }
-
- //字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
- void Byte_Program(uint16 add, uint16 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 = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被觸發起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- }
-
- //擦除扇區, 入口:DPTR = 扇區地址
- void Sector_Erase(uint16 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 = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,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;
- }
- 05.遙控解碼程序
- /********************************************************************
- 匯誠科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序說明:
- 按鍵使用四鍵遙控,
- 按下A鍵 ,第一路吸合
- 按下B鍵 ,第二路吸合
- 按下C鍵 ,第三路吸合
- 按下D鍵 ,第四路吸合
- **********************************************************************
- */
- #include "STC12C5A60S2.H"
- /********************************************************************
- 初始定義
- *********************************************************************/
- /*遙控使用
- P1^0,P1^1,P1^2,P1^3; */
-
-
- /*定義八位輸出*/
- sbit OUT1= P0^4;
- sbit OUT2= P0^5;
- sbit OUT3= P0^6;
- sbit OUT4= P0^7;
- /*************************************************************************
- 數據定義
- **************************************************************************/
- unsigned char dat=0; //讀取P1口的狀態
- void main()
- {
- while(1)
- {
- dat=P0;
- if(dat&0x01) //如果A按下
- OUT1=0; //第一路吸合
- else
- OUT1=1;
- if(dat&0x02) //如果B按下
- OUT2=0; //第二路吸合
- else
- OUT2=1;
- if(dat&0x04) //如果C按下
- OUT3=0; //第三路吸合
- else
- OUT3=1;
- if(dat&0x08) //如果D按下
- OUT4=0; //第四路吸合
- else
- OUT4=1;
- }
- }
- 06.IN1模擬量采集程序(0~5V)
- /********************************************************************
- 匯誠科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序說明:
- 使用外部顯示模塊TM1650顯示模擬量的值,
- 采集電壓0~5V 對應寄存器的值0到1024 十位分辨率
-
- **********************************************************************
- */
- /*********************************************************************/
- #include "STC12C5A60S2.H"
- #include "intrins.h"
-
- //#define FOSC 11059200L
- //#define BAUD 9600
- #define uchar unsigned char
- #define uint unsigned int
-
- #define CLK_H CLK = 1
- #define CLK_L CLK = 0
-
- #define DIO_H DIO = 1
- #define DIO_L DIO = 0 //位的控制端
- /********************************************************************
- 初始化設置
- *********************************************************************/
- //sfr ADC_CONTR = 0xBC; //ADC 控制寄存器
- //sfr ADC_RES = 0xBD; //ADC 轉換結果寄存器
- //sfr ADC_LOW2 = 0xBE; //ADC 低2位結果寄存器
- //sfr P1ASF = 0x9D; //Pl口模擬功能控制寄存器
-
- /********************************************************************
- ADC 數據轉換函數
- *********************************************************************/
-
- //#define ADC_POWER 0x80 //ADC 電源控制位
- //#define ADC_FLAG 0x10 //ADC 轉換結束標志位
- //#define ADC_START 0x08 //ADC 開始轉換控制位
- //#define ADC_SPEEDLL 0x00 //420 個時鐘周期轉換一次
- //#define ADC_SPEEDL 0x20 //280 個時鐘周期轉換一次
- //#define ADC_SPEEDH 0x40 //140 個時鐘周期轉換一次
- //#define ADC_SPEEDHH 0x60 //70 個時鐘周期轉換一次
-
-
- uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9顯示代碼
- uint data1;
- sbit CLK = P3^1;
- sbit DIO = P3^0;
- uint t;
- void TM1650_Set(uchar add,uchar dat); //顯示函數(地址,數據)
- void Init_Tm1650(void); //初始化TM1650函數
- void Delay_us(uint); //us延時
- void TM1650_S(uint); //顯示data的值
-
- /********************************************************************
- 延時函數
- *********************************************************************/
- void Delay1(uint n)
- {
- uint x;
- while (n--)
- {
- x = 5000;
- while (x--);
- }
- }
- /********************************************************************
- ADC 初始化
- *********************************************************************/
- void InitADC()
- {
- P1ASF = 0xff; //設置P1口為開漏模式,使用AD功能
- ADC_RES = 0; //AD數據寄存器清空
- ADC_CONTR |=0X80; //打開AD電源,轉換周期420
- Delay1(2); //延時
- }
- /********************************************************************
- ADC 數據轉換函數
- *********************************************************************/
- uint GetADCResult(char ch)
- {
- ADC_CONTR = 0X88 | ch;//開始轉換
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- _nop_(); //延時一個機器周期
- while (!(ADC_CONTR & 0X10));//等待轉換結束
-
- ADC_CONTR &=0xEF; //關閉AD轉換
- t=(ADC_RES<<2)|ADC_RESL;
- return t; //返回數據
- }
-
- /********************************************************************
- 主函數
- *********************************************************************/
- void main()
- {
- InitADC(); //AD轉換初始化
- Init_Tm1650(); //初始化TM1650
- TM1650_S(0);
- while (1)
- {
- TM1650_S(GetADCResult(0));
- }
- }
-
-
- void TM1650_S(uint data1)
- {
- uchar xa,xb,xc,xd;
- xa=data1/1000; // 1234/1000 =1;
- xb=data1%1000/100; // 1234%1000=234/100=2;
- xc=data1%100/10; // 1234%100=34/10;
- xd=data1%10; // 1234%10;
- TM1650_Set(0x68,CODE[xa]);
- TM1650_Set(0x6A,CODE[xb]);
- TM1650_Set(0x6C,CODE[xc]);
- TM1650_Set(0x6E,CODE[xd]);
- }
- void Delay_us(uint i) //us延時
- {
- for(;i>0;i--)
- {
- _nop_();
- }
- }
- void I2CStart(void) //開始信號
- {
- CLK_H;
- DIO_H;
- Delay_us(5);
- DIO_L;
-
- }
-
- void I2Cask(void) //ACK信號
- {
- uchar timeout = 1;
- CLK_H;
- Delay_us(5);
- CLK_L;
- while((DIO)&&(timeout<=100))
- {
- timeout++;
- }
- Delay_us(5);
- CLK_L;
- }
-
- void I2CStop(void) //停止信號
- {
- CLK_H;
- DIO_L;
- Delay_us(5);
- DIO_H;
- }
-
- void I2CWrByte(uchar oneByte) //寫一個字節高位在前,低位在后
- {
- uchar i;
- CLK_L;
- Delay_us(1);
- for(i=0;i<8;i++)
- {
- oneByte = oneByte<<1;
- DIO = CY;
- CLK_L;
- Delay_us(5);
- CLK_H;
- Delay_us(5);
- CLK_L;
- }
- }
- void TM1650_Set(uchar add,uchar dat) //數碼管顯示
- {
- //寫顯存必須從高地址開始寫
- I2CStart();
- I2CWrByte(add); //第一個顯存地址
- I2Cask();
- I2CWrByte(dat);
- I2Cask();
- I2CStop();
- }
- void Init_Tm1650(void)
- {
- TM1650_Set(0x48,0x21);//初始化為5級灰度,開顯示
-
- }
- /********************************************************************
- 結束
- */
- 07.高速脈沖輸入程序
- /********************************************************************
- 匯誠科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序說明:
- 高速脈沖使用P3^2(外部中斷0) P3^3(外部中斷1)來計數。
- 有信號,直接進入中斷,
- 程序中,當脈沖個數達到500K。輸出繼電器 吸合, 外部測試脈沖發生器頻率為166KHz
- */
- /*********************************************************************/
- #include <STC12C5A60S2.H> //庫文件
- unsigned long dispcount=0; //計數初值
- /********************************************************************
- 中斷服務函數
- *********************************************************************/
- void ExtInt0() interrupt 0 //中斷服務程序
- {
- dispcount++; //每按一次中斷按鍵,計數加一
- }
- /********************************************************************
- 中斷服務函數
- *********************************************************************/
- void ExtInt1() interrupt 2 //中斷服務程序
- {
- dispcount++; //每按一次中斷按鍵,計數加一
- }
- /********************************************************************
- 主函數
- *********************************************************************/
- void main()
- {
- IT0=1; //低電平觸發
- EX0=1; //開外部中斷0
-
- IT1=1; //低電平觸發
- EX1=1; //開外部中斷1
-
- EA=1;
- while(1)
- {
- if(dispcount>=500000)
- P2=0X00;
- else
- P2=0XFF;
-
-
- }
- }
- 08.定時器使用
- /********************************************************************
- 匯誠科技
-
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序說明:
- 使用定時器0 和定時器1 使P2口吸合一秒。斷開一秒
- **********************************************************************
- */
-
- #include <stc12c5a60s2.h>
-
- unsigned int time0,time1;
-
- //定時器0初始化
- void t0_init() //ms0最大71
- {
- TMOD &=0XF0;
- TMOD |=0X01; //方式一 一共四種方式 GATE0 C/T0 M0_1 M0_0 C/T0選擇時鐘計數還是外部計數 方式0是十三位定時器 ,方式1是十六位定時器,方式2是八位自動 方式4是兩個八位
- TH0=0XDB;
- TL0=0XEC;
- ET0=1; //使能T0中斷
- // EA=1;
- // TR0=1;
- }
- //定時器1初始化
- void t1_init()
- {
- TMOD &= 0x0f; //清零T1的控制位
- TMOD |= 0x10; //配置T1為模式1
- TH1 = 0xDB; //加載T1重載值
- TL1 = 0XEC;
- ET1 = 1; //使能T1中斷
- // EA=1;
- // TR1=1;
- }
- void main()
- {
- t0_init(); //定時器0初始化
- t1_init(); //定時器1初始化
- TR0=1; //開定時器0
- TR1=1; //開定時器1
- EA=1; //開總中斷
- while(1)
- {
- ;
- }
- }
- void t0(void) interrupt 1 using 0 //定時中斷服務函數
- {
- TH0=0xDB; //定時器0重新賦值
- TL0=0XEC;
- ++time0;
- if(time0==100)
- {
- P2=0X00; //定時器0讓P2口吸合
- }
- if(time0==200)
- {
- time0=0;
- }
- }
- void t1(void) interrupt 3 using 1 //定時中斷服務函數
- {
- TH1=0XDB; //定時器1重新賦值
- TL1=0XEC;
- if(++time1==200) //定時器1讓P2口斷開
- {
- time1=0;
- P2=0XFF;
- }
- }
- 09.外接數碼管TM1650程序
- /********************************************************************
- 匯誠科技
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 編譯環境:Keil
- 作者:zhangxinchunleo
- *********************************************************************/
- /********************************************************************
- 程序說明:
- 使用外部顯示模塊TM1650來顯示一些寄存器的值 (這里顯示data的值)
- 按下第一個按鍵,data清零
- 按下第二個按鍵,data加一
- 按下第三個按鍵,data減一
-
- **********************************************************************
- */
- #include "stc12c5a60S2.H"
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- #define CLK_H CLK = 1
- #define CLK_L CLK = 0
-
- #define DIO_H DIO = 1
- #define DIO_L DIO = 0
-
- uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9顯示代碼
- uint data1;
- sbit CLK = P3^1;
- sbit DIO = P3^0;
- uchar key=0;
- bit key_flag=0;
-
- void TM1650_Set(uchar add,uchar dat); //顯示函數(地址,數據)
- uchar Scan_Key(void); //獲取按鍵函數
- void Init_Tm1650(void); //初始化TM1650函數
- void TM1650_S(uint); //顯示data的值
- void main()
- {
- Init_Tm1650(); //初始化TM1650
- TM1650_S(0); //上電顯示0000
- while(1)
- {
- TM1650_S(data1); //需要顯示的值
- if((Scan_Key()==0x47)&&key_flag==0) //如果第一個按鍵按下 0x47和數據手冊相按鍵對應 按下0x47 松開0x07
- {
- key_flag=1;
- data1=0;
- }
- else if((Scan_Key()==0x4d)&&key_flag==0) //如果第二個按鍵按下 0x4d和數據手冊相按鍵對應 按下0x4d 松開0x0d
- {
- key_flag=1;
- data1++;
- }
- else if((Scan_Key()==0x56)&&key_flag==0) //如果第三個按鍵按下 0x456和數據手冊相按鍵對應 按下0x47 松開0x16
- {
- key_flag=1;
- data1--;
- }
- else if((Scan_Key()==0x07)||(Scan_Key()==0x0d)||(Scan_Key()==0x16)) //判斷按下按鍵后是否松開,
- {
- key_flag=0;
- }
- }
- }
-
- void TM1650_S(uint data1)
- {
- uchar xa,xb,xc,xd;
- xa=data1/1000; // 1234/1000 =1;
- xb=data1%1000/100; // 1234%1000=234/100=2;
- xc=data1%100/10; // 1234%100=34/10;
- xd=data1%10; // 1234%10;
- TM1650_Set(0x68,CODE[xa]);
- TM1650_Set(0x6A,CODE[xb]);
- TM1650_Set(0x6C,CODE[xc]);
- TM1650_Set(0x6E,CODE[xd]);
- }
- void Delay_us(uint i) //us延時
- {
- for(;i>0;i--)
- {
- _nop_();
- // _nop_();
- // _nop_();
- // _nop_();
- // _nop_();
- }
- }
- void I2CStart(void) //開始信號
- {
- CLK_H;
- DIO_H;
- Delay_us(5);
- DIO_L;
-
- }
-
- void I2Cask(void) //ACK信號
- {
- uchar timeout = 1;
- CLK_H;
- Delay_us(5);
- CLK_L;
- while((DIO)&&(timeout<=100))
- {
- timeout++;
- }
- Delay_us(5);
- CLK_L;
- }
-
- void I2CStop(void) //停止信號
- {
- CLK_H;
- DIO_L;
- Delay_us(5);
- DIO_H;
- }
-
- void I2CWrByte(uchar oneByte) //寫一個字節高位在前,低位在后
- {
- uchar i;
- CLK_L;
- Delay_us(1);
- for(i=0;i<8;i++)
- {
- oneByte = oneByte<<1;
- DIO = CY;
- CLK_L;
- Delay_us(5);
- CLK_H;
- Delay_us(5);
- CLK_L;
- }
- }
-
- uchar Scan_Key(void) // 按鍵掃描
- {
- uchar i;
- uchar rekey;
- I2CStart();
- I2CWrByte(0x49);//讀按鍵命令
- I2Cask();
- //DIO_H;
- for(i=0;i<8;i++)
- {
- CLK_H;
- rekey = rekey<<1;
- if(DIO)
- {
- rekey++;
- }
- Delay_us(5);
- CLK_L;
- }
- I2Cask();
- I2CStop();
- return(rekey);
- }
-
-
- void TM1650_Set(uchar add,uchar dat) //數碼管顯示
- {
- //寫顯存必須從高地址開始寫
- I2CStart();
- I2CWrByte(add); //第一個顯存地址
- I2Cask();
- I2CWrByte(dat);
- I2Cask();
- I2CStop();
- }
- void Init_Tm1650(void)
- {
- TM1650_Set(0x48,0x21);//初始化為5級灰度,開顯示
-
- }
復制代碼
0.png (59.97 KB, 下載次數: 28)
下載附件
2018-3-18 18:06 上傳
全部資料51hei下載地址:
|