在线时间794 小时
UID3067179
注册时间2014-10-23
NXP金币981
TA的每日心情 | 开心 前天 08:28 |
---|
签到天数: 1313 天 [LV.10]以坛为家III
版主
- 积分
- 7552
- 最后登录
- 2024-3-27
|
本帖最后由 TLLED 于 2021-6-1 08:14 编辑
赶在五月的末班车来驱动DS18B20温度传感器读取环境温度,并显示在LED数码管上。
一、功能
1.1、i.MX RT1010开发板驱动TM1638模块显示屏,显示数字温度。
1.2、i.MX RT1010开发板驱动DS18B20读取环境温度。
1.3、i.MX RT1010开发板串口输出DS18B20温度值。
二、使用的模块
2.1、rt1010开发板
2.2、DS18B20
2.2、TM1638模块
三、工作流程
定时500ms -> 中断处理(读取DS18B20温度,显示LED数码管,串口打印温度)。
四、程序代码
4.1、TM1638.C
- #include "pin_mux.h"
- #include "clock_config.h"
- #include "board.h"
- #include "fsl_debug_console.h"
- #include "fsl_gpio.h"
- #include "tm1638.h"
- const uint8_t tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
- 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
- const uint8_t tabb[]={0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xeF,0x77,0x7C,0x39,0x5E,0x79,0x71};
- gpio_pin_config_t tm1638_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
- gpio_pin_config_t tm1638_in_config = {kGPIO_DigitalInput, 0, kGPIO_NoIntmode};
- void tm1638_writedata(uint8_t dat)
- {
- uint8_t i;
- for(i=0;i<8;i++)
- {
- CLK_L();
- if(dat&0X01)
- {
- DIO_H();
- }
- else
- {
- DIO_L();
- }
- dat>>=1;
- SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- CLK_H();
- SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- }
- }
- uint8_t tm1638_readdata(void)
- {
- uint8_t i;
- uint8_t temp=0;
-
- GPIO_PinInit(TM1638_GPIO, TM1638_DIO_PIN, &tm1638_in_config);
-
- for(i=0;i<8;i++)
- {
- temp>>=1;
- CLK_L();
- SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- if(GPIO_PinRead(TM1638_GPIO, TM1638_DIO_PIN))
- temp|=0x80;
- CLK_H();
- SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- }
-
- GPIO_PinInit(TM1638_GPIO, TM1638_DIO_PIN, &tm1638_config);
-
- return temp;
- }
- void tm1638_writecmd(uint8_t cmd)
- {
- STB_L();
- tm1638_writedata(cmd);
- STB_H();
- }
- void tm1638_addr_writedata(uint8_t addr,uint8_t dat)
- {
- tm1638_writecmd(0x44);
- STB_L();
- tm1638_writedata(0xc0|addr);
- tm1638_writedata(dat);
- STB_H();
- }
- void tm1638_writeallLED(uint8_t LED_flag)
- {
- uint8_t i;
- for(i=0;i<8;i++)
- {
- if(LED_flag&(1<<i))
- tm1638_addr_writedata(2*i+1,1);
- else
- tm1638_addr_writedata(2*i+1,0);
- }
- }
- void TM1638_Disp(char* dat)
- {
- uint8_t i;
- for(i=0;i<3;i++)
- {
- tm1638_addr_writedata(i<<1,tab[dat[i]]);
- }
- }
- void TM1638_DispTemp(char* dat)
- {
- uint8_t i;
- for(i=0;i<3;i++)
- {
- if(i==1)
- {
- tm1638_addr_writedata(i<<1,tabb[dat[i]]);
- }
- else
- {
- tm1638_addr_writedata(i<<1,tab[dat[i]]);
- }
-
- }
- }
- uint8_t tm1638_readkey(void)
- {
- uint8_t c[4],i,key_value=0;
- STB_L();
- tm1638_writedata(0x42);
- for(i=0;i<4;i++)
- c[i]=tm1638_readdata();
- STB_H(); //4个字节数据合成一个字节
- for(i=0;i<4;i++)
- key_value|=c[i]<<i;
- for(i=0;i<8;i++)
- if((0x01<<i)==key_value)
- break;
- return i;
- }
- void init_tm1638(void)
- {
- uint8_t i;
- GPIO_PinInit(TM1638_GPIO, TM1638_DIO_PIN, &tm1638_config);
- GPIO_PinInit(TM1638_GPIO, TM1638_CLK_PIN, &tm1638_config);
- GPIO_PinInit(TM1638_GPIO, TM1638_STB_PIN, &tm1638_config);
-
- tm1638_writecmd(0x8b); //亮度 (0x88-0x8f)8级亮度可调
- tm1638_writecmd(0x40); //采用地址自动加1
- STB_L(); //
- tm1638_writedata(0xc0); //设置起始地址
- for(i=0;i<16;i++) //传送16个字节的数据
- tm1638_writedata(0x00);
- STB_H();
-
-
- for(i=0;i<8;i++)
- {
- tm1638_addr_writedata(i<<1,0x00);
- }
- }
复制代码
4.2、DS18B20.C
- #include "pin_mux.h"
- #include "clock_config.h"
- #include "board.h"
- #include "fsl_debug_console.h"
- #include "fsl_gpio.h"
- #include "ds18b20.h"
- gpio_pin_config_t ds18b20_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
- gpio_pin_config_t ds18b20_in_config = {kGPIO_DigitalInput, 0, kGPIO_NoIntmode};
- //DS18B20复位
- void DS18B20_Rst(void)
- {
- GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_config); //设置为输出
- DS18B20_DIO_L(); //DQ=0
- SDK_DelayAtLeastUs(750, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- DS18B20_DIO_H(); //DQ=1
- SDK_DelayAtLeastUs(15, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- }
- //检测DS18B20
- uint8_t DS18B20_Check(void)
- {
- uint8_t retry=0;
- GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_in_config); //设置为输入
- while ( (GPIO_PinRead(DS18B20_GPIO, DS18B20_DIO_PIN)) &&retry<200)
- {
- retry++;
- SDK_DelayAtLeastUs(1, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- };
- if(retry>=200)
- return 1;
- else
- retry=0;
-
- while (!(GPIO_PinRead(DS18B20_GPIO, DS18B20_DIO_PIN))&&retry<240)
- {
- retry++;
- SDK_DelayAtLeastUs(1, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- };
- if(retry>=240)return 1;
- return 0;
- }
- //从DS18B20读取一个位
- //返回值:1/0
- uint8_t DS18B20_Read_Bit(void)
- {
- uint8_t data;
- GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_config); //设置为输出
- DS18B20_DIO_L();
- SDK_DelayAtLeastUs(2, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- DS18B20_DIO_H();
-
- GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_in_config); //设置为输入
- SDK_DelayAtLeastUs(12, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
-
- if( GPIO_PinRead(DS18B20_GPIO, DS18B20_DIO_PIN) ) data=1;
- else data=0;
- SDK_DelayAtLeastUs(50, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- return data;
- }
- //从DS18B20读取一个字节
- //返回值:读到的数据
- uint8_t DS18B20_Read_Byte(void)
- {
- uint8_t i,j,dat;
- dat=0;
- for (i=1;i<=8;i++)
- {
- j=DS18B20_Read_Bit();
- dat=(j<<7)|(dat>>1);
- }
- return dat;
- }
- //写一个字节到DS18B20
- //dat:要写入的字节
- void DS18B20_Write_Byte(uint8_t dat)
- {
- uint8_t j;
- uint8_t testb;
- GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_config); //设置为输出
-
- for (j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if (testb)
- {
- DS18B20_DIO_L();
- SDK_DelayAtLeastUs(2, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- DS18B20_DIO_H();
- SDK_DelayAtLeastUs(60, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- }
- else
- {
- DS18B20_DIO_L();
- SDK_DelayAtLeastUs(60, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- DS18B20_DIO_H();
- SDK_DelayAtLeastUs(2, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
- }
- }
- }
- //开始温度转换
- void DS18B20_Start(void)
- {
- DS18B20_Rst();
- DS18B20_Check();
- DS18B20_Write_Byte(0xcc); // skip rom
- DS18B20_Write_Byte(0x44); // convert
- }
- //初始化DS18B20的IO口 DQ 同时检测DS的存在
- //返回1:不存在
- //返回0:存在
- uint8_t DS18B20_Init(void)
- {
- GPIO_PinInit(DS18B20_GPIO, DS18B20_DIO_PIN, &ds18b20_config); //设置为输出
- DS18B20_Rst();
- return DS18B20_Check();
- }
- //从ds18b20得到温度值
- //精度:0.1C
- //返回值:温度值 (-550~1250)
- short DS18B20_Get_Temp(void)
- {
- uint8_t temp;
- uint8_t TL,TH;
- short tem;
- DS18B20_Start (); // ds1820 start convert
- DS18B20_Rst();
- DS18B20_Check();
- DS18B20_Write_Byte(0xcc); // skip rom
- DS18B20_Write_Byte(0xbe); // convert
- TL=DS18B20_Read_Byte(); // LSB
- TH=DS18B20_Read_Byte(); // MSB
-
- if(TH>7)
- {
- TH=~TH;
- TL=~TL;
- temp=0; //温度为负
- }else temp=1; //温度为正
- tem=TH; //获得高八位
- tem<<=8;
- tem+=TL; //获得底八位
- tem=(float)tem*0.625; //转换
- if(temp)return tem; //返回温度值
- else return -tem;
- }
复制代码
4.3、pit.c
- #include "fsl_debug_console.h"
- #include "pin_mux.h"
- #include "clock_config.h"
- #include "board.h"
- #include "fsl_pit.h"
- #include "ds18b20.h"
- #include "tm1638.h"
- #define DEMO_PIT_BASEADDR PIT
- #define DEMO_PIT_CHANNEL kPIT_Chnl_0
- #define PIT_LED_HANDLER PIT_IRQHandler
- #define PIT_IRQ_ID PIT_IRQn
- #define PIT_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_OscClk)
- volatile bool pitIsrFlag = false;
- void PIT_LED_HANDLER(void)
- {
- /* Clear interrupt flag.*/
- PIT_ClearStatusFlags(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, kPIT_TimerFlag);
- pitIsrFlag = true;
- __DSB();
- }
- void init_pit(void)
- {
- pit_config_t pitConfig;
- /* Set PERCLK_CLK source to OSC_CLK*/
- CLOCK_SetMux(kCLOCK_PerclkMux, 1U);
- /* Set PERCLK_CLK divider to 1 */
- CLOCK_SetDiv(kCLOCK_PerclkDiv, 0U);
-
- /*
- * pitConfig.enableRunInDebug = false;
- */
- PIT_GetDefaultConfig(&pitConfig);
- /* Init pit module */
- PIT_Init(DEMO_PIT_BASEADDR, &pitConfig);
- /* Set timer period for channel 0 */
- PIT_SetTimerPeriod(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, USEC_TO_COUNT(1000000U, PIT_SOURCE_CLOCK));
- /* Enable timer interrupts for channel 0 */
- PIT_EnableInterrupts(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, kPIT_TimerInterruptEnable);
- /* Enable at the NVIC */
- EnableIRQ(PIT_IRQ_ID);
- /* Start channel 0 */
- PRINTF("\r\nStarting channel No.0 ...");
- PIT_StartTimer(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL);
- }
- void pit_hdl(void)
- {
- short temperature;
- uint8_t temp[8];
-
- if (true == pitIsrFlag)
- {
-
- temperature=DS18B20_Get_Temp();
- if(temperature<0)
- {
- temperature=-temperature; //转为正数
- }
- PRINTF("\r\n temperature = %d !",temperature);
- temp[0]=temperature/100;
- temp[1]=(temperature%100)/10;
- temp[2]=(temperature%100)%10;
-
- TM1638_DispTemp(temp);
-
-
- //LED_TOGGLE();
- pitIsrFlag = false;
- }
- }
复制代码
4.4、程序源代码
ds18b20-20210531.rar
(587.56 KB, 下载次数: 12)
|
|