资源简介
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 < suart.rxnum; 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
相关资源
- AsyncTask文件控制暂停和继续,在状态
- Visio大全模具(含Cisco、IBM等常用拓扑
- AXURE移动端素材元件库68580
- Rational Rose Common破解文件
- umeshmotion网格推移
- Visio图标-最新最全的网络通信图标库
- 联想H61主板BIOS升级F9KT58AUS支持22NM.i
-
Actionsc
ript 1.0实现能跟随鼠标运动的 - The direction of synaptic plasticity mediated
- Reparatory Effects of Nicotine on NMDA Recepto
- Apolipoprotein E4 Impairs in vivo Hippocampal
- Histamine excites rat lateral vestibular nucle
- Lenovo Z460 SLIC2.1 LENOVO-29CN38WW(V2.15)
- 联想G400G500G490BIOS
- Fabrication and all-optical poling characteris
- Quartus II 15.0中仿真Altera三速以太网I
- Quartus II 15.0中仿真Altera三速以太网I
- ASUS BIOS 加NVME协议文件: Nvme.ffs NV
- VisualStudioUninstaller vs卸载工具
- adams vibration 练习原文件
- 3人表决器 QuartusII
- Verilog FPGA UART串口控制器
- STM32基于rt_thread操作系统的SDHC卡文件
- Phoenix BIOS Editor.rar
- 卡西欧工程计算器模拟器Casio FX
- 用DIO 做的I2C程式
- HP笔记本BIOS丢失解决方法,DMI TOOLK
- 关联分析Apriori算法实现
- Y450 BIOS白名单
- wifi局域网内双向语音实时通话
评论
共有 条评论