📄 uart.c
字号:
#include <iom169v.h>
#include <macros.h>
#include <stdio.h>
#include "main.h"
#include "uart.h"
unsigned char relay_temp[7];
unsigned char *load;
//UART0 initialize
// desired baud rate: 19200
// actual: baud rate:19200 (0.0%)
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x07;
UBRR0L = 0x23; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
}
void put_c(unsigned char c) //发送采用查询方式
{
while( (UCSRA & 0b00100000)==0);
//delay_loop(5);
UDR=c;
}
void put_s(unsigned char *ptr)
{
while (*ptr)
{
put_c(*ptr++);
}
}
#pragma interrupt_handler uart0_rx_isr:14
void uart0_rx_isr(void)
{
if (load_time > 3)
{
load_no = 0;
load = &relay_temp[0];
}
load_time=0;
if(load_no<5)
{
*(load+load_no) = UDR;
load_no++;
}
}
void load_init()
{
load_time=0;
load_no=0;
load = &relay_temp[0];
}
void data_load_manage()
{
unsigned char sum_c, t; //和验算,循环次数
unsigned char *p;
if((load_no==5)) //下载完成条件
{
load_init(); //初始下载
sum_c = 0;
for (t=0; t<4; t++) //和验算
{
sum_c += (*load);
load++;
}
if (sum_c == (*load))
{ //刷新继电器值
load = &relay_temp[0];
p = Down_load.Relay_out;
for (t=0; t<5; t++)
{
*p = *load;
p++;
load++;
}
updating=1;
load = &relay_temp[0];
}
}
//长时间没收到上位机信号处理
if (load_time>500)
{
load_init();
relay_init(); //关闭全部继电器
}
}
void data_send()
{
unsigned char *send; //发送数据用指针
unsigned char l; //发送12字节循环
unsigned char sum_temp=0;//和效验
send=&send_data.exterior_switch;
for (l=0; l<17; l++)
{
sum_temp+=*send;
put_c(*send);
send++;
}
put_c(sum_temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -