1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/objliu-asm_example_uart

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
asm_example_uart.c 4.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
objliu Отправлено 03.06.2021 06:44 6b9a268
//Project: asm_example_uart.prj
// Device: ASM8F001X1XI
// Memory: Flash 1KX14b, EEPROM 128X8b, SRAM 64X8b
// Author:
//Company:
//Version:
// Date:
//===========================================================
//===========================================================
#include <ASM8F001X1XI.H>
#include "SYSCFG.h";
#include "Tmr0.h"
#include "PowerInit.h"
#include "delay.h"
#define UART_SEND_PIN PORTAbits.PA5 //串口发送脚
#define UART_RECIVE_TRIS TRISAbits.TRISA4
#define UART_RECIVE_IOC IOCA4
#define UART_RECIVE_PIN PORTAbits.PA4//串口接收脚
//===========================================================
//Variable definition
unsigned char TMR0InitValue=57;
unsigned char dataEnable=1;
unsigned char read_temp_PIN;
unsigned char recive_start_bit=1;
//===========================================================
//===========================================================
//Funtion name:interrupt ISR
//parameters:无
//returned value:无
//===========================================================
void interrupt ISR(void)
{
if(INTCONbits.T0IE&&INTCONbits.T0IF){
dataEnable=0;
TMR0 = TMR0InitValue;
//PORTAbits.PA5=~PORTAbits.PA5;
//关闭中断
T0IE=0;
//软件清零
INTCONbits.T0IF = 0;
}
if(PAIE&&PAIF){
read_temp_PIN=PORTA;//读取下PA
INTCONbits.PAIF=0;//软件清零
recive_start_bit=0;//表示可以开始接受数据了
PAIE=0;//关闭中断
UART_RECIVE_IOC=0;//禁止接收引脚电平中断
}
}
void uartRecevInit(){
OPTIONbits.INTEDG=0;//下降沿触发中断
UART_RECIVE_TRIS=1;//输入线
UART_RECIVE_PIN=1;//默认高电平
WPUA4=1;//使能PA4弱上拉
UART_RECIVE_IOC=1;//允许PA4中断
read_temp_PIN=PORTA;//读取下PA
INTCONbits.PAIF=0;//软件清零
INTCONbits.PAIE=1;//使能外部中断
}
/**
* 打开TMR0
*/
void open_timer_int() {//设置初值之前清零 T0ON = 0;
T0CON0bits.T0ON=0;
T0IE=0;
TMR0 = (TMR0InitValue+11);
T0CON0bits.T0ON=1;
INTCONbits.T0IF = 0;
T0IE=1;
}
/**
*接收数据
* @return 接收到的字节
*/
unsigned char uartReceive(){
unsigned char result=0;
//===============================
//打开引脚中断
PAIE=1;//打开中断
UART_RECIVE_IOC=1;//接收引脚电平中断
//===============================
//关闭TMR0中断
T0IE=0;
//===============================
dataEnable=1;
recive_start_bit=1;
//等待接收脚产生中断接收条件
while (recive_start_bit);
//条件复位
recive_start_bit=1;
//延迟104/2us
DelayUs(26);
//打开TMR0中断 开始计时
open_timer_int();
//等待104us采样
while (dataEnable);
//开始采样 从最低位到高位采样
for (int i = 0; i < 8; ++i) {
dataEnable=1;
result|=UART_RECIVE_PIN<<i;
T0IE=1;
//等待下一次采样
while (dataEnable);
}
//复原采样条件
dataEnable=1;
//无校验位
//延迟到停止位
while (!UART_RECIVE_PIN);
//打开计时器中断
T0IE=1;
//延时到停止位停留的末尾
while (dataEnable);
dataEnable=1;
//关闭计时器中断
T0IE=0;
return result;
}
/**
* uart发送数据
* @param data 发送的数据
*/
void uart_sendByte(unsigned char data){
//复原数据发送条件
dataEnable=1;
UART_SEND_PIN=1;
UART_SEND_PIN=0;//起始位
//打开tmr0
open_timer_int();
//等待数据变化的时间条件
while (dataEnable);
for (int i = 0; i < 8; ++i) {
dataEnable=1;
UART_SEND_PIN= 0x01 & (data >> i);
T0IE=1;
while (dataEnable);
}
dataEnable=1;
//最后输出停止位
UART_SEND_PIN=1;
T0IE=1;
while (dataEnable);
//关闭中断
T0IE=0;
}
//===========================================================
//上电系统初始化
void power_init(){
//选择系统时钟源
init_osc(_16Mhz);
//暂时关闭中断
intset_close();
//初始化IO引脚
ioInit();
PORTAbits.PA5=1;
}
//===========================================================
//Funtion name:main
//parameters:无
//returned value:无
//===========================================================
main()
{
power_init();
//9600波特率 1/9600=104us
//
//初始化定时器TMR0
timerInit(TMR0InitValue,0,tPS_2);
//初始化接收器
uartRecevInit();
UART_SEND_PIN=1;
// DelayS(2);
// //关闭中断
//
//
// uart_sendByte(0xF2);
while(1){
_nop();
//从uart接收信息
unsigned char reslt=uartReceive();
//将接收到的信息发送出去
uart_sendByte(reslt);
}
}
//===========================================================

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/objliu-asm_example_uart.git
git@api.gitlife.ru:oschina-mirror/objliu-asm_example_uart.git
oschina-mirror
objliu-asm_example_uart
objliu-asm_example_uart
master