📄 time_uart.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 + -