#include "iostm8s103f3.h"
#include "stdbool.h"
#include "intrinsics.h"
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define Send PD_ODR_ODR2
#define TIM1_COUNTERMODE_UP 0x00
#define TIM1_IT_UPDATE 0x01
#define DisableInterrupt __disable_interrupt();//关中断
#define EnableInterrupt __enable_interrupt() ;//开中断
void Tim1_Time_Upmode_conf(uint16_t TIM1_Prescaler,uint16_t TIM1_Period,uint8_t TIM1_RepetitionCounter);//定时器函数声明
void Delayms(unsigned int time);//精确毫秒
void delay_us(unsigned int a);//精确微秒
void Delayus(void);//精确微秒延时
void SendByte(u8 x);//发送字节
void SendStr(u8 *s);//发送字符串
void DOG_Init(void);//看门狗
void Init(void);//初始化
u8 add=0; //地址变量
//主函数
int main(void)
{
Init();
while(1)
{
SendStr("B");//发送字符串
if(add==50)add=0;
IWDG_KR=0xAA;
}
}
//数据发送逻辑
void SendByte(u8 x) //起始5ms+8位数据+8位地址+奇偶校验 0用500us低电平加500us高电平表示,1用500us低电平加1ms高电平表示
{ u8 m=0;
EnableInterrupt;
Delayms(3);//起始标志
DisableInterrupt;
Send=0;
if(0x1==(u8)((x >> 7) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((x >> 6) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((x >> 5) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((x >> 4) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((x >> 3) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((x >> 2) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((x >> 1) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)( x & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
//传输地址
if(add<50)
{
if(0x1==(u8)((add >> 7) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((add>> 6) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((add >> 5) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((add >> 4) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((add>> 3) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((add >> 2) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)((add >> 1) & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
if(0x1==(u8)( add & 0x1))
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
m++;
}
else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
add=add+1;
}
//奇偶校验
if(m%2==0)
{
delay_us(500);
EnableInterrupt;
Delayms(1);
DisableInterrupt;
Send=0;
} else{
delay_us(500);
EnableInterrupt;
delay_us(500);
DisableInterrupt;
Send=0;
}
Delayms(2);
}
void SendStr(u8 *s)
{
while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
{
SendByte(*s);
s++;
}
}
void Init(void)
{
CLK_CKDIVR&= (uint8_t)(~0x18);/*使能内部时钟*/
CLK_CKDIVR|= (uint8_t)0x00;/*设置时钟为内部16M高速时钟*/
PD_DDR|=0x0f;
PD_CR1|=0x0f;
PD_CR2|=0x0f;
DOG_Init();
Tim1_Time_Upmode_conf(16,21,0);//设置定时器 实现22us一个中断,一个周期44
Send=0;
}
//定时器函数
void Tim1_Time_Upmode_conf(uint16_t TIM1_Prescaler,
uint16_t TIM1_Period,
uint8_t TIM1_RepetitionCounter)
{
/* Set the Prescaler value */
TIM1_PSCRH = (uint8_t)(TIM1_Prescaler >> 8);
TIM1_PSCRL = (uint8_t)(TIM1_Prescaler);
/* Set the Autoreload value */
TIM1_ARRH = (uint8_t)(TIM1_Period >> 8);
TIM1_ARRL = (uint8_t)(TIM1_Period);
/* Select the Counter Mode */
TIM1_CR1