继上两篇帖子
先把程序发上来,这是是STM32的。 遥控器端程序发射程序.zip 测力计端程序 接收程序.zip 然后是接线方式 继上次的图便于说明 图片:{{3@`]6CIA3A7T1@EN6NGOP.png ![]() 电源部分就不说了。。。。 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 然后是遥控器部分 图片:L3%7XX2$(]WK9DZ9VXY_7KY.png ![]() NRF24L01与OLED接线方式同测力计端方式一样 关于矩阵键盘 8个接口分别对应 PD0------PD7 图片:IMG_20160806_205016.jpg ![]() 键位说明 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上面移植过来的,其代码已经很成熟了,这里就不说明了。 上面的代码 仅供参考。 代码很乱很乱,,,,,,,没多少时间整理了,望见谅。 其还可以优化的地方很多很多,希望大家把自己的看法,意见,建议什么的,别藏着掖着啦,都“吐”出来吧(●ˇ∀ˇ●) 好啦,就这样啦。 |
|
|
陈科帝
发布于2016-08-15 23:14
沙发F
对了这些注释什么的,程序上才没有呢。刚刚在文章上面加的注释。。。。
|
|
|
陈科帝
发布于2017-07-21 19:16
板凳F
对了,几天前黄司机一套带走事件,有必要说明一下。不要带电拔插!不要带电拔插!不要带电拔插!
还有,不同测力计的线序颜色是不一样的!!!要根据测力计厂家提供的线序来接HX711。。。照着上面图的接线方式不一定能用。。。。 ![]() |
|
|
零度
发布于2018-04-07 17:53
地板F
呜呜呜呜,下载不了
|
|
|
陈科帝
发布于2018-04-10 17:52
4楼F
|
|
|
零度
发布于2018-04-14 14:13
5楼F
|
|
|