#include "stm8s103f.h"
_Bool x; //模拟USART收到的数据
extern unsigned char TX_BUFFER[64];
extern unsigned char RX_y; //模拟口接收到的数据
extern unsigned char RX_BUFFER[64]; //usart接收到的数据
unsigned char a;
unsigned char b;
unsigned char Rx_Size; // 接收到的字节数
unsigned char RX_uenable;
unsigned int TX_MDELAY;
unsigned char z;
/* BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
* Copyright (c) 2007 STMicroelectronics
*/
typedef void @far (*interrupt_handler_t)(void);
struct interrupt_vector {
unsigned char interrupt_instruction;
interrupt_handler_t interrupt_handler;
};
@far @interrupt void NonHandledInterrupt (void)
{
/* in order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction
*/
unsigned char test;
test = 0;
return;
}
extern void _stext(); /* startup routine */
@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler (void)
{
static unsigned char RX_x=0; //模拟发送缓冲寄存器
static unsigned char TX_FLAG=0; //模拟收到数据标志
static unsigned char RX_start=0; //模拟接收的起始位标志
static unsigned char TX_start; //模拟发送的起始位标志
static unsigned char n=0; //模拟发送时循环8次 循环一次发一位
static unsigned char i=0; //模拟接收收到0的个数
static unsigned char j=0; //模拟接收收到1的个数,1多为1,0多为0,3取2
static unsigned char k=0; //模拟接收1到一位数据判断3次
static unsigned char m=0; //模拟接收数据发送时位循环8次
static unsigned char ZERO=0;
static unsigned char t=0;
static unsigned char c=0;
static unsigned char TX;
static unsigned char TX_mcount=0;
static unsigned char TX_ucount=0;
static unsigned char TX_uenable=0;
static unsigned char RX_menable=0;
static unsigned char TX_menable=0;
static unsigned int TX_UDELAY=0;
static unsigned char Rm_Size;
static unsigned char h1=0;
static unsigned char h2=0;
static unsigned char UTX=0;
static unsigned char MTX=0;
static unsigned char ut=0;
static _Bool u = 1; //RDR寄存器的位值
static unsigned int LED_DELAY=0; //通讯灯延时常数350ms
PCO5 = u;
if(PCI6==0)
{
i++;
if(RX_start==0&&!ZERO)
{
k = 0;
j = 0;
ZERO = 1;
}
}
else
j++;
k++;
if(k>=3)
{
if(i>=j)
x = 0;
else x = 1;
i = 0;
j = 0;
k = 0;
if(RX_start==0)
{
if(x==0)
{
RX_menable=1;
TX_UDELAY=0;
RX_y=0;
RX_start=1;
}
}
else
{
RX_y=RX_y>>1;
if(x==1)
RX_y|=0x80;
else
RX_y&=0x7f;
m++;
if(m>=8)
{
RX_start=0;
TX_BUFFER[a]=RX_y;
TX_FLAG=1;
a++;
Rm_Size++;
if(a>=64)
a=0;
PCO4=0;
m=0; //收完,等待下一个数据的起始位到来
ZERO = 0;
}
}
}
if(UTX&&TX_FLAG) //usart 发
{
TX_uenable=1;
TX_ucount=0;
if(USR_7==1) //DR寄存器数据移到移位寄存器
{
UART1_DR=TX_BUFFER[ut];
Rm_Size--;
ut++;
if(ut>=64)
ut=0;
if(Rm_Size==0)
{
TX_FLAG=0;
TX_uenable=0;
//UTX=0;
}
}
}
if(Rx_Size&&MTX) //模拟发送,收到字节数Rx_Size不为0开始
{
TX_menable=1;
TX_mcount=0;
t++;
if(t>=3)
{
t = 0;
if(TX_start==0)
{
u = 0;
RX_x=RX_BUFFER[TX]; //起始位发完读一次数据
n = 8;
TX_start=1;
}
else //开始发数据位
{
if(n)
{
u = RX_x & 0x01;
RX_x >>= 1;
n--;
}
else
{ //数据位发完开始发停止位,准备发下一个数据
u = 1;
t=0;
TX_start=0;
PCO4=0;
Rx_Size--;
TX++;
if(!Rx_Size)
{
TX_menable=0;
//MTX=0;
}
if(TX>=64)
TX=0;
}
}
}
}
if(UTX)
{
if(!TX_uenable)
{
TX_ucount++;
if(RX_menable)
{
TX_ucount=0;
}
if(TX_ucount>=36)
{
TX_ucount=0;
PDO4=0;
UTX=0;
}
}
}
if(MTX)
{
if(!TX_menable)
{
TX_mcount++;
if(RX_uenable)
{
TX_mcount=0;
}
if(TX_mcount>=6)
{
TX_mcount=0;
PCO7=0;
MTX=0;
}
}
}
if(RX_menable&&RX_uenable)
{
TX_UDELAY++;
TX_MDELAY++;
if(TX_UDELAY==60)
{
RX_menable=0;
TX_UDELAY=0;
}
if(TX_MDELAY==60)
{
RX_uenable=0;
TX_MDELAY=0;
}
}
else if(!RX_menable&&RX_uenable)
{
if(!MTX)
{
PCO7=1;
h1++;
if(h1==30)
{
MTX=1;
h1=0;
}
}
}
else if(!RX_uenable&&RX_menable)
{
if(!UTX)
{
PDO4=1;
h2++;
if(h2==30)
{
UTX=1;
h2=0;
}
}
}
if(RX_menable) //模拟收到数据后延时2ms
{
TX_UDELAY++;
if(TX_UDELAY==50)
{
RX_menable=0;
TX_UDELAY=0;
//if(RX_uenable) //uart收到数据
//PCO7=1; //模拟没收到数据转为485发(模拟端)
}
}
if(RX_uenable==1) //uart收到数据后延时2ms
{
TX_MDELAY++;
if(TX_MDELAY==50)
{
RX_uenable=0;
TX_MDELAY=0;
//if(RX_menable) //模拟收到数据
//PDO4==1; //uart没收到数据转为485发(uart端)
}
}
if(PCO4==0) //通讯灯亮350ms
{
LED_DELAY++;
if(LED_DELAY==10000)
{
LED_DELAY=0;
PCO4=1;
}
}
TIM1_SR1 = 0x00;
return;
}
@far @interrupt void USART_RX_IRQHandler (void)
{
z=USART_SR;
RX_BUFFER[b] = UART1_DR;
b++;
Rx_Size++; // 接收到的字节数++;
RX_uenable=1;
TX_MDELAY=0;
if(b>=64)
{
b=0;
}
return;
}
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, NonHandledInterrupt}, /* trap */
{0x82, NonHandledInterrupt}, /* irq0 */
{0x82, NonHandledInterrupt}, /* irq1 */
{0x82, NonHandledInterrupt}, /* irq2 */
{0x82, NonHandledInterrupt}, /* irq3 */
{0x82, NonHandledInterrupt}, /* irq4 */
{0x82, NonHandledInterrupt}, /* irq5 */
{0x82, NonHandledInterrupt}, /* irq6 */
{0x82, NonHandledInterrupt}, /* irq7 */
{0x82, NonHandledInterrupt}, /* irq8 */
{0x82, NonHandledInterrupt}, /* irq9 */
{0x82, NonHandledInterrupt}, /* irq10 */
{0x82, TIM1_UPD_OVF_TRG_BRK_IRQHandler}, /* irq11 */
{0x82, NonHandledInterrupt}, /* irq12 */
{0x82, NonHandledInterrupt}, /* irq13 */
{0x82, NonHandledInterrupt}, /* irq14 */
{0x82, NonHandledInterrupt}, /* irq15 */
{0x82, NonHandledInterrupt}, /* irq16 */
{0x82, NonHandledInterrupt}, /* irq17 */
{0x82, USART_RX_IRQHandler}, /* irq18 */
{0x82, NonHandledInterrupt}, /* irq19 */
{0x82, NonHandledInterrupt}, /* irq20 */
{0x82, NonHandledInterrupt}, /* irq21 */
{0x82, NonHandledInterrupt}, /* irq22 */
{0x82, NonHandledInterrupt}, /* irq23 */
{0x82, NonHandledInterrupt}, /* irq24 */
{0x82, NonHandledInterrupt}, /* irq25 */
{0x82, NonHandledInterrupt}, /* irq26 */
{0x82, NonHandledInterrupt}, /* irq27 */
{0x82, NonHandledInterrupt}, /* irq28 */
{0x82, NonHandledInterrupt}, /* irq29 */
};
usart.rar_RS485 中继器_USART RS485_rs485中继_中继器
版权申诉
138 浏览量
2022-09-14
17:21:04
上传
评论
收藏 59KB RAR 举报
小贝德罗
- 粉丝: 70
- 资源: 1万+
最新资源
- 基于图像的三维模型重建C++源代码+文档说明(高分课程设计)
- 基于聚焦法的工件立体测量方案,根据数据进行三维重建 使用HALCON处理图像,MATLAB拟合数据+源代码+数据集+效果图
- 锄战三国村 修改:货币使用不减 v1.10(2) 原创 (中文).apk
- 基于python实现的单目双目视觉三维重建+源代码+图像图片(高分课程设计)
- 基于C+++OPENCV的全景图像拼接源码(课程设计)
- 基于Python+OpenCV对多张图片进行全景图像拼接,消除鬼影,消除裂缝+源代码+文档说明+界面截图(高分课程设计)
- 基于C++实现的全景图像拼接源码(课程设计)
- 基于SIFT特征点提取和RASIC算法实现全景图像拼接python源码+文档说明+界面截图+详细注释(95分以上课程大作业)
- 基于matlab实现眼部判别的疲劳检测系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab的异常姿势识别系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈