📄 serial_comm_4.c
字号:
/**********************************************
* File: Serial_Comm_4.C
* Description: Serial Communication Example 3 Bluetooth
* Created Date: 2007-10-01
* Last Modified: 2007-10-01
* Author: Jeffrey - Schicksal@126.com
* Notes: None
**********************************************/
#include "Atmel/AT89X51.h"
#define BUFFER_LENGTH 50
unsigned char _Buffer[50];
unsigned char pWrite = 0;
unsigned char pRead = 0;
unsigned char UpdateFlag = 0;
unsigned char OverflowFlag = 0;
unsigned char LoopFlag = 0;
void RS232_SendData(unsigned char Sdata);
unsigned char ReadBuffer();
/**********************************************
* Function: delay(unsigned int t)
* Input Variables: t
* Return Variables: None
* Usage: Common Delay Routine, t as the delay time ticks
**********************************************/
void delay(unsigned int t)
{
for(;t>0;t--); // 延时循环
}
/**********************************************
* Function: RS232_Init(void)
* Input Variables: none
* Return Variables: None
* Usage: Init UART
**********************************************/
void RS232_Init()
{
SCON = 0x50; // UART工作于模式1, REN=1
TMOD = 0x20 ; // Timer1 工业于模式2
PCON |= 0x80; // SMOD1 = 1
TH1 = 0xF3; // 波特率9600 Bds at 24MHz
TL1 = 0xF3; // 波特率9600 Bds at 24MHz
ES = 1; // 串口中断使能
TR1 = 1; // 启动Timer1
}
/**********************************************
* Function: main()
* Input Variables: None
* Return Variables: None
* Usage: Program Entry
*********************************************/
void main()
{
unsigned char RevData; // 接收数据
unsigned char LED; // LED跑马灯状态
RS232_Init(); // 初始化UART
EA = 1; // 全局中断使能
while(1)
{
//********************主程序部分*********************//
if(UpdateFlag)
{
RevData = ReadBuffer(); // 读取数据
LED = ~RevData; // 设置LED灯状态
P0 = LED; // 点亮相应LED
RS232_SendData(RevData); // 发送数据
}
//********************主程序部分*********************//
}
}
/**********************************************
* Function: ReadBuffera(void)
* Input Variables: void
* Return Variables: unsigned char
* Usage: read a char from the Buffer
*********************************************/
unsigned char ReadBuffer()
{
unsigned char Buffer_value; // Buffer 值
Buffer_value = _Buffer[pRead]; // 从缓存区读数
pRead++; // 指针向前移动
if(pRead == BUFFER_LENGTH) // 如果到缓存末尾
{
pRead = 0; // 循环指针
LoopFlag = 0; // 清除LoopFlag
}
if((pRead == pWrite) && (!LoopFlag)) // 如果数据读取完毕
{
UpdateFlag = 0; // 清除更新标志
}
if(OverflowFlag) // 如果数据缓存溢出
{
OverflowFlag = 0; // 清除数据溢出标志
}
return Buffer_value; // 返回读取值
}
/**********************************************
* Function: RS232_SendData(unsigned char Sdata)
* Input Variables: unsigned char Sdata
* Return Variables: none
* Usage: Send a Char to UART
*********************************************/
void RS232_SendData(unsigned char Sdata)
{
while(TI==0); // 等待发送完毕
SBUF = Sdata; // 发送数据
}
/**********************************************
* Function: F2M_SetBluetoothName(unsigned char *BluetoothName)
* Input Variables: unsigned char *BluetoothName
* Return Variables: unsigned char
* Usage: Set Bluetooth Module Name
*********************************************/
unsigned char F2M_SetBluetoothName(unsigned char *BluetoothName)
{
if(BluetoothName == NULL) return 0; // Null point, return error
F2M_Command(0x1d,strlen((char*)BluetoothName)+1,BluetoothName); // Exit HCM Command
F2M_GetResponse(); // Get Response from the F2M Bluetooth Plug
return F2M_RSP_BUFFER[2]; // Return Status Byte
}
/**********************************************
* Function: F2M_GetBluetoothName()
* Input Variables: void
* Return Variables: unsigned char
* Usage: Get Bluetooth Module Name
*********************************************/
unsigned char F2M_GetBluetoothName()
{
F2M_Command(0x1c,0x00,NULL); // Exit HCM Command
F2M_GetResponse(); // Get Response from the F2M Bluetooth Plug
return F2M_RSP_BUFFER[2]; // Return Status Byte
}
/**********************************************
* Function: F2M_EnterCommandMode()
* Input Variables: void
* Return Variables: unsigned char
* Usage: EnterCommandMode
*********************************************/
unsigned char F2M_EnterCommandMode()
{
unsigned char i;
const unsigned char F2M_CMD_ENTHCM[] = {0xff,0x00,0x55,0xaa}; //HCM Enter Code
// ONLY FOR F2M03AC2!!!!!
// Set CTS high to close down the probable Bluetooth connection
_F2M_SET_PIO2(); // Before Commands can be sent to firmware,
while(_F2M_CHK_PIO3()!=0); // Waiting for stopping Bluetooth connection if necessary
F2M_SetMspUartBR(F2M_USART_38400); //HCM works only with Baudrate 38400!
vTaskDelay(2); //Delay 200ms for preparation entering the Command Mode
F2M_Command(0x01,0x04,(unsigned char*)F2M_CMD_ENTHCM); // Enter HCM Command
F2M_GetResponse(); // Get Response from the F2M Bluetooth Plug
// ONLY FOR F2M03AC2!!!!!
_F2M_CLR_PIO2(); //
return F2M_RSP_BUFFER[2]; // Return Status Byte
}
/**********************************************
* Function: serial_IT
* Input Variables: void
* Return Variables: void
* Usage: UART Interrupt Service Routine
*********************************************/
void serial_IT(void) interrupt SIO_VECTOR
{
EA = 0; // 关中断
if (RI == 1)
{ // 接收中断
RI = 0; // 清除中断标志
_Buffer[pWrite] = SBUF; // 将数据写入缓存区
UpdateFlag = 1; // 置高数据更新标志
pWrite++;
if(pWrite == BUFFER_LENGTH)
{
pWrite = 0; // 循环缓存区
LoopFlag = 1; // 置高Loop标志
}
if((pWrite >= pRead) && (LoopFlag == 1))
{
OverflowFlag = 1; // 数据溢出标志置高
}
}
else
{
TI = 0; // 清除发送中断标志
}
EA = 1; // 开中断,准备下次接收
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -