|
1.使用國(guó)產(chǎn)STC81K小芯片的工程,可供相關(guān)學(xué)習(xí)研究的人員學(xué)習(xí)交流;
2.使用國(guó)產(chǎn)直流電機(jī)正反轉(zhuǎn)控制芯片,控制方案簡(jiǎn)單,體積小,電流在3A左右;
3.調(diào)速使用外接撥碼開關(guān)設(shè)置速度;
4.本工程中有,原理圖,PCB圖,原代碼,設(shè)置速度的表 HM2503的PDFU資料;
5.全部資料,在壓縮包中;
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (58.5 KB, 下載次數(shù): 55)
下載附件
2021-9-9 16:12 上傳
單片機(jī)源程序如下:
- /************* 功能說(shuō)明 *********************************************
- 1.檢測(cè)撥碼開關(guān)狀態(tài),以確定IO口輸出方波的時(shí)間長(zhǎng)短
- 程序工作流:
- 1.上電IO產(chǎn)生方波,
- 2.檢測(cè)撥碼開關(guān)狀態(tài),自動(dòng)調(diào)節(jié)方波時(shí)間,最長(zhǎng)1000MS為固定;調(diào)節(jié)范圍:1ms--119ms
-
- 適用:用于ATQ229繼電器老化
- *************************************************************************/
- //#include "reg51.h" //包含此頭文件后,里面聲明的寄存器不需要再手動(dòng)輸入,避免重復(fù)定義
- #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; //發(fā)送計(jì)數(shù)
- unsigned char RX1_Cnt; //接收計(jì)數(shù)
- unsigned long MAIN_Fosc=11059200; //22118400L //定義主時(shí)鐘(精確計(jì)算115200波特率)
- bit B_TX1_Busy; //發(fā)送忙標(biāo)志
- bit sign_usart1_receive12char=0; //串口1接收標(biāo)志量
- sbit DIP1_port =P1^7; //撥碼開關(guān)8個(gè)位
- 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向關(guān)閉后延時(shí)MS數(shù) 固定
- //函數(shù)說(shuō)明
- 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();
- //=================================================================================================================
- //--------------------------------------------------------------------------------------------------
- // 函數(shù)名稱: g_delay(unsigned int times)
- // 入口參數(shù):
- // 函數(shù)功能: 幾個(gè)100MS時(shí)
- //--------------------------------------------------------------------------------------------------
- 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);
- }
- }
- //--------------------------------------------------------------------------------------------------
- // 函數(shù)名稱:void Delay10ms() //@11.0592MHz
- // 入口參數(shù):
- // 函數(shù)功能: 幾個(gè)100MS時(shí)
- //--------------------------------------------------------------------------------------------------
- void Delay10ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 108;
- j = 145;
- do
- {
- while (--j);
- } while (--i);
- }
- //--------------------------------------------------------------------------------------------------
- // 函數(shù)名稱:void Delay1ms() //@11.0592MHz
- // 入口參數(shù):
- // 函數(shù)功能: 幾個(gè)100MS時(shí)
- //--------------------------------------------------------------------------------------------------
- void Delay1ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 15;
- j = 90;
- do
- {
- while (--j);
- } while (--i);
- }
- //========================================================================
- // 函數(shù): void scan_dip_8SW()
- // 描述: 串口1發(fā)送字節(jié)函數(shù)。
- // 參數(shù): dat: 字節(jié)
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void scan_dip_8SW() //檢測(cè)撥碼開關(guān)的值
- {
- 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數(shù)的十位:0--11
- if(DIP_8SW_H>11) DIP_8SW_H=11;
- DIP_8SW_L=w_l&0x0f; //ms數(shù)的個(gè)位: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); //通過串口檢測(cè)設(shè)置值
- //sendData(DIP_8SW_L);
- }
- //========================================================================
- // 函數(shù): void sendData(unsigned char dat)
- // 描述: 串口1發(fā)送字節(jié)函數(shù)。
- // 參數(shù): dat: 字節(jié)
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void sendData(unsigned char dat)
- {
- while (B_TX1_Busy); //等待前面的數(shù)據(jù)發(fā)送完成
- B_TX1_Busy= 1;
- SBUF = dat;//ACC; //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
- }
- //========================================================================
- // 函數(shù): void execute_cmd(void)
- // 描述: 執(zhí)行通道切換 返回OK字符
- // 參數(shù): none.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void execute_cmd(void)
- {
- if(sign_usart1_receive12char==1) //
- {
- //do_task(ch);ch=0XFF; //切到通道x //通道x的LED亮 //應(yīng)答OK字符 //清除標(biāo)志
- }
- scan_dip_8SW(); //檢測(cè)撥碼開關(guān)的狀態(tài)
- }
- //========================================================================
- // 函數(shù): void PrintString1(u8 *puts)
- // 描述: 串口1發(fā)送字符串函數(shù)。
- // 參數(shù): puts: 字符串指針.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void PrintString1(u8 *puts)
- {
- for (; *puts != 0; puts++) //遇到停止符0結(jié)束
- {
- SBUF = *puts;
- B_TX1_Busy = 1;
- while(B_TX1_Busy);
- }
- }
- //========================================================================
- // 函數(shù): void UART1_config(u8 brt)
- // 描述: UART1初始化函數(shù)。
- // 參數(shù): brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void UART1_config(u8 brt)
- {
- /*********** 波特率使用定時(shí)器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; //不輸出時(shí)鐘
- INTCLKO&= ~0x02; //不輸出時(shí)鐘
- TR1 = 1;
-
- /*************************************************/
- SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位輸出, 0x40: 8位數(shù)據(jù),可變波特率, 0x80: 9位數(shù)據(jù),固定波特率, 0xc0: 9位數(shù)據(jù),可變波特率
- // PS = 1; //高優(yōu)先級(jí)中斷
- 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); //內(nèi)部短路RXD與TXD, 做中繼, ENABLE,DISABLE
- // IPH|=0X10; //0X11 串口1中斷級(jí)為最高第3級(jí)
- // PS=1;
-
- IPH|=0X10; //0X11 串口1中斷級(jí)為最高第2級(jí)
- PS=0;
-
- B_TX1_Busy = 0;
- TX1_Cnt = 0;
- RX1_Cnt = 0;
- }
- //========================================================================
- // 函數(shù): void UART1_int (void) interrupt UART1_VECTOR
- // 描述: UART1中斷函數(shù)。
- // 參數(shù): 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; //收到了字節(jié) 標(biāo)志位置1
- //------
-
- if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0; //防溢出
- }
- if(TI)
- {
- TI = 0;
- B_TX1_Busy = 0;
- }
-
- }
- //========================================================================
- // 函數(shù): void Timer0_init(void)
- // 描述: timer0初始化函數(shù).
- // 參數(shù): none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void Timer0_init(void)
- {
- TR0 = 0; //停止計(jì)數(shù)
- ET0 = 1; //允許中斷
- INTCLKO &= ~0x01; //不輸出時(shí)鐘
- AUXR |= 0x80; //1T
- TMOD &= 0xF0; //定時(shí)器模式
-
- TL0 = 0xCD; //初值 1ms
- TH0 = 0xD4; //
-
- TF0 = 0; //清除TF0
- TR0 = 1; //開起 T0
- }
- //========================================================================
- // 函數(shù): void timer0_int (void) interrupt TIMER0_VECTOR
- // 描述: timer0中斷函數(shù).
- // 參數(shù): 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向口切換,產(chǎn)生方波 //B向口切換,產(chǎn)生方波
- {
- C_BI_port=1;
- //最好加1MS到幾MS延時(shí)
- C_FI_port=0;
- }
- else
- {
- C_FI_port=1;
- //最好加1MS到幾MS延時(shí)
- C_BI_port=0;
- }
- }
- }
- //========================================================================
- // 函數(shù): void main(void)
- // 描述: 主函數(shù)。
- // 參數(shù): none.
- // 返回: none.
- // 版本:
- // 日期:
- // 備注:
- //========================================================================
- void main(void)
- {
- //IO初始說(shuō)明
- //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強(qiáng)輸出 其它口雙向口
- // P3M1 = 0x00;
- // P3M0 = 0xFC; //3.1 3.0 雙向口 其它口強(qiáng)輸出
- P3M1 = 0x00;
- P3M0 = 0x00; //3.1 3.0 雙向口 其它口雙向口
-
- // P5M1 = 0x00;
- // P5M0 = 0x30; //P5.5 5.4強(qiáng)輸出 其它口雙向口
- P5M1 = 0x00;
- P5M0 = 0x00; //P5.5 5.4雙向口 其它口雙向口
- DIP1_port=1; //開關(guān)口置高
- 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; //關(guān)全局中斷
- delay_X100MS(5); //delay_X100MS(5);
- Timer0_init();
- UART1_config(1); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- //UART2_config(2); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無(wú)效.
- 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();
- }
- }
復(fù)制代碼
所有資料51hei附件下載:
STC8G1K08 HM2503_2.7z
(2.89 MB, 下載次數(shù): 61)
2021-9-9 11:16 上傳
點(diǎn)擊文件名下載附件
壓縮包文檔 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|