资源简介
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
相关资源
- Quartus II 13.1 (64-bit)破解工具
- 计算机算法答案(computer algorithms in
- 72DJ舞曲网专用播放器Version2.2.2最新修
- 在TIA portal中连接第三方profinet IO 设备
- A8N-VM 刷bios(含工程师版的AFUDOS-可刷
- Vio-Jones算法原文
- 数字设计和计算机体系结构原书第二
- Quartus Prime 18.1 破解器
- BS8112A-3 BS8116A-3 I2C IO模拟程序
- keil uVision4 for ARM Cortex-M3 使用汇编
- vega64公版风冷BIOS
- intel_parallel_studio_xe_2013_update2_intel64_
- visual studio ultimate 2010
- speech-recognition
- iOS6.1、6.1.2和6.1.3伪激活文件
- Microsoft.Practices.ServiceLocation
- XMIExprt.dll
- 有感无刷电机驱动程序 已调试通过
- cocos2d搓牌-lua代码(完美运行安卓和
- Visio2010简体中文专业版64位.iso镜像.
- iOS开发指南 从Hello World到App Store上架
- 解决VisualStudio复制粘贴乱码的问题
- 自动计算mpu6050的偏移量MPU6050_calibra
- 可配置式GPIO模拟SPI总线方法的设计与
- iOS蓝牙连接多台设备
- Studio3T 破解器,激活
- 51单片机IO模拟SPI和25lc1024通信
- stm8 代码生成器
- STM8S 0.96寸OLED4线SPI驱动程序
-
Multi-focus image fusion ba
sed on wavelet t
评论
共有 条评论