继上两篇帖子
先把程序发上来,这是是STM32的。
遥控器端程序
发射程序.zip
(7.22 MB, 下载次数: 291)
测力计端程序
接收程序.zip
(7.46 MB, 下载次数: 143)
然后是接线方式
继上次的图便于说明
电源部分就不说了。。。。
OLED接线方式
CS---------PA5
RST-------PB7
RS---------PB6
SCLK-----PB9
SDIN------PB8
NRF24L01接线方式
CE-------PB0
IRQ------PB1
CSN-----PA4
SCK-----PA5
MISO----PA6
MOSI----PA7
继电器接线方式
继电器1------PD3
继电器2------PD5
测力计接线方式
SCK---PB10
DT-----PB11
然后是遥控器部分
NRF24L01与OLED接线方式同测力计端方式一样
关于矩阵键盘
8个接口分别对应
PD0------PD7
键位说明
A-----发射按钮(输入好密码点击发射,就会成功出发接收端的点火器哟)
B-----清空按钮(什么密码输错了怎么办?需不需要重启复位啊?不要这么麻烦,按一下B就好了)
C-----手动改测力计采集频率按钮(按下去后会将测力器端的采集频率改为1次每秒,肉眼观察到发动机燃烧完毕后,按一下。妈妈再也不用担心无用数据太多啦)
D-----这个按钮什么用都没有哟
* -----同上(╯-_-)╯╧╧(你们可以自己开发啦)
#-----同上上( ▼-▼ )(年轻人自己开发吧,不要怂,就是干!)
*******************************************************我是分隔线******************************************************************(哼ヽ(≧Д≦)ノ,就是这么傲娇)
然后简单讲一讲程序了吧
首先是遥控器端(发射端)
先是矩阵键盘驱动代码,超简单哒。
一次一次的扫描
unsigned char KeyScan(void)
{
line_0 = 0;
line_1 = 1;
line_2 = 1;
line_3 = 1;
if(!list_0) return 1;
else if (!list_1) return 2;
else if (!list_2) return 3;
else if (!list_3) return 4;
line_0 = 1;
line_1 = 0;
line_2 = 1;
line_3 = 1;
if(!list_0) return 5;
else if (!list_1) return 6;
else if (!list_2) return 7;
else if (!list_3) return 8;
line_0 = 1;
line_1 = 1;
line_2 = 0;
line_3 = 1;
if(!list_0) return 9;
else if (!list_1) return 10;
else if (!list_2) return 11;
else if (!list_3) return 12;
line_0 = 1;
line_1 = 1;
line_2 = 1;
line_3 = 0;
if(!list_0) return 13;
else if (!list_1) return 14;
else if (!list_2) return 15;
else if (!list_3) return 16;
else
{
a=0;
return 17;
}
line_0 = 1;
line_1 = 1;
line_2 = 1;
line_3 = 1;
list_0 = 1;
list_1 = 1;
list_2 = 1;
list_3 = 1;
}
检测到相应按键被按下就会返回对应一个值,比如说按下1键便会返回1这个值
然后看主程序中
if(x==1&&a==0)
{
a=1;//先将标志位置1
y=10*y+x;//Y就会加1位1
OLED_ShowNum(5,0,x ,3,12);//显示X
OLED_ShowNum(5,20,y ,6,12);//显示Y
OLED_Refresh_Gram(); //刷新PLED
}
再来看看发射按钮
if(x==4&&a==0)//A键发送
{
a=1; //先将标志位置1
Password=y;
Tx_Buf1[0]=Password/256;
Tx_Buf1[1]=Password%256;
NRF24L01_TxPacket(Tx_Buf1); //发送这个数组
}
这个就简单介绍到这里。
关于OLED驱动,NRF驱动什么的。。基本都是网上这里捞捞,那里复制复制。。。
说以也没什么讲的了。。
关于测力计端口
首先看一下中断函数中(20ms进入一次中断)
if(TIM3->SR&0X0001)
{
a1++; //a1默认值是0
if(a1>=a2) //a2默认值是50,所以再未点火前只有当a1等于50的时候才会向SD卡中写入一次,即50*20ms=1秒,一秒写入一次
{
a1=0;
xieSD(); //向SD卡写入数据
}
}
然后是主函数中
if(shuju==10203)
{
a2=0; //直接将a2变为0,那么之前的一秒写入一次数据变为20ms写入一次数据,这也是点火的时候。
jidianqi1=1;
jidianqi2=1; //两个继电器同时激活
delay_ms(100); //延长继电器工作时间,保证点火成功率。
}
然后是如何将写入速度再次改为1秒一次
if(shuju==55555)
{
a2=50; //灰常简单,将a2改为50即可。
}
然后是关于写卡
int xieSD()
{
f_mount(0,&fs);
itoa(PressCalcuate (), TXT_Str, 10); //一个转换函数,转为字符串
res = f_open(&fnew, "0.txt", FA_READ | FA_WRITE | FA_OPEN_ALWAYS);
res = f_lseek(&fnew, f_size(&fnew)); //把指针指向文件末端
res = f_write(&fnew,&TXT_Str, sizeof(TXT_Str), &bw); //像记事本写入
f_close(&fnew);
//char enter=0xd;//char line_break=0xa; 这两个就是回车的 ASCII码了 写进去就相当于自动换行啦
res = f_open(&fnew, "0.txt", FA_READ | FA_WRITE | FA_OPEN_ALWAYS);
res = f_lseek(&fnew, f_size(&fnew));
res = f_write(&fnew, &enter, sizeof(enter), &bw); // 写入0x ASCII码
f_close(&fnew);
res = f_open(&fnew, "0.txt", FA_READ | FA_WRITE | FA_OPEN_ALWAYS);
res = f_lseek(&fnew, f_size(&fnew));
res = f_write(&fnew,&line_break, sizeof(line_break), &bw); //写入0xa ASCII码
f_close(&fnew);
f_mount(0, NULL);
ii++; //写入一次ii加一,便于观察写入次数
}
关于测力计程序,是之前从51上面移植过来的,其代码已经很成熟了,这里就不说明了。
上面的代码 仅供参考。
代码很乱很乱,,,,,,,没多少时间整理了,望见谅。
其还可以优化的地方很多很多,希望大家把自己的看法,意见,建议什么的,别藏着掖着啦,都“吐”出来吧(●ˇ∀ˇ●)
好啦,就这样啦。 |
|