用c51单片机编的18b20测温程序。如果换成stc单片机(跑的比c51快8到10倍)需要如何改动?
/**************************************************************** 程序名称: 读取DS18B20温度,通过数码管显示出来 说明:使用本程序你必须把 SE6设置为ON(2-3)短接 SE5设置为ON(2-3)短接 ...全部
/**************************************************************** 程序名称: 读取DS18B20温度,通过数码管显示出来 说明:使用本程序你必须把 SE6设置为ON(2-3)短接 SE5设置为ON(2-3)短接 *****************************************************************//*头文件*/#include #include #define uint unsigned int#define uchar unsigned char#define nop() _nop_()#define _Nop() _nop_()sbit DQ =P3^6; //定义DS18B20通信端口#define sled_dm_port P0 /*定义数码管段码的控制脚*/#define sled_wm_port P2 /*定义数码管位码的控制脚*//*定义数码管显示字符跟数字的对应数组关系*/uchar code sled_mun_to_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};/* 0 1 2 3 4 5 6 7 8 9 a b c d e f *//*定义需要点亮的数码管*/uchar code sled_bit_table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchar data sled_data[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; /*0-7号SLED缓冲值*/uchar data led_lighten_bit=0 ; /*LED灯点亮标志位0-7*/ //延时函数void delay(unsigned int i){ while(i--);}//初始化函数Init_DS18B20(void){ unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20);}//读一个字节ReadOneChar(void){ unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--){ DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat);}//写一个字节WriteOneChar(unsigned char dat){ unsigned char i=0; for (i=8; i>0; i--){ DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; }}//读取温度ReadTemperature(void){ unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); b=ReadOneChar(); t=b; t t=t|a; tt=t*0。
0625; //将温度的高位与低位合并 t= tt*10 0。
5; //对结果进行4舍5入 return(t);} /*1MS为单位的延时程序*/void delay_1ms(uchar x){ uchar j; while(x--){ for(j=0;j {;} } }main(){ uint temp_buff; uchar i; while(1){ temp_buff=ReadTemperature(); /*读取当前温度*/ sled_data[5] = sled_mun_to_char[temp_buff/100]; sled_data[6] = sled_mun_to_char[temp_buff0/10]; sled_data[7] = sled_mun_to_char[temp_buff]; for(i=0;i sled_wm_port = 0xff; /*关闭显示*/ _Nop(); _Nop(); _Nop(); sled_dm_port = sled_data[i]; /*输出段码数据到数码管*/ if(i==6) sled_dm_port = sled_dm_port&0x7f; /*显示小数点*/ sled_wm_port = sled_bit_table[i]; /*输出位码数据到数码管*/ delay_1ms(1); } }}。收起