?? time_uart.c
字號:
//***************************************************************************************************
//描 述:系統(tǒng)定時、軟件延時、UART處理模塊 *
//文 件 名:time_uart.c *
//日 期:2007年08月10日 *
//***************************************************************************************************
//定時計數(shù)器A用于工步計時,使用 SMCLK
/*引用前需將以下外部定義包函進去
*/
/*
修改歷史記錄列表:
<修改日期> <修改內容簡述>
2007/08/10 建立
*/
//***************************************************************************************************
#include "time_uart.h"
INT8U st_count = 0; //工步時間變量 6.25ms 計數(shù)
INT8U steptime_sec = 0; //工步時間變量 秒鐘
INT16U steptime_minute = 0; //工步時間變量 分鐘
//(當此標志為1時,在主程序中備份工步運行時間,并清0此標志;在定時中斷中1分鐘到則置位該標志)
INT8U symbol_MinCome = 0; //已過一分鐘標志
//***************************************************************************************************
//********************************* 系統(tǒng)定時部分 **************************************************
//***************************************************************************************************
//***************************************************************************************************
//函數(shù)原型: void init_timeA(void) *
//參數(shù)說明: 無 *
//返 回 值: 無 *
//說 明: 初始化定時計數(shù)器A,作為工步計時器 *
//***************************************************************************************************
void init_timeA(void)
{
TACTL = TASSEL1 + TACLR + TAIE; //選擇 SMCLK ,直通,時鐘不分頻,清除 TAR,允許TimeA中斷
TACCTL0 = CCIE; //禁止捕獲模式,TBCCR0 中斷允許
TACCR0 = 50000; //SMCLK時,時間間隔為 6.25ms
// TACTL |= MC0; //增計數(shù)模式,則啟動了定時器A
}
//***************************************************************************************************
//函數(shù)原型: void timerA_comp_isr(void) *
//參數(shù)說明: 無 *
//返 回 值: 無 *
//說 明: 定時器A 比較匹配中斷 處理函數(shù) *
//***************************************************************************************************
#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(); //打開中斷
}
//***************************************************************************************************
//********************************* 軟件延時部分 **************************************************
//***************************************************************************************************
//***************************************************************************************************
//函數(shù)原型: void delay_us(INT16U delay_value) *
//參數(shù)說明: 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;
}
//***************************************************************************************************
//函數(shù)原型: void delay_ms(INT16U delay_value) *
//參數(shù)說明: 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部分 ******************************************************
//***************************************************************************************************
//***************************************************************************************************
//函數(shù)原型: void init_uart1(void) *
//參數(shù)說明: 無 *
//返 回 值: 無 *
//說 明: UART1 初始化 *
//***************************************************************************************************
void init_uart1(void)
{
UCTL1 = CHAR; //不校驗,8位數(shù)據(jù),無反饋,工作在異步通信(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中斷
}
//***************************************************************************************************
//函數(shù)原型: void uart1_sendbyte(INT8U data) *
//參數(shù)說明: data ; 要發(fā)送的字符 *
//返 回 值: 無 *
//說 明: UART1 查詢方式發(fā)送一個字符 *
//***************************************************************************************************
void uart1_sendbyte(INT8U data)
{
while((IFG2 & UTXIFG1) == 0);
TXBUF1 = data;
}
//***************************************************************************************************
//函數(shù)原型: void uart1_printf_ch(INT8U *buf) *
//參數(shù)說明: buf ; 指向要輸出的字符串 *
//返 回 值: 無 *
//說 明: 從 UART1 輸出一個字符串 *
//***************************************************************************************************
void uart1_printf_ch(INT8U *buf)
{
INT8U i;
i = 0;
while(buf[i] != '\0')
{
uart1_sendbyte(buf[i]);
i++;
}
}
//***************************************************************************************************
//函數(shù)原型: void uart1_printf_num8(INT8U *data) *
//參數(shù)說明: buf ; 指向要輸出的數(shù)據(jù) *
//返 回 值: 無 *
//說 明: 從 UART1 輸出一個無符號8位整形數(shù)據(jù)(按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); //發(fā)送 空格
uart1_sendbyte(0x20);
}
//***************************************************************************************************
//函數(shù)原型: void uart1_printf_num16(INT16U *data) *
//參數(shù)說明: buf ; 指向要輸出的數(shù)據(jù) *
//返 回 值: 無 *
//說 明: 從 UART1 輸出一個無符號16位整形數(shù)據(jù)(按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); //發(fā)送 空格
uart1_sendbyte(0x20);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -