標(biāo)題:
stc15w408as串口可用程序
[打印本頁]
作者:
LCYXK
時(shí)間:
2020-1-10 08:45
標(biāo)題:
stc15w408as串口可用程序
可用串口調(diào)試
單片機(jī)源程序如下:
#include "stc15w.h"
//typedef unsigned char BYTE;
//typedef unsigned int WORD;
#define FOSC 11059200L //系統(tǒng)頻率
#define BAUD 115200 //串口波特率
#define NONE_PARITY 0 //無校驗(yàn)
#define ODD_PARITY 1 //奇校驗(yàn)
#define EVEN_PARITY 2 //偶校驗(yàn)
#define MARK_PARITY 3 //標(biāo)記校驗(yàn)
#define SPACE_PARITY 4 //空白校驗(yàn)
#define PARITYBIT NONE_PARITY //定義校驗(yàn)位
#define CCP_S0 0x00 //P_SW1.4
#define CCP_S1 0x00 //P_SW1.5
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
u8 cnt=0;
u8 TX_BUF[6]={0};
u16 count0=0;
u16 count1=0;
u16 length=0;
//BYTE cnt; //存儲PCA計(jì)時(shí)溢出次數(shù)
//DWORD count0; //記錄上一次的捕獲值
//DWORD count1; //記錄本次的捕獲值
//DWORD length; //存儲信號的時(shí)間長度(count1 - count0)
bit busy;
void SendData(u8 dat);
void SendString(char *s);
void delay_us(u16 t)
{
u8 i;
while(t--)
{
_nop_();
_nop_();
i = 1;
while (--i);
}
}
void delay_ms(u16 t)
{
while(t--)
{
// CLRWDT;
delay_us(1000);
}
}
void PCA_config(void)
{
P1M0 = 0x00;
P1M1 = 0x00;
P_SW1 |=0x00 ; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
CCON = 0; //初始化PCA控制寄存器
//PCA定時(shí)器停止
//清除CF標(biāo)志
//清除模塊中斷標(biāo)志
CL = 0; //復(fù)位PCA寄存器
CH = 0;
CCAP0L = 0;
CCAP0H = 0;
CMOD = 0x09; //設(shè)置PCA時(shí)鐘源為系統(tǒng)時(shí)鐘,且使能PCA計(jì)時(shí)溢出中斷
CCAPM0 = 0x21; //PCA模塊0為16位捕獲模式(上升沿捕獲,可測從高電平開始的整個周期),且產(chǎn)生捕獲中斷
// CCAPM0 = 0x11; //PCA模塊0為16位捕獲模式(下降沿捕獲,可測從低電平開始的整個周期),且產(chǎn)生捕獲中斷
// CCAPM0 = 0x31; //PCA模塊0為16位捕獲模式(上升沿/下降沿捕獲,可測高電平或者低電平寬度),且產(chǎn)生捕獲中斷
CR = 1; //PCA定時(shí)器開始工作
EA = 1;
cnt = 0;
count0 = 0;
count1 = 0;
}
/*----------------------------
PCA 中斷服務(wù)程序
-----------------------------*/
void PCA_isr() interrupt 7
{
if (CCF0)
{
CCF0 = 0;
if (CF && ((CCAP0H & 0x80) == 0))
{
CF = 0;
cnt++;
}
count0 = count1; //備份上一次的捕獲值
((u8 *)&count1)[3] = CCAP0L; //保存本次的捕獲值
((u8 *)&count1)[2] = CCAP0H;
((u8 *)&count1)[1] = cnt;
((u8 *)&count1)[0] = 0;
length = count1 - count0; //計(jì)算兩次捕獲的差值,即得到時(shí)間長度
((u8 *)&length)[0] = 0;
}
if (CF)
{
CF = 0;
cnt++; //PCA計(jì)時(shí)溢出次數(shù)+1
}
}
/*----------------------------
UART 中斷服務(wù)程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
P0 = SBUF; //P0顯示串口數(shù)據(jù)
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙標(biāo)志
}
}
/*----------------------------
發(fā)送串口數(shù)據(jù)
----------------------------*/
void SendData(u8 dat)
{
while (busy); //等待前面的數(shù)據(jù)發(fā)送完成
ACC = dat; //獲取校驗(yàn)位P (PSW.0)
if (P) //根據(jù)P來設(shè)置校驗(yàn)位
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 0; //設(shè)置校驗(yàn)位為0
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 1; //設(shè)置校驗(yàn)位為1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 1; //設(shè)置校驗(yàn)位為1
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 0; //設(shè)置校驗(yàn)位為0
#endif
}
busy = 1;
SBUF = ACC; //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
}
/*----------------------------
發(fā)送字符串
----------------------------*/
void SendString(char *s)
{
while (*s) //檢測字符串結(jié)束標(biāo)志
{
SendData(*s++); //發(fā)送當(dāng)前字符
}
}
/* 整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長度 */
u8 Int_To_String(u8 *str, int dat)
{
u8 i = 0;
u8 len = 0;
u8 buf[6];
if (dat < 0) //如果為負(fù)數(shù),首先取絕對值,并在指針上添加負(fù)號
{
dat = -dat;
*str++ = '-';
len++;
}
do { //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
buf[i++] = dat % 10;
dat /= 10;
} while (dat > 0);
len += i; //i最后的值就是有效字符的個數(shù)
while (i-- > 0) //將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
{
*str++ = buf[i] + '0';
}
*str = '\0'; //添加字符串結(jié)束符
return len; //返回字符串長度
}
void main()
{
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
P_SW1 = 0x00; //(P3.0/RxD, P3.1/TxD)
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可變波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可變波特率,校驗(yàn)位初始為1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可變波特率,校驗(yàn)位初始為0
#endif
T2L = (65536 - (FOSC/4/BAUD)); //設(shè)置波特率重裝值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2為1T模式, 并啟動定時(shí)器2
AUXR |= 0x01; //選擇定時(shí)器2為串口1的波特率發(fā)生器
ES = 1; //使能串口1中斷
EA = 1;
PCA_config();
SendString("STC15W408AS\r\nUart Test !\r\n");
while(1)
{
SendString("時(shí)間間隔為:");
Int_To_String(TX_BUF,length);
SendString("\r\n");
delay_ms(300);
}
}
復(fù)制代碼
所有資料51hei提供下載:
串口.zip
(52.55 KB, 下載次數(shù): 149)
2020-1-10 08:45 上傳
點(diǎn)擊文件名下載附件
串口接上可用,注意tx,rx接法
下載積分: 黑幣 -5
作者:
2314942018@qq.c
時(shí)間:
2020-12-30 06:11
多謝,老兄的源碼,多路繼電器成功了。
作者:
lhqsbz
時(shí)間:
2022-6-15 14:42
謝謝,先試試來看。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1