/*****************************************************************
* 此部分为主程序
*控制数码管的显示 以及定义发向串口的函数
*!!!
*此程序只能与上位机程序配合使用,或者修改相应上位机代码
******************************************************************/
#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黑下载附件…………