/*****************************************************************
* 此部分为主程序
*控制数码管的显示 以及定义发向串口的函数
*!!!
*此程序只能与上位机程序配合使用,或者修改相应上位机代码
******************************************************************/
#include
extern GetTemp(); //声明引用外部函数
extern unsigned int idata Temperature; // 声明引用外部变量
extern STC_send_bluetooth(unsigned char a); //声明外部函数,与串口相关
extern Serial_port_init();
extern ctrl();
extern unsigned char tmp;
extern void Init18b20(void);
extern bit flag;//DS18B20是否损坏标志位,1为完好
void send();//处理18B20发来的温度值,将各个位分别存储,并控制发向串口
void delay(unsigned int i);//延时程序
//138的C、B、A端 用于数码管的位选
sbit LS138A=P2^2; //管脚定义
sbit LS138B=P2^3;
sbit LS138C=P2^4;
sbit PowerDown=P2^1; //若18B20损坏,指示灯灭
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned long LedOut[3],LedNumVal;
unsigned char num[3];
unsigned char end_char; //定义串口发送结束符
unsigned char ARQFlag=0;//请求重发标志位,若为0,表示不重发
unsigned char AutoSendFlag=0;//为了减小硬件带来的误差,单片机用于重新发送给上位机的标志位
/********************************
*判断18B20是否损坏或未连接
*若损坏或未连接,发给上位机FF作为提示
*************************************/
bit Is_18B20()
{
Init18b20();
if(!flag)
{
STC_send_bluetooth(0x46); //字符F
delay(500); //发送完一个字符加一定的延时
STC_send_bluetooth(0x46);
delay(500);
STC_send_bluetooth(0x43); //字符C的ASCII码,作为此次发送完毕的结束标?
delay(5000); //稍微延长延时,等待发送完毕
PowerDown=1; //指示灯灭
PCON |= 0x02; //单片机进入停机模式,此时内部晶振停振,只能靠外部INT0~3引脚唤醒或复位
return 0;
}
return 1;
}
/********************************
*定时器中断相关初始化
*********************************/
void system_Init()
{
TMOD&=0xF0;
TMOD|= 0x01;
TH0 = 0xD8; //10ms
TL0 = 0xF0;
TR0 = 1;
ET0=1;
EA=1;
}
/************************************************************************************
*主函数,用于定时器中断,波特率发生器初始化,处理串口数据,以及数码管的显示
************************************************************************************/
void main()
{
unsigned char i;
end_char='C';
Serial_port_init();
system_Init();
//delay(1050);
// 1000 19.57ms
//800 15.67
//1200 23.49
//1100 21.52
//1050 20.55
if(Is_18B20()) //若18B20没有损坏,则继续执行
{
while(1)
{
if(RI==1) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
ctrl(); //根据接收的字符做出相应的处理
}
GetTemp(); //获取温度
/********以下将读18b20的数据送到LED数码管显示*************/
for(i=0; i<2; i++)
{
P0 = LedOut[i] ;
switch(i)
{ //138译码
case 0:LS138C=0;LS138B=0;LS138A=0; break;
case 1:LS138C=0;LS138B=0;LS138A=1; break; //001B 表示位选第一个数码管
//case 2:LS138C=0;LS138B=1;LS138A=0; break;
}
delay(100);
}
P0 = 0;
}
}
}
/**********************************************
*延时程序
**********************************************/
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
/******************************************
*单片机串口发送函数
******************************************/
void send()
{
if(AutoSendFlag==20) //当单片机有20秒没有发送数据给上位机时,发送一次数据,防止硬件误差
{
AutoSendFlag='s';
}
if((LedNumVal)==(Temperature) && ARQFlag==0&&AutoSendFlag!='s') // 温度值与上次相等并且不要求重发,则不执行send()发送到串口
{
return;
}
else
{
LedNumVal=Temperature; //把实际温度送到LedNumVal变量中
num[0]= LedNumVal%100/10;
num[1]= LedNumVal%10;
/* //若需要小数后一位的数据
num[0]= (LedNumVal/100)%10; //十位
num[1]= (LedNumVal/10)%10; //个位
num[2]= LedNumVal%10; //小数点后一位
*/
delay(1050);
STC_send_bluetooth(num[0]+0x30);
delay(1050); //发送完一个字符加一定的延时
STC_send_bluetooth(num[1]+0x30);
delay(1050); //15.67ms
STC_send_bluetooth(0x43); //字符C的ASCII码,作为此次发送完毕的结束标志
delay(1050);
LedOut[0]=Disp_Tab[num[0]]; //温度的十位
LedOut[1]=Disp_Tab[num[1]]; //温度的个位
//LedOut[2]=Disp_Tab[num[2]]; //温度的小数后一位
if(ARQFlag) //若是上位机请求重发的,此时ARQFlag为1,需要手动置0
…………限于本文篇幅 余下代码请从51黑下载附件…………
android studio温湿度 android 温度监测下载
转载文章标签 android studio温湿度 android温度计源码 串口 上位机 数码管 文章分类 Android 移动开发
