1.使用國產STC81K小芯片的工程,可供相關學習研究的人員學習交流;
2.使用國產直流電機正反轉控制芯片,控制方案簡單,體積小,電流在3A左右;
3.調速使用外接撥碼開關設置速度;
4.本工程中有,原理圖,PCB圖,原代碼,設置速度的表 HM2503的PDFU資料;
5.全部資料,在壓縮包中;
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (58.5 KB, 下載次數: 55)
下載附件
2021-9-9 16:12 上傳
單片機源程序如下:
- /************* 功能說明 *********************************************
- 1.檢測撥碼開關狀態,以確定IO口輸出方波的時間長短
- 程序工作流:
- 1.上電IO產生方波,
- 2.檢測撥碼開關狀態,自動調節方波時間,最長1000MS為固定;調節范圍:1ms--119ms
-
- 適用:用于ATQ229繼電器老化
- *************************************************************************/
- //#include "reg51.h" //包含此頭文件后,里面聲明的寄存器不需要再手動輸入,避免重復定義
- #include "STC8GXX.h"
- #include "intrins.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- #define Baudrate1 115200UL
- #define UART1_BUF_LENGTH 12
- unsigned char TX1_Cnt; //發送計數
- unsigned char RX1_Cnt; //接收計數
- unsigned long MAIN_Fosc=11059200; //22118400L //定義主時鐘(精確計算115200波特率)
- bit B_TX1_Busy; //發送忙標志
- bit sign_usart1_receive12char=0; //串口1接收標志量
- sbit DIP1_port =P1^7; //撥碼開關8個位
- sbit DIP2_port =P5^5;
- sbit DIP3_port =P3^7;
- sbit DIP4_port =P3^6;
- sbit DIP5_port =P3^5;
- sbit DIP6_port =P3^4;
- sbit DIP7_port =P3^3;
- sbit DIP8_port =P3^2;
- sbit C_BI_port =P1^0; //方波B向口
- sbit C_FI_port =P1^1; //方波F向口
- #define Timer0_Reload (MAIN_Fosc / 1000) //Timer 0 中斷頻率, 1000次/秒
- unsigned char ch=0; //1----16 CHANNEL1 2:CHANEL16
- unsigned char RX1_Buffer[UART1_BUF_LENGTH],r=0; //接收緩沖
- unsigned char DIP_8SW_H=0,DIP_8SW_L=0,TH_MS_VAL=0;
- unsigned char Xms_cnt=100;
- unsigned char DELAY_CNT=5,delay_cnt=0; //B向 F向關閉后延時MS數 固定
- //函數說明
- void Timer0_init(void);
- void delay_X100MS(unsigned char ts); //@11.0592MHz
-
- void UART1_config(u8 brt); //選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- void PrintString1(u8 *puts);
- void sendData(unsigned char dat);
- void do_task(unsigned char x);
- void execute_cmd(void);
- void scan_dip_8SW();
- //=================================================================================================================
- //--------------------------------------------------------------------------------------------------
- // 函數名稱: g_delay(unsigned int times)
- // 入口參數:
- // 函數功能: 幾個100MS時
- //--------------------------------------------------------------------------------------------------
- void delay_X100MS(unsigned char ts) //@11.0592MHz
- {
- unsigned char i, j, k;
- for(;ts>0;ts--)
- {
- _nop_();
- _nop_();
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- }
- //--------------------------------------------------------------------------------------------------
- // 函數名稱:void Delay10ms() //@11.0592MHz
- // 入口參數:
- // 函數功能: 幾個100MS時
- //--------------------------------------------------------------------------------------------------
- void Delay10ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 108;
- j = 145;
- do
- {
- while (--j);
- } while (--i);
- }
- //--------------------------------------------------------------------------------------------------
- // 函數名稱:void Delay1ms() //@11.0592MHz
- // 入口參數:
- // 函數功能: 幾個100MS時
- //--------------------------------------------------------------------------------------------------
- void Delay1ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 15;
- j = 90;
- do
- {
- while (--j);
- } while (--i);
- }
- //========================================================================
- // 函數: void scan_dip_8SW()
- // 描述: 串口1發送字節函數。
- // 參數: dat: 字節
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void scan_dip_8SW() //檢測撥碼開關的值
- {
- unsigned char w_h, w_l;
-
- DIP_8SW_H=0,DIP_8SW_L=0;
-
-
- if(DIP1_port==0) w_l|=0x01;
- else w_l&=0x0E;
-
- if(DIP2_port==0) w_l|=0x02;
- else w_l&=0x0D;
-
- if(DIP3_port==0) w_l|=0x04;
- else w_l&=0x0B;
-
- if(DIP4_port==0) w_l|=0x08;
- else w_l&=0x07;
-
-
- if(DIP5_port==0) w_h|=0x01;
- else w_h&=0x0E;
-
- if(DIP6_port==0) w_h|=0x02;
- else w_h&=0x0D;
- if(DIP7_port==0) w_h|=0x04;
- else w_h&=0x0B;
- if(DIP8_port==0) w_h|=0x08;
- else w_h&=0x07;
- if(DIP_8SW_H==0xff &&DIP_8SW_L==0xff) //1秒鐘方波
- {
- TH_MS_VAL=1000;//1000MS
- }
- else //1MS到119MS方波
- {
- DIP_8SW_H=w_h&0x0F; //ms數的十位:0--11
- if(DIP_8SW_H>11) DIP_8SW_H=11;
- DIP_8SW_L=w_l&0x0f; //ms數的個位:0--9
- if(DIP_8SW_L>9) DIP_8SW_L=9;
-
- TH_MS_VAL=DIP_8SW_H*10+DIP_8SW_L; //1--119MS
- }
-
- //sendData(10*DIP_8SW_H); //通過串口檢測設置值
- //sendData(DIP_8SW_L);
- }
- //========================================================================
- // 函數: void sendData(unsigned char dat)
- // 描述: 串口1發送字節函數。
- // 參數: dat: 字節
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void sendData(unsigned char dat)
- {
- while (B_TX1_Busy); //等待前面的數據發送完成
- B_TX1_Busy= 1;
- SBUF = dat;//ACC; //寫數據到UART數據寄存器
- }
- //========================================================================
- // 函數: void execute_cmd(void)
- // 描述: 執行通道切換 返回OK字符
- // 參數: none.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void execute_cmd(void)
- {
- if(sign_usart1_receive12char==1) //
- {
- //do_task(ch);ch=0XFF; //切到通道x //通道x的LED亮 //應答OK字符 //清除標志
- }
- scan_dip_8SW(); //檢測撥碼開關的狀態
- }
- //========================================================================
- // 函數: void PrintString1(u8 *puts)
- // 描述: 串口1發送字符串函數。
- // 參數: puts: 字符串指針.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void PrintString1(u8 *puts)
- {
- for (; *puts != 0; puts++) //遇到停止符0結束
- {
- SBUF = *puts;
- B_TX1_Busy = 1;
- while(B_TX1_Busy);
- }
- }
- //========================================================================
- // 函數: void UART1_config(u8 brt)
- // 描述: UART1初始化函數。
- // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void UART1_config(u8 brt)
- {
- /*********** 波特率使用定時器1 *****************/
- TR1 = 0;
- AUXR &= ~0x01; //S1 BRT Use Timer1;
- AUXR |= (1<<6); //Timer1 set as 1T mode
- TMOD &= ~(1<<6); //Timer1 set As Timer
- TMOD &= ~0x30; //Timer1_16bitAutoReload;
- //TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
- //TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);
- TL1 = 0xE8; //
- TH1 = 0xFF; //
- ET1 = 0; //禁止中斷
- //INT_CLKO &= ~0x02; //不輸出時鐘
- INTCLKO&= ~0x02; //不輸出時鐘
- TR1 = 1;
-
- /*************************************************/
- SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位輸出, 0x40: 8位數據,可變波特率, 0x80: 9位數據,固定波特率, 0xc0: 9位數據,可變波特率
- // PS = 1; //高優先級中斷
- ES = 1; //允許中斷
- REN = 1; //允許接收
- P_SW1 &= 0x3f; //串口1使用P3.0 P3.1
- // P_SW1 |= 0x00; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4
- // PCON2 |= (1<<4); //內部短路RXD與TXD, 做中繼, ENABLE,DISABLE
- // IPH|=0X10; //0X11 串口1中斷級為最高第3級
- // PS=1;
-
- IPH|=0X10; //0X11 串口1中斷級為最高第2級
- PS=0;
-
- B_TX1_Busy = 0;
- TX1_Cnt = 0;
- RX1_Cnt = 0;
- }
- //========================================================================
- // 函數: void UART1_int (void) interrupt UART1_VECTOR
- // 描述: UART1中斷函數。
- // 參數: nine.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void UART1_int (void) interrupt 4
- {
- // if(RI)
- // {
- // RI = 0;
- // RX1_Buffer[RX1_Cnt] = SBUF;
- // if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0;
- // }
- // if(TI)
- // {
- // TI = 0;
- // B_TX1_Busy = 0;
- // }
-
- if(RI)
- {
- RI = 0;
- r= SBUF;
- if(r==0xaa) RX1_Cnt=0;
- RX1_Buffer[RX1_Cnt] = r;
-
- //------
- sign_usart1_receive12char=1; //收到了字節 標志位置1
- //------
-
- if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0; //防溢出
- }
- if(TI)
- {
- TI = 0;
- B_TX1_Busy = 0;
- }
-
- }
- //========================================================================
- // 函數: void Timer0_init(void)
- // 描述: timer0初始化函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void Timer0_init(void)
- {
- TR0 = 0; //停止計數
- ET0 = 1; //允許中斷
- INTCLKO &= ~0x01; //不輸出時鐘
- AUXR |= 0x80; //1T
- TMOD &= 0xF0; //定時器模式
-
- TL0 = 0xCD; //初值 1ms
- TH0 = 0xD4; //
-
- TF0 = 0; //清除TF0
- TR0 = 1; //開起 T0
- }
- //========================================================================
- // 函數: void timer0_int (void) interrupt TIMER0_VECTOR
- // 描述: timer0中斷函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void timer0_int (void) interrupt 1
- {
-
- if(Xms_cnt) Xms_cnt--;
- if(Xms_cnt==0)
- {
- Xms_cnt=TH_MS_VAL;
-
- if(C_FI_port==1) //F向口切換,產生方波 //B向口切換,產生方波
- {
- C_BI_port=1;
- //最好加1MS到幾MS延時
- C_FI_port=0;
- }
- else
- {
- C_FI_port=1;
- //最好加1MS到幾MS延時
- C_BI_port=0;
- }
- }
- }
- //========================================================================
- // 函數: void main(void)
- // 描述: 主函數。
- // 參數: none.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void main(void)
- {
- //IO初始說明
- //sfr PXM1 = 0xYY; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull
- //sfr PXM0 = 0xYY; // =10--->pure input, 11--->open drain
- start:
- P1M1 = 0x00;
- P1M0 = 0x03; //P1.1 1.0強輸出 其它口雙向口
- // P3M1 = 0x00;
- // P3M0 = 0xFC; //3.1 3.0 雙向口 其它口強輸出
- P3M1 = 0x00;
- P3M0 = 0x00; //3.1 3.0 雙向口 其它口雙向口
-
- // P5M1 = 0x00;
- // P5M0 = 0x30; //P5.5 5.4強輸出 其它口雙向口
- P5M1 = 0x00;
- P5M0 = 0x00; //P5.5 5.4雙向口 其它口雙向口
- DIP1_port=1; //開關口置高
- DIP2_port=1;
- DIP3_port=1;
- DIP4_port=1;
- DIP5_port=1;
- DIP6_port=1;
- DIP7_port=1;
- DIP8_port=1;
-
- C_BI_port=0; //初始B向口一直為低,控制繼電器的通斷由F向口控制接通或 斷開
- EA = 0; //關全局中斷
- delay_X100MS(5); //delay_X100MS(5);
- Timer0_init();
- UART1_config(1); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- //UART2_config(2); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
- delay_X100MS(1);
-
- RX1_Cnt=0; RX1_Buffer[0]=0; RX1_Buffer[1]=0;RX1_Buffer[2]=0;RX1_Buffer[3]=0;
- EA = 1; //允許全局中斷
- while (1)
- {
- execute_cmd();
- }
- }
復制代碼
所有資料51hei附件下載:
STC8G1K08 HM2503_2.7z
(2.89 MB, 下載次數: 61)
2021-9-9 11:16 上傳
點擊文件名下載附件
壓縮包文檔 下載積分: 黑幣 -5
|