接着搞开始写代码了
思路:循环扫描2个ds18b20的温度
1.需要首先获取每个ds18b20的唯一标识,获取标识的时候需要只接一个ds18b20 一个一个获取(网上找的别人的,我移植过来了)
- /**
- * @brief 读取ROM码
- * @param 存储DS18B20 ROM码的数组
- * @retval None
- */
- void ReadRomCode(unsigned char* romcode)
- {
- bit ack;
- unsigned char i;
- ack = DS18b20_Reset1(); //复位
- if(ack == 0)
- {
- P20 = 0;
- DS18b20_WriteByte(0x33); // 发送读取ROM命令
- Delay1ms();
- for(i = 0; i < 8; i++)
- {
- romcode[i] = DS18b20_ReadByte(); // 读取64位ROM码
- }
-
- }
- }
复制代码
2.将获取到的DS18B20器件的序列号通过数组保存起来
我代码里是直接把rom码发给串口,获取的
- unsigned char ROM_data0[8] = {0x28,0x8e,0xe2,0x83,0x00,0x00,0x00,0xef}; //存储dsrom码
-
- unsigned char ROM_data1[8] = {0x28,0x61,0x07,0x85,0x00,0x00,0x00,0xe3}; //存储dsrom码
复制代码
3.main函数如下: 基础就是冲哥课程里的代码
- #include "COMM/stc.h" //调用头文件
- #include "COMM/stc32_stc8_usb.h"
- #include "stdio.h"
- #include "stc32g.h"
- #include "18b20.h"
-
-
- #define MAIN_Fosc 22118400L //定义主时钟
- unsigned char ROM_data[8]; //存储dsrom码
-
- unsigned char ccc = 0xee;
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
-
- bit TIM_10MS_Flag; //10ms的标志位
-
-
- void sys_init(); //函数声明
- void delay_ms(u16 ms); //unsigned int
-
- void Delay3000ms(void) //@22.1184MHz
- {
- unsigned long edata i;
-
- _nop_();
- _nop_();
- i = 16588798UL;
- while (i) i--;
- }
-
- void main() //程序开始运行的入口
- {
- int dat = 0; //初始数值
- unsigned int wendu;
- unsigned int wendu1;
- sys_init(); //USB功能+IO口初始化
- usb_init(); //usb库初始化
- EUSB = 1; //中断允许位
- EA = 1; //CPU开放中断,打开总中断。
- while( DeviceState != DEVSTATE_CONFIGURED );
-
- while(1) //死循环
- {
- delay_ms(2);
-
- if( bUsbOutReady )
- {
- // USB_SendData(UsbOutBuffer,OutNumber);
- usb_OUT_done();
- }
-
- Delay3000ms();
-
- //读取当前ds18的标识码
- // ReadRomCode(ROM_data);
- // printf( "当前rom1:%x-", ROM_data[0]);
- // printf( "当前rom2:%x-", ROM_data[1]);
- // printf( "当前rom3:%x-", ROM_data[2]);
- // printf( "当前rom4:%x-", ROM_data[3]);
- // printf( "当前rom5:%x-", ROM_data[4]);
- // printf( "当前rom6:%x-", ROM_data[5]);
- // printf( "当前rom7:%x-", ROM_data[6]);
- // printf( "当前rom8:%x\r\n", ROM_data[7]);
-
- P01 = !P01;
-
- wendu = DS18b20_ReadTemp2(0); //300ms到达,读取一次温度
- if( MinusFlag==1 )
- {
- printf( "当前温度0:-%.01f\r\n",(float)((float)wendu/10) );
- }
- else
- {
- printf( "当前温度0:%.01f\r\n",(float)((float)wendu/10) );
- }
-
- Delay3000ms();
- wendu1 = DS18b20_ReadTemp2(1); //300ms到达,读取一次温度
- if( MinusFlag==1 )
- {
- printf( "当前温度1:-%.01f\r\n",(float)((float)wendu1/10) );
- }
- else
- {
- printf( "当前温度1:%.01f\r\n",(float)((float)wendu1/10) );
- }
-
-
-
- }
- }
-
-
-
-
- void sys_init() //函数定义
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
- P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
- P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
- P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
- P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
- P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
- P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
-
- P3M0 = 0x00;
- P3M1 = 0x00;
-
- P3M0 &= ~0x03;
- P3M1 |= 0x03;
-
- USBCON = 0X00; //usb初始化
- USBCLK = 0X00;
- IRC48MCR = 0X00;
- delay_ms(10);
-
- //设置USB使用的时钟源
- IRC48MCR = 0x80; //使能内部48M高速IRC
- while (!(IRC48MCR & 0x01)); //等待时钟稳定
-
- USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
- USBCON = 0x90;
- }
-
-
- void delay_ms(u16 ms) //unsigned int
- {
- u16 i;
- do
- {
- i = MAIN_Fosc/6000;
- while(--i);
- }while(--ms);
- }
复制代码
|