4. 串口中断处理函数
/**********************************************************************
* 名 称: UART0_ISR(void) 串口中断处理函数
* 描 述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
**********************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中断标志
RxBuf = U0DBUF;
}
5. 烟雾传感器数据读取
/****************************************************************
* 名 称: myApp_ReadGasLevel()
* 功 能: 烟雾传感器数据读取
* 入口参数: 无
* 出口参数: 无
*****************************************************************/
uint16 myApp_ReadGasLevel( void )
{
uint16 reading = 0;
/* Enable channel */
ADCCFG |= 0x80;
/* writing to this register starts the extra conversion */
ADCCON3 = 0x87;
/* Wait for the conversion to be done */
while (!(ADCCON1 & 0x80));
/* Disable channel after done conversion */
ADCCFG &= (0x80 ^ 0xFF);
/* Read the result */
reading = ADCH;
reading |= (int16) (ADCH << 8);
reading >>= 8;
return (reading);
}
6. LED灯控制函数
/****************************************************************
* 名 称: led_opt()
* 功 能: LED灯控制函数
* 入口参数: RxData:接收到的指令 flage:led的操作,点亮或者关闭
* 出口参数: 无
*****************************************************************/
void led_opt(char RxData[],unsigned char flage)
{
switch(RxData[1])
{
case 1:
LED1 = (flage==DEV_ID_LED_ON)?ON:OFF;
break;
/* TBD for led2 led3*/
default:
break;
}
return;
}
7. 主程序
/****************************************************************************
* 主程序入口函数
****************************************************************************/
void main(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
InitLed(); //设置LED灯相应的IO口
InitUart(); //串口初始化函数
UartState = UART0_RX; //串口0默认处于接收模式
memset(RxData, 0, SIZE);
大林上位机机器视觉,_常州电工培训_常州PLC培训_常州机器视觉培训_常州上位机培训_常州工业机器人培训,最适合电工及plc编程人员学习的上位机机器视觉课程 大林老师:15861139266(微信同号)
while(1)
{
//接收状态
if(UartState == UART0_RX)
{ //读取数据,遇到字符'#'或者缓冲区字符数量超过4就设置UartState为CONTROL_DEV状态
if(RxBuf != 0)
{
//以'#'为结束符,一次最多接收4个字符
if((RxBuf != '#')&&(count < 4))
{
RxData[count++] = RxBuf;
}
else
{
//判断数据合法性,防止溢出
if(count >= 4)
{
//计数清0
count = 0;
//清空接收缓冲区
memset(RxData, 0, SIZE);
}
else{
//进入发送状态
UartState = CONTROL_DEV;
}
}
RxBuf = 0;
}
}
//控制控制外设状态
if(UartState == CONTROL_DEV)
{
//判断接收的数据合法性
//RxData[]: | device | data |crc | # |
//check_crc: crc = device ^ data
//if(RxData[2] == (RxData[0]^RxData[1]))
{
switch(RxData[0])
{
case DEV_ID_LED_ON :
led_opt(RxData,DEV_ID_LED_ON);
break;
case DEV_ID_LED_OFF:
led_opt(RxData,DEV_ID_LED_OFF);
break;
case DEV_ID_DELAY:
break;
case DEV_ID_GAS:
send_gas();
break;
default:
break;
}
}
UartState = UART0_RX;
count = 0;
//清空接收缓冲区
memset(RxData, 0, SIZE);
}
}
}