⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 time_uart.c

📁 测试CAN接口(sja1000) ,每接收到一帧数据,就 原样 回发 一帧!!!! (拨码开关全 拨到 ON ,上位机 发送帧 ID为 0)
💻 C
字号:
//***************************************************************************************************
//描    述:系统定时、软件延时、UART处理模块                                                        *
//文 件 名:time_uart.c                                                                             *
//日    期:2007年08月10日                                                                          *
//***************************************************************************************************
//定时计数器A用于工步计时,使用 SMCLK

/*引用前需将以下外部定义包函进去

*/
/*
修改历史记录列表:

<修改日期>  <修改内容简述>
2007/08/10  建立  

*/
//***************************************************************************************************

#include "time_uart.h"

INT8U  st_count = 0;           //工步时间变量 6.25ms 计数
INT8U  steptime_sec = 0;       //工步时间变量 秒钟
INT16U steptime_minute = 0;    //工步时间变量 分钟

            //(当此标志为1时,在主程序中备份工步运行时间,并清0此标志;在定时中断中1分钟到则置位该标志)
INT8U  symbol_MinCome = 0;     //已过一分钟标志

//***************************************************************************************************
//*********************************  系统定时部分  **************************************************
//***************************************************************************************************


//***************************************************************************************************
//函数原型: void init_timeA(void)                                                                   *
//参数说明: 无                                                                                      *
//返 回 值: 无                                                                                      *
//说    明: 初始化定时计数器A,作为工步计时器                                                        *
//***************************************************************************************************
void init_timeA(void)
{
    TACTL   = TASSEL1 + TACLR + TAIE;    //选择 SMCLK ,直通,时钟不分频,清除 TAR,允许TimeA中断 

    TACCTL0 = CCIE;     //禁止捕获模式,TBCCR0 中断允许    
    TACCR0  = 50000;    //SMCLK时,时间间隔为 6.25ms    
//    TACTL  |= MC0;      //增计数模式,则启动了定时器A
}  

//***************************************************************************************************
//函数原型: void timerA_comp_isr(void)                                                              *
//参数说明: 无                                                                                      *
//返 回 值: 无                                                                                      *
//说    明: 定时器A 比较匹配中断 处理函数                                                           *
//***************************************************************************************************
#pragma vector = TIMERA0_VECTOR
__interrupt void timerA_comp_isr(void)
{
//    _DINT();                      //关闭中断

    TACTL &= ~BIT0;               //清除中断标志
    
    if(st_count > 159)            //1秒已到(6.25ms * 160 = 1s)
    {
        st_count = 1;
        
        if(steptime_sec > 59)     //1分已到
        {
            steptime_sec = 1;
            steptime_minute++;    //工步 分钟 变量
            
            symbol_MinCome = 1;   //已过一分钟标志(当此标志为1时,在主程序中备份工步运行时间,并清0此标志)
        }
        else
        {
            steptime_sec++;       //工步 秒钟 变量
        }
        
        //测试    LED2 以1秒的频率亮或灭一次
        if(P1OUT & BIT2)
        {
            P1OUT &= ~BIT2;    //如果P1.2=1,清除P1.2
        }
        else
        {
            P1OUT |= BIT2;    //           否则置1
        }
        
//        //测试 ------------------------------------------------------------------------------------------------------------------------------------
//        WDTCTL = WDTPW + WDTHOLD;    // Stop watchdog timer
    }
    else
    {
        st_count++;
    }
             
//    _EINT();                      //打开中断   
}


//***************************************************************************************************
//*********************************  软件延时部分  **************************************************
//***************************************************************************************************


//***************************************************************************************************
//函数原型: void delay_us(INT16U delay_value)                                                       *
//参数说明: delay_value ; 微秒为单位                                                                *
//返 回 值: 无                                                                                      *
//说    明: 软件延时delay_value微秒,8MHz为主时钟                                                   *
//***************************************************************************************************
void delay_us(INT16U delay_value)
{
    INT16U i;

    for(i = delay_value; i > 0; i--)
    {
        _NOP(); _NOP(); _NOP(); _NOP();
    }
    
    return;
}

//***************************************************************************************************
//函数原型: void delay_ms(INT16U delay_value)                                                       *
//参数说明: delay_value ; 毫秒为单位                                                                *
//返 回 值: 无                                                                                      *
//说    明: 软件延时delay_value毫秒,8MHz为主时钟                                                   *
//***************************************************************************************************
void delay_ms(INT16U delay_value)    //经试验,差不多
{
    INT16U i,j,n_count;

    for(i = delay_value; i > 0; i--)
    {
        n_count = 1982;
        
    	for(j = n_count; j > 0; j--)
        {
            ;
        }
    }
    
    return;
}



//***************************************************************************************************
//*********************************  UART部分  ******************************************************
//***************************************************************************************************


//***************************************************************************************************
//函数原型: void init_uart1(void)                                                                   *
//参数说明: 无                                                                                      *
//返 回 值: 无                                                                                      *
//说    明: UART1 初始化                                                                            *
//***************************************************************************************************
void init_uart1(void)
{
    UCTL1 = CHAR;              //不校验,8位数据,无反馈,工作在异步通信(UART)模式,使能UASRT1模块
    
//    UTCTL_1 |= SSEL0;          //时钟源选择 ACLK(32768Hz)
    UTCTL_1 |= SSEL1;          //时钟源选择 SMCLK(8M Hz)
    
//    UBR0_1 = 0x03;             //波特率为9600
    UBR0_1 = 0x45;             //波特率为 115200
    UBR1_1 = 0x00;
    UMCTL_1 = 0x49;    
  
    URCTL_1 = 0x00;            //清除接收错误标志
     
    ME2 |= (URXE1 + UTXE1);    //使能UART1的TXD和RXD
//    IE2 |= URXIE1;             //使能UART1的RX中断
}

//***************************************************************************************************
//函数原型: void uart1_sendbyte(INT8U data)                                                         *
//参数说明: data ; 要发送的字符                                                                     *
//返 回 值: 无                                                                                      *
//说    明: UART1 查询方式发送一个字符                                                              *
//***************************************************************************************************
void uart1_sendbyte(INT8U data)
{
    while((IFG2 & UTXIFG1) == 0);
    TXBUF1 = data;
}

//***************************************************************************************************
//函数原型: void uart1_printf_ch(INT8U *buf)                                                        *
//参数说明: buf ; 指向要输出的字符串                                                                *
//返 回 值: 无                                                                                      *
//说    明: 从 UART1 输出一个字符串                                                                 *
//***************************************************************************************************
void uart1_printf_ch(INT8U *buf)
{
    INT8U i;
    i = 0;
    while(buf[i] != '\0')
    {
        uart1_sendbyte(buf[i]);
        i++;
    } 
}

//***************************************************************************************************
//函数原型: void uart1_printf_num8(INT8U *data)                                                     *
//参数说明: buf ; 指向要输出的数据                                                                  *
//返 回 值: 无                                                                                      *
//说    明: 从 UART1 输出一个无符号8位整形数据(按10进制格式)                                        *
//***************************************************************************************************
void uart1_printf_num8(INT8U *data)
{
    INT8U temp1 = *data;
    INT8U temp2;
    
    if(temp1 > 99)
    {
        temp2 = (INT8U)(temp1 / 100);
        uart1_sendbyte(temp2 + 48);
        temp1 = temp1 - (INT16U)(temp2 * 100);
    }
    
    if(temp1 > 9)
    {
        temp2 = (INT8U)(temp1 / 10);
        uart1_sendbyte(temp2 + 48);
    }
    
    temp2 = (INT8U)(temp1 % 10);
    uart1_sendbyte(temp2 + 48);
    
    uart1_sendbyte(0x20);    //发送 空格
    uart1_sendbyte(0x20);
}

//***************************************************************************************************
//函数原型: void uart1_printf_num16(INT16U *data)                                                   *
//参数说明: buf ; 指向要输出的数据                                                                  *
//返 回 值: 无                                                                                      *
//说    明: 从 UART1 输出一个无符号16位整形数据(按10进制格式)                                       *
//***************************************************************************************************
void uart1_printf_num16(INT16U *data)
{
    INT16U temp1 = *data;
    INT8U  temp2;
    INT8U  zero_sign = 0;
    
    if(temp1 > 9999)
    {
        temp2 = (INT8U)(temp1 / 10000);
        uart1_sendbyte(temp2 + 48);
        temp1 = temp1 - (INT16U)(temp2 * 10000);
        zero_sign = 1;
    }
    
    if(temp1 > 999)
    {
        temp2 = (INT8U)(temp1 / 1000);
        uart1_sendbyte(temp2 + 48);
        temp1 = temp1 - (INT16U)(temp2 * 1000);
        zero_sign = 1;
    }
    else if(zero_sign != 0)
    {
        uart1_sendbyte(48);    //输出 0
    }
    
    if(temp1 > 99)
    {
        temp2 = (INT8U)(temp1 / 100);
        uart1_sendbyte(temp2 + 48);
        temp1 = temp1 - (INT16U)(temp2 * 100);
        zero_sign = 1;
    }
    else if(zero_sign != 0)
    {
        uart1_sendbyte(48);    //输出 0
    }
    
    if(temp1 > 9)
    {
        temp2 = (INT8U)(temp1 / 10);
        uart1_sendbyte(temp2 + 48);
        zero_sign = 1;
    }
    else if(zero_sign != 0)
    {
        uart1_sendbyte(48);    //输出 0
    }
    
    temp2 = (INT8U)(temp1 % 10);
    uart1_sendbyte(temp2 + 48);
    
    uart1_sendbyte(0x20);    //发送 空格
    uart1_sendbyte(0x20);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -