STC15W408AS 有定時器0和定時器2 注意:無定時器1
- /*---------------------------------------------------------------------*/
- /* --- STC MCU Limited ------------------------------------------------*/
- /* --- STC15W408AS 系列 定時器2用作串口1的波特率發(fā)生器舉例------------*/
- /* --- Mobile: (86)13922805190 ----------------------------------------*/
- /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
- /* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
- /* --- Web: www.STCMCU.com --------------------------------------------*/
- /* --- Web: www.GXWMCU.com --------------------------------------------*/
- /* 如果要在程序中使用此代碼,請在程序中注明使用了STC的資料及程序 */
- /* 如果要在文章中應用此代碼,請在文章中注明使用了STC的資料及程序 */
- /*---------------------------------------------------------------------*/
- //本示例在Keil開發(fā)環(huán)境下請選擇Intel的8058芯片型號進行編譯
- //若無特別說明,工作頻率一般為11.0592MHz
- //STC15W408AS 有定時器0和定時器2 (注意:無定時器1, 有3路CCP可作3個定時器使用)
- #include "reg51.h"
- #include "intrins.h"
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- #define u16 unsigned int
- #define u8 unsigned char
- #define FOSC 11059200L //系統(tǒng)頻率
- #define BAUD 19200 //串口波特率
- #define MAIN_Fosc 11059200L //定義主時鐘
- #define Main_Fosc_KHZ (MAIN_Fosc / 1000)
- #define NONE_PARITY 0 //無校驗
- #define ODD_PARITY 1 //奇校驗
- #define EVEN_PARITY 2 //偶校驗
- #define MARK_PARITY 3 //標記校驗
- #define SPACE_PARITY 4 //空白校驗
- #define PARITYBIT NONE_PARITY //定義校驗位
- sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 為雙向口模式 01--->push-pull 為推挽輸出模式
- sfr P1M0 = 0x92; // =10--->pure input,為高阻輸入模式 11--->open drain 為開漏模式
- sfr P2M1 = 0x95;
- sfr P2M0 = 0x96;
- sfr P3M1 = 0xb1;
- sfr P3M0 = 0xb2;
- //sfr AUXR = 0x8e; //輔助寄存器
- sfr T2H = 0xd6; //定時器2高8位
- sfr T2L = 0xd7; //定時器2低8位
- sfr P_SW1 = 0xA2; //外設功能切換寄存器1
- sfr AUXR = 0x8e; //輔助特殊功能寄存器
- sfr INT_CLKO = 0x8f; //喚醒和時鐘輸出功能寄存器
- sbit T0CLKO = P3^5; //定時器0的時鐘輸出腳
- #define F38_4KHz (65536-FOSC/2/38400) //1T模式
- //#define F38_4KHz (65536-FOSC/2/12/38400) //12T模式
- #define S1_S0 0x40 //P_SW1.6
- #define S1_S1 0x80 //P_SW1.7
- u8 idata CRC[2];
- u8 data1,data2;
- u8 pf;
- u8 flag,flag1;
- sbit key2=P1^4;
- bit busy;
- void SendData(BYTE dat);
- void SendString(char *s);
- //========================================================================
- // 函數(shù): void delay_ms(unsigned char ms)
- // 描述: 延時函數(shù)。
- // 參數(shù): ms,要延時的ms數(shù), 這里只支持1~255ms. 自動適應主時鐘.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2013-4-1
- // 備注:
- //========================================================================
- void delay_ms(unsigned char ms)
- {
- unsigned int i;
- do{
- i = MAIN_Fosc / 13000;
- while(--i) ; //14T per loop
- }while(--ms);
- }
- void send(void)
- {
- key2=1;
- delay_ms(200);
- SBUF=0x01;
- while(TI==0)
- {
- ;
- }
- TI=0;
- key2=0;
- delay_ms(200);
- key2=1;
- if(data1!=0x01)
- {
- SBUF=0x0f;
- while(TI==0)
- {
- ;
- }
- TI=0;
- }
- else{
- SBUF=0x09;
- while(TI==0)
- {
- ;
- }
- TI=0;
- }
- }
- void main()
- {
- u8 i;
- u16 data1;
- u8 data2=0;
-
- P1M0 = 0x00;
- P1M1 = 0x00;
- P2M0 = 0x00;
- P2M1 = 0x00;
- P3M0 = 0x10; //P3^5為推挽輸出模式
- P3M1 = 0x00;
- //特別注意:若要使用T0CLKO時鐘輸出功能,必須將P3.5口 設置為強推挽輸出模式。
-
- AUXR |= 0x80; //定時器0為1T模式
- // AUXR &= ~0x80; //定時器0為12T模式
- TMOD = 0x00; //設置定時器為模式0(16位自動重裝載)
-
- TMOD &= ~0x04; //C/T0=0, 對內(nèi)部時鐘進行時鐘輸出
- // TMOD |= 0x04; //C/T0=1, 對T0引腳的外部時鐘進行時鐘輸出
- TL0 = F38_4KHz; //初始化計時值
- TH0 = F38_4KHz >> 8;
- TR0 = 1;
- INT_CLKO = 0x01; //使能定時器0的時鐘輸出功能
- // ACC = P_SW1;
- // ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
- // P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
-
- // ACC = P_SW1;
- // ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
- // ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
- // P_SW1 = ACC;
- //
- ACC = P_SW1;
- ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=1
- ACC |= S1_S1; //(P1.6/RxD_3, P1.7/TxD_3)
- P_SW1 = ACC;
- #if (PARITYBIT == NONE_PARITY)
- SCON = 0x50; //8位可變波特率
- #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
- SCON = 0xda; //9位可變波特率,校驗位初始為1
- #elif (PARITYBIT == SPACE_PARITY)
- SCON = 0xd2; //9位可變波特率,校驗位初始為0
- #endif
- T2L = (65536 - (FOSC/4/BAUD)); //設置波特率重裝值
- T2H = (65536 - (FOSC/4/BAUD))>>8;
- AUXR = 0x14; //T2為1T模式, 并啟動定時器2
- AUXR |= 0x01; //選擇定時器2為串口1的波特率發(fā)生器
- ES = 1; //使能串口1中斷
- EA = 1;
- while (1)
- {
- if(key2==1)
- send();
- delay_ms(200);
-
- }
- }
- /*----------------------------
- UART 中斷服務程序
- -----------------------------*/
- void Uart() interrupt 4
- {
- if (RI)
- {
- RI = 0; //清除RI位
- P0 = SBUF; //P0顯示串口數(shù)據(jù)
- P22 = RB8; //P2.2顯示校驗位
- }
- if (TI)
- {
- TI = 0; //清除TI位
- busy = 0; //清忙標志
- }
- }
- /*----------------------------
- 發(fā)送串口數(shù)據(jù)
- ----------------------------*/
- void SendData(BYTE dat)
- {
- while (busy); //等待前面的數(shù)據(jù)發(fā)送完成
- ACC = dat; //獲取校驗位P (PSW.0)
- if (P) //根據(jù)P來設置校驗位
- {
- #if (PARITYBIT == ODD_PARITY)
- TB8 = 0; //設置校驗位為0
- #elif (PARITYBIT == EVEN_PARITY)
- TB8 = 1; //設置校驗位為1
- #endif
- }
- else
- {
- #if (PARITYBIT == ODD_PARITY)
- TB8 = 1; //設置校驗位為1
- #elif (PARITYBIT == EVEN_PARITY)
- TB8 = 0; //設置校驗位為0
- #endif
- }
- busy = 1;
- SBUF = ACC; //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
- }
- /*----------------------------
- 發(fā)送字符串
- ----------------------------*/
- void SendString(char *s)
- {
- while (*s) //檢測字符串結(jié)束標志
- {
- SendData(*s++); //發(fā)送當前字符
- }
- }
復制代碼 |