新手入门
- 积分
- 7
- 金钱
- 7
- 注册时间
- 2018-9-28
- 在线时间
- 0 小时
|
4金钱
我想把两块精英版进行CAN总线通信,然后把其中一块的采集的温度数据,发送到另一块板子上面,并在LCD显示屏上面显示。但是一直改不对程序。不知道怎么把CAN总线随机发送的数据改成采集过来的温度数据。那一段看不懂。
用的是自带的18B20的传感器实验和CAN总线收发实验。#include "led.h"
[size=10.5000pt]#include "delay.h"
[size=10.5000pt]#include "key.h"
[size=10.5000pt]#include "sys.h"
[size=10.5000pt]#include "lcd.h"
[size=10.5000pt]#include "usart.h"[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt]#include "ds18b20.h"
[size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt] int main(void)
[size=10.5000pt] {[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]u8 t=0;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]short temperature; [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]delay_init();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] //延时函数初始化[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
[size=10.5000pt] [size=10.5000pt]uart_init(115200);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//串口初始化为 115200
[size=10.5000pt] [size=10.5000pt]LED_Init();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//初始化与LED连接的硬件接口
[size=10.5000pt] [size=10.5000pt]LCD_Init();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//初始化LCD
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]POINT_COLOR=RED;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//设置字体为红色
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(30,50,200,16,16,"ELITE STM32");[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(30,70,200,16,16,"DS18B20 TEST");[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(30,110,200,16,16,"2015/1/16");[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]while(DS18B20_Init())[size=10.5000pt] [size=10.5000pt]//DS18B20初始化[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]delay_ms(200);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_Fill(30,130,239,130+16,WHITE);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]delay_ms(200);
[size=10.5000pt] [size=10.5000pt]}[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(30,130,200,16,16,"DS18B20 OK");
[size=10.5000pt] [size=10.5000pt]POINT_COLOR=BLUE;//设置字体为蓝色
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_ShowString(30,150,200,16,16,"Temp: . C");[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]while(1)
[size=10.5000pt] [size=10.5000pt]{[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(t%10==0)[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//每100ms读取一次
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]temperature=DS18B20_Get_Temp();[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(temperature<0)
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_ShowChar(30+40,150,'-',16,0);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//显示负号
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]temperature=-temperature;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//转为正数
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}else LCD_ShowChar(30+40,150,' ',16,0);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//去掉负号
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_ShowNum(30+40+8,150,temperature/10,2,16);[size=10.5000pt] [size=10.5000pt]//显示正数部分[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_ShowNum(30+40+32,150,temperature%10,1,16);[size=10.5000pt] [size=10.5000pt]//显示小数部分 [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]delay_ms(10);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]t++;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(t==20)
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]t=0;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LED0=!LED0;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]这是温度显示的。
[size=10.5000pt]#include "led.h"
[size=10.5000pt]#include "delay.h"
[size=10.5000pt]#include "key.h"
[size=10.5000pt]#include "sys.h"
[size=10.5000pt]#include "lcd.h"
[size=10.5000pt]#include "usart.h"[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt]#include "can.h"
[size=10.5000pt]#include "ds18b20.h"
[size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt] int main(void)
[size=10.5000pt] {[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]u8 key;
[size=10.5000pt] [size=10.5000pt]u8 i=0,t=0;
[size=10.5000pt] [size=10.5000pt]u8 cnt=0;
[size=10.5000pt] [size=10.5000pt]u8 canbuf[8];
[size=10.5000pt] [size=10.5000pt]u8 res;
[size=10.5000pt] [size=10.5000pt]u8 mode=CAN_Mode_LoopBack;//CAN工作模式;CAN_Mode_Normal(0):普通模式,CAN_Mode_LoopBack(1):环回模式
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]delay_init();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] //延时函数初始化[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
[size=10.5000pt] [size=10.5000pt]uart_init(115200);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//串口初始化为115200
[size=10.5000pt] [size=10.5000pt]LED_Init();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//初始化与LED连接的硬件接口
[size=10.5000pt] [size=10.5000pt]LCD_Init();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//初始化LCD[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]KEY_Init();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//按键初始化[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN初始化环回模式,波特率500Kbps
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]POINT_COLOR=RED;//设置字体为红色
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,50,200,16,16,"WarShip STM32");[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,70,200,16,16,"CAN TEST");[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,110,200,16,16,"2015/1/11");
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,130,200,16,16,"LoopBack Mode");[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,150,200,16,16,"KEY0:Send WK_UP:Mode");//显示提示信息[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] POINT_COLOR=BLUE;//设置字体为蓝色[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,170,200,16,16,"Count:");[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//显示当前计数值[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,190,200,16,16,"Send Data:");[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//提示发送的数据[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,250,200,16,16,"Receive Data:");[size=10.5000pt] [size=10.5000pt]//提示接收到的数据[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]while(1)
[size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]key=KEY_Scan(0);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(key==KEY0_PRES)//KEY0按下,发送一次数据
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]for(i=0;i<8;i++)
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]canbuf=cnt+i;//填充发送缓冲区
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(i<4)LCD_ShowxNum(60+i*32,210,canbuf,3,16,0X80);[size=10.5000pt] [size=10.5000pt]//显示数据
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]else LCD_ShowxNum(60+(i-4)*32,230,canbuf,3,16,0X80);[size=10.5000pt] [size=10.5000pt]//显示数据
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]res=Can_Send_Msg(canbuf,8);//发送8个字节
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(res)LCD_ShowString(60+80,190,200,16,16,"Failed");[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//提示发送失败
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]else LCD_ShowString(60+80,190,200,16,16,"OK ");[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//提示发送成功[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}else if(key==WKUP_PRES)//WK_UP按下,改变CAN的工作模式
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]mode=!mode;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//CAN普通模式初始化, 波特率500Kbps
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]POINT_COLOR=RED;//设置字体为红色
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(mode==0)//普通模式,需要2个开发板
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,130,200,16,16,"Nnormal Mode ");[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}else //回环模式,一个开发板就可以测试了.
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_ShowString(60,130,200,16,16,"LoopBack Mode");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]POINT_COLOR=BLUE;//设置字体为蓝色
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]key=Can_Receive_Msg(canbuf);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(key)//接收到有数据
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_Fill(60,270,130,310,WHITE);//清除之前的显示
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]for(i=0;i<key;i++)
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(i<4)LCD_ShowxNum(60+i*32,270,canbuf,3,16,0X80);[size=10.5000pt] [size=10.5000pt]//显示数据
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]else LCD_ShowxNum(60+(i-4)*32,290,canbuf,3,16,0X80);[size=10.5000pt] [size=10.5000pt]//显示数据
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]t++;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]delay_ms(10);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(t==20)
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]{
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LED0=!LED0;//提示系统正在运行[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]t=0;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]cnt++;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]LCD_ShowxNum(60+48,170,cnt,3,16,0X80);[size=10.5000pt] [size=10.5000pt]//显示数据
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
|
|