这一篇文章是我前一篇文章的续集,主要是为了弥补 CCS无法实时捕捉数据至上位机的缺陷(可能CCS有,但是我却没找到,如果有读者知道具体答案,请留言告诉我。)。当然串口传输来的数据也有不足的地方,就是这些数据只能让我们感性的观看,如果想做数据分析,如FFT等,可能数据的采样精度就不够了。所以这也是一个不足的地方,希望日后能有解决的办法。下面开始正文部分吧!
废话不多说,先来张效果图:
图1是DSP_demo板加Lcd12864的显示。显示的比较粗糙,026.56就是26.56℃,一些细节没有做好,主要是功能的实现。
图2是使用Matlab2017b的AppDesigner制作的串口通信上位机软件,具体功能有:发送(TX)、接收(RX)、实时绘图、数据实时保存等。其中COM口和波特率需要设置,其他的如:数据位、校验位、停止位等等,已经在代码中默认设置了,因为只是这个小设计的定制版本,也没有高兴将所有功能都全部放置在界面上。
图像中,出现了34℃,那是我用手拿住了 Ds18b20。目前是6月底,江苏黄梅天,今天室温就是27℃左右。
图3是采集到的数据。只是展示了部分,刚开机的时候是没有打开文本存储按钮的,因此第一个数据与图2中接收数据框中前几个数据不是对应的。
图1 图2 图3
效果展示完了,那么接下来就是代码部分:
/*
* 功能:1.DS18B20进行温度采集,并使用12864进行显示
* 2.将采集到的温度 通过SCIA传输,因为SCIB的9口被12864占用,所以不能用SCIB
* 3.SCIA使用CpuTimer0中断,1s传输一次温度数据给PC,未使用FIFO中断
* 波特率:9600 8位数据位,1位停止位,无校验位
*/
#include "DSP2833x_Project.h"
#include "math.h"
#include "lcd12864.h"
#include "ds18b20_para.h"
#define uchar unsigned char
void init_port(void);
uchar Init_DS18B20();
uchar ReadOneChar(void);
void WriteOneChar(uchar dat);
float ReadTemperature();
void lcd_init(void);
void lcd_write_cmd(uchar cmd);
void lcd_write_dat(uchar dat);
void LCD12864SetAddress_f( uchar x, uchar y ); //地址转换
void show(uchar x, uchar y, uchar * data);
void scia_init(void);
void GPIO_init();
interrupt void Timer0_ISR(void);
uchar table[7];
int main(void)
{
float tt;
int tt1;
InitSysCtrl();
init_port(); //ds18b20 & 12864 端口初始化
DINT;
InitPieCtrl(); //初始化中断控制
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();//初始化中断矢量表
GPIO_init(); //配置端口为SCI
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT0 = &Timer0_ISR;//将定时器0中断服务函数入口放入中断向量表
EDIS; // This is needed to disable write to EALLOW protected registers
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0, 150, 1000000); //定时器0定时时间为 1s
scia_init(); //SCIA端口初始化
lcd_init();
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER1.bit.INTx7=1; // PIE Group 1, INT7
IER = 0x001;
EINT;
CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器0
while (1)
{
tt=ReadTemperature();
tt1=tt*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
table[0]=tt1/10000+0x30; //百位
table[1]=tt1%10000/1000+0x30;//十位
table[2]=tt1%1000/100+0x30;//个位
table[3]='.';
table[4]=tt1%100/10+0x30;//十分位;
table[5]=tt1%10+0x30;//百分位;
table[6]='\0'; //用来中止一组显示数据
show(0,0,table);
}
}
//----------------------
//--- 12864 及 DS18B20 的初始化
//----------------------
void init_port(void)
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO40 = 0; // 使能GPIO10 引脚内部上拉
GpioCtrlRegs.GPBMUX1.bit.GPIO40 =0; // 配置GPIO10为通用I/O口
GpioCtrlRegs.GPBQSEL1.bit.GPIO40 = 0; // GPIO40与系统时钟SYSCLKOUT 同步
//lcd12864 use
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // 使能GPIO0 引脚内部上拉
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; // 禁止GPIO1 引脚内部