完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
补充上一次的主函数
#include "stm32f4xx.h" #include "usart.h" #include "delay.h" #include "led.h" #include "adc.h" #include "ds18b20.h" #include "lcd.h" #include "24l01.h" #include "timer.h" /******************************************* *第一步:adc量通道采集数据显示(显示内部温度) *第二步:ds18b20温度显示 *第三步:接收命令状态(无线模块) *第四步:发送数据给另外开发板 *******************************************/ #define SEND_BUF_SIZE 2 u16 ADC1Buff[SEND_BUF_SIZE]; short Get_Temprate(void); u32 ADC_Convert(u16 *DRValue,u16 i); void dis_ds18b20(void); void dis_Adc_value(void); void u16tou8(u16* u16buff,u8* u8buff,u8 len); void systeminit() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168); //初始化延时函数 uart_init(115200); //初始化串口波特率为115200 TIM3_Int_Init(199,8299); //定时20ms 分时系统 LED_Init(); //初始化LED LCD_Init(); //LCD初始化 NRF24L01_Init(); //初始化NRF24L01 Adc_Init(); MYDMA_Config(DMA2_Stream0,DMA_Channel_0,(u32)&ADC1->DR,(u32)ADC1Buff,SEND_BUF_SIZE); } int main(void) { u8 tmp_buf[32]={0}; u8 t=0; systeminit(); LCD_Clear(BLACK); //黑屏 POINT_COLOR=BLUE;//设置字体为蓝色 BACK_COLOR=BLACK;//字体背景黑色 LCD_ShowString(60+11*8,120,200,16,16,"0.000v"); LCD_ShowString(60+11*8,150,200,16,16,"00.00C"); LCD_ShowString(30+110+8,180,200,16,16,"00.00C"); while(DS18B20_Init()) //DS18B20初始化 { LCD_ShowString(30,130,200,16,16,"DS18B20 Error"); } while(NRF24L01_Check()) { LCD_ShowString(30,130,200,16,16,"NRF24L01 Error"); } while(1) { switch(systick_time) { case 0: dis_ds18b20(); break; //显示环境温度信息 case 1: dis_Adc_value(); break; //显示采集电压和内部温度信息 case 2: //接收状态 { NRF24L01_RX_Mode(); if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来. { t++; if(tmp_buf[0]=='f') //验证接收的命令 { tmp_buf[1]=0;//加入字符串结束符 LCD_ShowString(120+t*16,220,lcddev.width-1,32,16,tmp_buf); delay_ms(100); //延时一段时间,等待对方反应 NRF24L01_TX_Mode(); u16tou8(ADC1Buff,tmp_buf,2); //将采集的电压信息转换成u8类型 NRF24L01_TxPacket(tmp_buf) ; //将采集的信息发送给另外一个单片机 } } } break; } } } //采集电压计算函数 u32 ADC_Convert(u16 *DRValue,u16 i) { u32 ResultVolt = 0; for(;i ResultVolt +=(DRValue*3300)/4095; //计算得到1000倍的电压值 } ResultVolt/=(SEND_BUF_SIZE/2); //求均值 printf("%drn",ResultVolt); return ResultVolt; //比如: 实际电压为1.25V, 返回的数据为1250 } //内部温度转换函数 short Get_Temprate(void) { u16 i=0; u32 adcx=0; short result; double temperate; for(i=1;i adcx+=(u32)ADC1Buff[1]; //读取通道16内部温度传感器通道,10次取平均 } adcx/=(SEND_BUF_SIZE/2); temperate=(float)adcx*(3.3/4096); //电压值 temperate=(temperate-0.76)/0.0025 + 25; //转换为温度值 result=temperate*=100; //扩大100倍. return result; } void dis_ds18b20() { short temperature; u8 t; u8 x; x=50; for(t=12;t<18;t++)//显示汉字‘环境温度是:’ { Test_Show_CH_Font16(x ,180,t,BLUE); x+=16; } temperature=DS18B20_Get_Temp(); if(temperature<0) { LCD_ShowChar(30+110,180,'-',16,0); //显示负号 temperature=-temperature; //转为正数 }else LCD_ShowChar(30+110,180,' ',16,0); //去掉负号 LCD_ShowNum(30+110+8,180,temperature/10,2,16); //显示正数部分 LCD_ShowNum(30+110+32,180,temperature%10,1,16); //显示小数部分 } void dis_Adc_value() { u8 t; u8 x; x=50; for(t=0;t<6;t++)//显示汉字‘内部电压是:’ { Test_Show_CH_Font16(x ,120,t,BLUE); x+=16; } x=50; for(t=6;t<12;t++)//显示汉字‘内部温度是:’ { Test_Show_CH_Font16(x ,150,t,BLUE); x+=16; } LCD_ShowxNum(60+11*8,120,ADC_Convert(ADC1Buff,0)/1000,1,16,0); //显示电压整数部分 LCD_ShowxNum(60+13*8,120,ADC_Convert(ADC1Buff,0)%1000,3,16,0); //显示电压小数部分 LCD_ShowxNum(60+11*8,150,Get_Temprate()/100,2,16,0); //显示温度整数部分 LCD_ShowxNum(60+14*8,150,Get_Temprate()%100,2,16,0); //显示温度小数部分 } //数据类型转换函数 void u16tou8(u16* u16buff,u8* u8buff,u8 len) { u8 i; for(i=0;i u8buff[i*2]=(u8)u16buff; //低位 u8buff[i*2+1]=(u8)u16buff>>8; //高位 } } 从机函数 #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "24l01.h" int main(void) { u8 key; // u16 t=0; u8 tmp_buf[33]={0}; u8 RX_buf[33]={0}; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化按键 LCD_Init(); //初始化LCD NRF24L01_Init(); //初始化NRF24L01 POINT_COLOR=RED; //设置字体为红色 while(NRF24L01_Check()) { LCD_ShowString(30,130,200,16,16,"NRF24L01 Error"); delay_ms(200); LCD_Fill(30,130,239,130+16,WHITE); delay_ms(200); } tmp_buf[0]='J'; while(1) { key=KEY_Scan(0); if(key==KEY1_PRES) //发送 { NRF24L01_TX_Mode(); if(NRF24L01_TxPacket(tmp_buf)==TX_OK) { LCD_ShowString(30,120,239,32,16,"Sended DATA:"); LCD_ShowString(50,150,lcddev.width-1,32,16,tmp_buf); LED0=!LED0; NRF24L01_RX_Mode(); while(NRF24L01_RxPacket(RX_buf)!=0);//一旦接收到信息,则显示出来. LCD_ShowString(30,170,200,16,16,"Received DATA:"); RX_buf[5]=0;//加入字符串结束符 LCD_ShowString(50,190,lcddev.width-1,32,16,RX_buf); LED1=!LED1; } } } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1553 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1497 浏览 1 评论
925 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
660 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1551 浏览 2 评论
1846浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
603浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
502浏览 3评论
504浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
486浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 00:32 , Processed in 0.896015 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号