資源簡介
STM8S003F只有一個串口,項目中需要兩個串口,因此采用IO口模擬一個串口。
此程序也是經理給的,經過測試可以用,不過需要耐心閱讀一下程序,理解串口程序的思路,能夠正確讀寫串口溫度傳感器的溫度值。

代碼片段和文件信息
#include?“suart.h“
//#include?“mh-z14.h“
SUART?suart;
static?void?set_rx_input(void)
{
????PD_DDR?&=?~(0x1?<3);??//input
????PD_CR1?|=?(0x1?<3);???//pull?up?input
}
static?void?set_tx_output(void)
{
????PD_DDR?|=?(0x1?<2);
????PD_CR1?|=?(0x1?<2);
????PD_CR2?|=?(0x1?<2);
}
void?suart_init(void)
{
????set_rx_input();
????set_tx_output();
????TX?=?1;
????
????memset(&suart?0?sizeof(SUART));
????suart.baudrate?=?9600;
????suart.mode?=?RX_MODE;
????suart.rxnum?=?9;
}
void?rx_int_switch(u8?flag)
{
????if?(flag)?{
????????PD_CR2?|=?(0x1?<3);???//enable?ext?int
????????EXTI_CR1?&=?(u8)(~MASK_EXTI_CR1_PDIS);
????????EXTI_CR1?|=?(u8)((u8)(0x02)?<6);????/*?設置為下降沿觸發中斷?*/
????}?else?{
????????PD_CR2?&=?~(0x1?<3);??//disable?ext?int
????}
}
void?tx_input_data(u16?data)
{
????u16?i?=?suart.txbuf.num?txchar?=?0;
????
????txchar?=?data;??//data?bit:?8bits
????txchar?<<=?1;???//start?bit:?1bit????????
????//parity?bit:?no
????txchar?|=?(0x3?<9);???//stop?bit:?2bits
????
????suart.txbuf.data[i]?=?txchar;
????suart.txbuf.num++;
}
void?tx_handler(void)
{
????u32?data?=?0?a?=?0;
????
????a?=?(suart.txbuf.data[suart.txbuf.txcnt]?>>?suart.txbuf.txbit);???//移位獲取需要發送的電平
????data?=?(a?&?0x01);
????if?(data?==?0x01)
????????TX?=?1;
????else
????????TX?=?0;
????
????suart.txbuf.txbit++;
????if?(suart.txbuf.txbit?==?11)?{????//發送完停止位進行判斷是否關閉定時器
????????suart.txbuf.txbit?=?0;
????????suart.txbuf.txcnt++;
????????
????????if?(suart.txbuf.txcnt?==?suart.txbuf.num)?{?//當發送緩沖隊列中數據全部發完時初始化相關資源
????????????suart.txbuf.txcnt?=?0;
????????????suart.txbuf.num?=?0;
????????????
????????????tim2_switch(OFF?0?TX_MODE);
????????????rx_int_switch(ON);
????????}
????}
}
static?u8?get_rx_bit(void)
{
????u8?i?=?0?bitsum?=?0;
????
????for?(;?i?3;?i++)
????????bitsum?+=?RX;
????
????if?(bitsum?2)
????????return?0;
????else
????????return?1;
}
void?rx_handler(void)
{
????u8?averbit?=?0;
????
????averbit?=?get_rx_bit();?//連續采三次電平值,根據最大比合并,得出電平值
????
????if?(suart.rxbuf.rxbit?==?0)?{
????????if?(averbit)????
????????????rx_enable();???
????????else???
????????????tim2_switch(ON?suart.baudrate?RX_MODE);
????????
????????suart.rxbuf.rxbit++;
????}?else?{
????????if?(suart.rxbuf.rxbit?9)?{??
????????????suart.rxbuf.SBUF?>>=?1;??
????????????
????????????if?(averbit)
????????????????suart.rxbuf.SBUF?|=?(0x1?<7);
????????????
????????????suart.rxbuf.rxbit++;
????????}?else?{??//stop?bit
????????????tim2_switch(OFF?0?RX_MODE);
????????????if?(averbit)?{??
????????????????suart.rxbuf.data[suart.rxbuf.num]?=?suart.rxbuf.SBUF;
????????????????suart.rxbuf.num++;
????????????}
????????????
????????????if?(suart.rxnum?!=?suart.rxbuf.num)
????????????????rx_enable();?
????????????else?{?
#if?0
????????????????u8?i?=?0;
????????????????for?(;?i?????????????????????tx_input_data(suart.rxbuf.data[i]);
????????????????tx_ena
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????3714??2017-02-26?14:40??suart.c
?????文件?????????904??2016-06-27?08:51??suart.h
評論
共有 條評論