|
12C5A60S2 驱动红外体温传感器LU90614
并在LCD1602屏幕上显示 当没有手靠近时
屏幕显示OL
制作出来的实物图如下:
单片机源程序如下:- ////以下是头文件
- #include "STC12C5A60S2.H" //这里使用的是STC12C5A60S2单片机
- #include "string.h"
- #include "Delay.h"
- #include "LCD1602.h"
- //接线 LCD的接线
- // 普中A2 完全兼容
- //sbit LCD_RW=P2^5;
- //sbit LCD_EN=P2^7;
- //#define LCD_DataPort P0
- //LU90614温度传感器接线
- // 普中A2
- //VCC +5V
- //GND GND
- //R P3.0
- //T P3.1
- /*************************************************************/
- //以下是宏定义
- #define u32 unsigned long int //无符号长整型
- #define u16 unsigned int //无符号整型
- #define u8 unsigned char //无符号短整型
- #define bool bit //布尔变量
- #define USART_REC_LEN 200 //定义最大接收字节数 200
- /*************************************************************/
- //以下是变量声明
- u8 UartData;//单字节串口数据
- u8 KeyNum;//存储矩阵键盘按键返回值
- u16 WENDU_H;
- u16 WENDU_L;
- bit flag=0;
- u16 USART_STA=0;
- u16 USART_RX_STA=0; //接收状态标记
- u16 USART_RX_LEN=0;
- u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- ///******************************************************************/
- ////函数声明区
- void UartInit(void);
- void delayms(int d);
- void delay_us(int d);
- void SendASC(u8 d);//发送字符
- void SendString(u8 *str);//发送字符串
- ///******************************************************************/
- ////主函数main
- void main(void)
- {
- UartInit(); //串口初始化
- LCD_Init();
- //发送体温模式指令 0XFA 0XC5 0XBF
- SendASC(0XFA);
- SendASC(0XC5);
- SendASC(0XBF);
- delayms(50);
-
- while(1)
- {
- if(USART_RX_STA&0X8000)//接收到一次数据
- {
- WENDU_H=USART_RX_BUF[2];
- WENDU_L=USART_RX_BUF[3]/10;
- WENDU_H=WENDU_H&0X00FF;
-
- LCD_ShowString(1,1,"Temp:");
- if(WENDU_H>200)
- LCD_ShowString(1,7,"OL ");
- else if(WENDU_H>100&&WENDU_H<200)
- {
- LCD_ShowNum(1,6,WENDU_H,3);//显示温度整数位
- LCD_ShowChar(1,9,'.');
- LCD_ShowNum(1,10,WENDU_L,2);//显示温度小数位
- }
- else
- {
- LCD_ShowChar(1,6,' ');
- LCD_ShowNum(1,7,WENDU_H,2);//显示温度整数位
- LCD_ShowChar(1,9,'.');
- LCD_ShowNum(1,10,WENDU_L,2);//显示温度小数位
- }
-
-
- delayms(100);
-
- USART_RX_STA=0;//启动下次接收
-
- }
- delayms(200);
- //发送测温指令 0XFA 0XCA 0XC4
- SendASC(0XFA);
- SendASC(0XCA);
- SendASC(0XC4);
-
-
- }
- }
- //串口初始化,晶振11.0592,波特率9600
- void UartInit(void) //9600bps@11.0592MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
- BRT = 0xDC; //设定独立波特率发生器重装值(9600) // BRT = 0xFD; (115200)
- AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
- AUXR |= 0x10; //启动独立波特率发生器
- EA = 1;//开总中断
- ES = 1;//开串口中断
- }
- void SendASC(u8 d)
- {
-
- SBUF=d;
- while(!TI);
- TI=0;
- }
- void SendString(u8 *str)
- {
- while(*str)
- {
- SendASC(*str) ;
- str++;
- }
- }
- //串口中断处理函数
- void uart_Interrupt() interrupt 4
- {
- if(RI)
- {
-
- UartData = SBUF;
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(UartData==0XFE)//接收到命令头
- {
- USART_STA=1;
- USART_RX_LEN=0;
- }
- }
- if(USART_STA)
- {
- USART_RX_BUF[USART_RX_LEN]=UartData;
- USART_RX_LEN++;
- if(USART_RX_LEN>8)//接收8位数据接收完毕
- {
- USART_STA=0;
- USART_RX_STA|=0x8000;//接收已完成
- }
- }
-
- RI = 0;
- }
- }
复制代码
|
评分
-
查看全部评分
|