一、軟件E4A5 APP部署方法
E4A5的部署文件有兩個,
?編輯后綴為e4a為編程文件,技術人員代碼編輯文件,部署文件為apk。使用E4A5時候在設置處可以設置png格式的圖標以及apk文件名,在調試程序前,需要下載
?編輯雷電模擬器作為手機模擬發生器(官網可以下載),E4A5為中文編程,其APK文件通過QQ附件形式可以直接下載安裝在手機上,有些手機為了安全會在QQ下載時候后綴名改了,這個時候在手機默認的文檔里找到該APK,將后綴名修改為APK后可以下載安裝,下載前由于簽字唯一性,需要將之前的程序先卸載,切記。
??
二、軟件飛訊語音功能技術部署方法
訊飛語音組件在E4A5的example例子文件里中級歷程有例子,在編程的媒體類軟件處可以找到
?編輯,同時也需要在擴展庫找到權限操作
?編輯,將例程里將里面的libsarm64-v8alibmsc.so 和 libsarmeabi-v7alibmsc.so 文件導入到E4A左側的工程里的SO庫中,并將Msc.jar文件導入到工程里的JAR包中
?
然后訊飛語音可以用,如果手機有攔截警告,可以予以信任,訊飛語音的準確度一直在平臺更新,準確率達90%。但是有一點需要注意,就是識別結束時候以逗號結束,所以一定在代碼要加上“。”比如:時間設置為10分鐘。
核心代碼: 事件 窗口1.創建完畢() 如果 權限操作1.取系統版本號()>=23 則 權限操作1.申請全部權限() 結束 如果 訊飛語音1.初始化("5cf517a5") '!!!請替換成你自己的APPID,并到左側的工程選項卡中的 引入SO庫 那里替換你自己申請到的SDK開發包中的libmsc.so庫文件和Msc.jar文件 訊飛語音1.初始化語音識別() 訊飛語音1.設置語音識別參數(1,真) 訊飛語音1.初始化語音合成() 訊飛語音1.設置語音合成參數(1,50,50,50) 結束 事件 事件 訊飛語音1.語音識別初始化完畢(初始化結果 為 邏輯型) 如果 初始化結果 = 真 則 語音識別.可用=真 彈出提示("語音識別初始化成功") 否則 語音識別.可用=假 彈出提示("語音識別初始化失敗") 結束 如果 結束 事件 事件 訊飛語音1.語音合成初始化完畢(初始化結果 為 邏輯型) 如果 初始化結果 = 真 則 彈出提示("語音合成初始化成功") 否則 彈出提示("語音合成初始化失敗") 結束 如果 結束 事件 事件 語音識別.被單擊() 訊飛語音1.開始語音識別() 結束 事件 事件 訊飛語音1.語音識別完畢(識別結果 為 邏輯型,識別內容 為 文本型) 變量 分割 為 文本型() 如果 識別結果 = 真 則 分割 = 分割文本(識別內容,"n") 如果 取數組下標(分割,1) > 0 則 如果 分割(0)="時間設置為10分鐘。" 則 分=10 結束 如果 如果 分割(0)="時間設置為20分鐘。" 則 分=20 結束 如果 如果 分割(0)="時間設置為30分鐘。" 則 分=30 結束 如果 如果 分割(0)="強度增大。" 則 強度=強度+1 如果 到數值(強度) > 9 或 到數值(強度) < 0 則 彈出提示("請輸入0-9數字" ) 強度=強度-1 結束 如果 結束 如果 如果 分割(0)="強度減小。" 則 強度=強度-1 如果 到數值(強度) > 9 或 到數值(強度) < 0 則 彈出提示("請輸入0-9數字" ) 強度=強度+1 結束 如果 結束 如果 如果 分割(0)="模式選擇為針灸模式。" 則 模式="針灸模式" 結束 如果 如果 分割(0)="模式選擇為腰部模式。" 則 模式="腰部模式" 結束 如果 如果 分割(0)="模式選擇為腿部模式。" 則 模式="腿部模式" 結束 如果 如果 分割(0)="模式選擇為腦部模式。" 則 模式="腦部模式" 結束 如果 如果 分割(0)="啟動。" 則 啟動狀態=1 如果 分 > 0 則 秒=59 毫秒=100 分=分-1 時間設置.可用=假 強度設置.可用=假 模式選擇.可用=假 藍牙1.發送數據(文本到字節(啟動狀態,"GBK")) 如果 分?10 則 藍牙1.發送數據(文本到字節(",0"&分,"GBK")) 否則 藍牙1.發送數據(文本到字節(","&分,"GBK")) 結束 如果 如果 秒?10 則 藍牙1.發送數據(文本到字節(",0"&秒,"GBK")) 否則 藍牙1.發送數據(文本到字節(","&秒,"GBK")) 結束 如果 藍牙1.發送數據(文本到字節(","&強度,"GBK")) 藍牙1.發送數據(文本到字節(","&模式序號,"GBK")) 啟動.可用=假 按鈕暫停.可用=真 時鐘1.時鐘周期 = 1 結束 如果 如果 分 = 0 則 彈出提示("請先設置時間") 結束 如果 結束 如果 如果 分割(0)="暫停。" 則 如果 按鈕暫停.標題="暫停" 則 按鈕暫停.標題="繼續" 時間設置.可用=真 強度設置.可用=真 模式選擇.可用=真 時鐘1.時鐘周期 = 0 啟動狀態=2 否則 時鐘1.時鐘周期 = 1 按鈕暫停.標題="暫停" 時間設置.可用=假 強度設置.可用=假 模式選擇.可用=假 啟動狀態=1 結束 如果 藍牙1.發送數據(文本到字節(啟動狀態,"GBK")) 如果 分?10 則 藍牙1.發送數據(文本到字節(",0"&分,"GBK")) 否則 藍牙1.發送數據(文本到字節(","&分,"GBK")) 結束 如果 如果 秒?10 則 藍牙1.發送數據(文本到字節(",0"&秒,"GBK")) 否則 藍牙1.發送數據(文本到字節(","&秒,"GBK")) 結束 如果 藍牙1.發送數據(文本到字節(","&強度,"GBK")) 藍牙1.發送數據(文本到字節(","&模式序號,"GBK")) 結束 如果 如果 分割(0)="停止。" 則 秒 = 0 分 = 0 時 = 0 強度=0 啟動狀態=0 時間設置.可用=真 強度設置.可用=真 模式選擇.可用=真 藍牙1.發送數據(文本到字節(啟動狀態,"GBK")) 藍牙1.發送數據(文本到字節(",0"&分,"GBK")) 藍牙1.發送數據(文本到字節(",0"&秒,"GBK")) 藍牙1.發送數據(文本到字節(","&強度,"GBK")) 藍牙1.發送數據(文本到字節(","&模式序號,"GBK")) 啟動.可用=真 按鈕暫停.可用=假 結束 如果 標簽1.標題 = "時間:"&到文本(時) & ":" & 到文本(分) & ":" & 到文本(秒)&"n"&"強度:"&到文本( 強度 )&" "&"模式:"&模式 結束 如果 彈出提示(分割(0)) 否則 彈出提示("識別失敗") 結束 如果 結束 事件
三、軟件E4A5藍牙技術說明
?
(一)使用串口助手或者HID轉串口小助手
可以對HC-4或者更高級版本進行AT指令編輯。當HC-4藍牙連接電腦時候,需要HC-USB-T 參數架配合使用,但當跟單片機具體硬件時候則可以HC-4藍牙直接與單片機TXD和RXD通訊。具體執行圖如圖1 圖2 圖3
圖1
?
圖3
(二)在ESA5里需要三個控件,分別是藍牙、位置傳感器、權限操作,藍牙初始化程序:
事件 主窗口.創建完畢() 如果 權限操作1.檢查權限("android.permission.BLUETOOTH") = 真 且 權限操作1.檢查權限("android.permission.BLUETOOTH_ADMIN") = 真 且 權限操作1.檢查權限("android.permission.READ_PHONE_STATE") = 真 則 彈出提示("已獲得權限,直接初始化藍牙") 初始化藍牙() 否則 彈出提示("未獲得權限,開始申請權限") 權限操作1.申請全部權限() 結束 如果 結束 事件 事件 權限操作1.申請完畢(權限數組 為 文本型(),申請結果 為 整數型()) 如果 權限操作1.檢查權限("android.permission.BLUETOOTH") = 真 且 權限操作1.檢查權限("android.permission.BLUETOOTH_ADMIN") = 真 且 權限操作1.檢查權限("android.permission.READ_PHONE_STATE") = 真 則 初始化藍牙() 否則 信息框("信息","藍牙權限沒有開啟,請在應用的權限設置頁面開啟藍牙權限!","確定") 權限操作1.打開權限設置() 結束 如果 結束 事件 過程 初始化藍牙() 如果 藍牙1.是否存在() = 假 則 信息框("信息","本機找不到藍牙設備,程序將退出!","確定") 結束程序() 結束 如果 如果 藍牙1.是否已開啟() = 假 則 藍牙1.開啟藍牙() 否則 藍牙1.置工作模式(2) 結束 如果 結束 過程 事件 藍牙1.藍牙設置完畢(設置結果 為 整數型) 如果 設置結果 = 2則 藍牙1.置工作模式(2) 結束 如果 結束 事件 藍牙搜索: 事件 按鈕1.被單擊() 位置傳感器1.開始監測() '在新版的安卓系統中,必須開啟GPS定位才能搜索到藍牙設備 列表框1.清空項目() 藍牙1.搜索設備() '搜索設備 彈出提示("正在搜索") 結束 事件 發現藍牙 發現藍牙陳列: 事件 藍牙1.發現設備(設備名稱 為 文本型,設備地址 為 文本型,是否已配對 為 邏輯型) 列表框1.添加項目("理療" & 列表框1.取項目數() & "-" & 設備地址 & "-" & 是否已配對) 列表框1.置項目標記(列表框1.取項目數()-1,設備地址) 結束 事件 選擇列表框里藍牙: 事件 列表框1.表項被單擊(項目索引 為 整數型) 變量 設備地址 為 文本型 藍牙索引=項目索引 設備地址 = 列表框1.取項目標記(項目索引) 標簽1.標題=設備地址 保存對象("標簽1",標簽1) '藍牙1.連接設備(設備地址)'連接設備 '彈出提示("正在連接:" & 設備地址) 保存窗口("窗口1",創建 窗口1)'這句話很重要,要刷新作用,也是聲明創新窗口 切換窗口(讀取窗口("窗口1")) 結束 事件 關閉藍牙: 事件 關閉藍牙.被單擊() 藍牙1.斷開連接() '退出處理,釋放資源,結束內部處理線程 結束程序() 結束 事件 事件 藍牙1.連接完畢(連接結果 為 邏輯型,設備名稱 為 文本型,設備地址 為 文本型,連接模式 為 整數型) 變量 設備信息 為 文本型 變量 文本數組 為 文本型() 變量 啟動窗口 為 主窗口 如果 連接結果 = 真 則 窗口1.標題 = "已連接:" 標簽2.標題 = "已連接" 彈出提示("連接成功") 否則 標簽2.標題 = "未連接" 彈出提示("連接失敗") 結束 如果 結束 事件
值得注意是這兩句全局定義控件,只有保持對象了,在其他窗口才可以引用,藍牙功能就可以跨窗口操作:
保存對象("藍牙1",藍牙1)'這句話很重要,否則權限無法保存
保存窗口("主窗口",本對象) '本對象是當前窗口
四、軟件E4A5串口發送和接收
發收具體命令:
藍牙1.發送數據(文本到字節(啟動狀態,"GBK")),
其中啟動狀態是整數型或者文本型,字符可以直接接收,但是數字需要轉換,單片機接收是ASCII值,所以接收不能直接接收,需要ASCII碼轉換,我是全部將命令以數字形式發送給單片機,單片機有ASCII碼1-9轉換表:uchar shijian[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};單片機接收只能是一個字符一個字符接收,ascii碼減去字符0剛好等于對應的數字,一定要記得。
Recive_table[i]=SBUF;
摘取字符接收:if(Recive_table[i]=='x')//接到需要匯報
摘取數字接收:minute=(Recive_table[1]-'0')*10+(Recive_table[2]-'0');
接收具體命令:
E4A5接收字符串后需要用尋找文本(分割數據,"rp",0) >=0來分割字符,其中rp是尋找標記的起始位置,它的起始開始數字位為0,所以找一個字符其實就是到0那個位置就是準確位置。我們的字符串格式為zifu="rpm10Ms58Sq4Qa2Ab0B",分別代表分鐘、秒、強度、模式、啟動狀態,例:如果 尋找文本(分割數據,"q",0) >0 則 強度= 取指定文本2(分割數據,"q","Q") 結束 如果
事件 藍牙1.收到數據(數據 為 字節型(),設備名稱 為 文本型,設備地址 為 文本型) 變量 收到數據 為 文本型 分割數據=字節到文本(數據,"GBK") ’串口通訊接收字符串 如果 尋找文本(分割數據,"y",0) >=0 則 彈出提示("程序已啟動") 結束 如果 如果 尋找文本(分割數據,"n",0) >=0 則 彈出提示("程序已停止") 結束 如果 如果 尋找文本(分割數據,"z",0) >=0 則 彈出提示("程序已暫停") 結束 如果 'rpm10Ms58Sq4Qa2Ab0B 如果 尋找文本(分割數據,"rp",0) >=0 則 如果 尋找文本(分割數據,"m",0) >0 則 分=取指定文本2(分割數據,"m","M") 結束 如果 如果 尋找文本(分割數據,"s",0) >0 則 秒= 取指定文本2(分割數據,"s","S") 結束 如果 如果 尋找文本(分割數據,"q",0) >0 則 強度= 取指定文本2(分割數據,"q","Q") 結束 如果 如果 尋找文本(分割數據,"a",0) >0 則 模式數額= 取指定文本2(分割數據,"a","A") 如果 模式數額=0 則 模式="針灸模式" 結束 如果 如果 模式數額=1 則 模式="腰部模式" 結束 如果 如果 模式數額=2 則 模式="腿部按摩" 結束 如果 如果 模式數額=3 則 模式="腦部按摩" 結束 如果 結束 如果 如果 尋找文本(分割數據,"b",0) >0 則 啟動狀態= 取指定文本2(分割數據,"b","B") 如果 啟動狀態=0 則 按鈕暫停.可用=假 啟動.可用=真 時鐘1.時鐘周期 = 0 秒 = 0 分 = 0 時 = 0 強度=0 結束 如果 如果 啟動狀態=1 則 時鐘1.時鐘周期 = 1 按鈕暫停.可用=真 啟動.可用=假 結束 如果 如果 啟動狀態=2 則 時鐘1.時鐘周期 = 0 如果 按鈕暫停.標題="暫停" 則 按鈕暫停.標題="繼續" 時鐘1.時鐘周期 = 0 否則 時鐘1.時鐘周期 = 1 按鈕暫停.標題="暫停" 結束 如果 結束 如果 結束 如果 結束 如果 標簽1.標題 = "時間:"&到文本(時) & ":" & 到文本(分) & ":" & 到文本(秒)&"n"&"強度:"&到文本( 強度 )&" "&"模式:"&模式 結束 事件 單片機發送字符串: fasong_table[1]='r'; fasong_table[2]='p'; fasong_table[3]='m'; fasong_table[4]=shijian[minute/10]; fasong_table[5]=shijian[minute%10]; fasong_table[6]='M'; fasong_table[7]='s'; fasong_table[8]=shijian[second/10]; fasong_table[9]=shijian[second%10]; fasong_table[10]='S'; fasong_table[11]='q'; fasong_table[12]=shijian[stre]; fasong_table[13]='Q'; fasong_table[14]='a'; fasong_table[15]=shijian[mod]; fasong_table[16]='A'; fasong_table[17]='b'; fasong_table[18]=shijian[star_bol]; fasong_table[19]='B'; //zifu="rpm10Ms58Sq4Qa2Ab0B"; for(j=0;j<=19;j++) { TI=0; //請求發送標志位 SBUF=fasong_table[j]; while(!TI); }
五、單片機幾個定時器和中斷器使用說明
定時器在該項目中非常重要,STC12C5A60S2只有兩個定時器T0和T1,項目里T0當倒計時,對應中斷3,T1當串口,對應中斷4。但是2路模塊PCA模塊有獨立2個16位定時器,可以很好釋放T0和T1的工作壓力。PCA模塊里啟用PWM模塊時候需要啟用寄存器TMR2和AUXR1特殊功能寄存器。這樣才能啟動獨立的定時器。定時器有12T和1T的晶振頻率,本項目使用是AUXR |= 0x04; 1T的晶振頻率,使用12T啟動不了PCA的PWM模塊,具體如何我也沒研究透。
串口初始化:
#define Timer0_Reload 18432 //T0 interrupt at 10ms @22.1184MHZ sfr AUXR1 = 0xA2; sfr AUXR = 0x8E; sfr S2CON = 0x9A; //12C5A60S2雙串口系列 sfr S2BUF = 0x9B; //12C5A60S2雙串口系列 sfr IE2 = 0xAF; //STC12C5A60S2系列 sfr BRT = 0x9C; ///////////// //sfr AUXR = 0x8E; sfr CCON = 0xD8; sfr CMOD = 0xD9; sfr CCAPM0 = 0xDA; //PCA module 0 work mode sfr CCAPM1 = 0xDB; //PCA module 1 work mode sfr CL = 0xE9; //PCA counter sfr CCAP0L = 0xEA; //PCA模塊0的捕捉/比較寄存器低8位。 sfr CCAP1L = 0xEB; //PCA模塊1的捕捉/比較寄存器低8位。 sfr PCA_PWM0 = 0xF2; //PCA模塊0 PWM寄存器。 sfr PCA_PWM1 = 0xF3; //PCA模塊1 PWM寄存器。 sfr CH = 0xF9; sfr CCAP0H = 0xFA; //PCA模塊0的捕捉/比較寄存器高8位。 sfr CCAP1H = 0xFB; //PCA模塊1的捕捉/比較寄存器高8位。 sbit CCF0 = CCON^0; //PCA 模塊0中斷標志,由硬件置位,必須由軟件清0。 sbit CCF1 = CCON^1; //PCA 模塊1中斷標志,由硬件置位,必須由軟件清0。 sbit CR = CCON^6; //1: 允許PCA計數器計數,必須由軟件清0。 sbit CF = CCON^7; //PCA計數器溢出(CH,CL由FFFFH變為0000H)標志。PCA計數器溢出后由硬件置位,必須由軟件清0。 #define PWM0_NORMAL() PCA_PWM0 = 0 //PWM0正常輸出(默認) #define PWM0_OUT_0() PCA_PWM0 = 3 //PWM0一直輸出0 #define PWM1_NORMAL() PCA_PWM1 = 0 //PWM1正常輸出(默認) #define PWM1_OUT_0() PCA_PWM1 = 3 //PWM1一直輸出0 /************* 本地函數聲明 **************/ void en_PCA(void); void en_PWM(uchar channel,uchar start_value); bit B_T0_interrupt; void Uart_Init() { PCON &= 0x7F; //波特率不倍速https://blog.csdn.net/lzxiaotu/article/details/117666450 SCON = 0x50; //8位數據,可變波特率 AUXR |= 0x04; //獨立波特率發生器時鐘為Fosc,即1T BRT = 0xDC; //設定獨立波特率發生器重裝值 AUXR |= 0x01; //串口1選擇獨立波特率發生器為波特率發生器 AUXR |= 0x10; //啟動獨立波特率發生器 EA = 1;//開總中斷 ES = 1;//開串口中斷 } PWM初始化: void pwm_init() { uint i; en_PWM(0,pwmH_num); //load PWM value en_PWM(1,pwmL_num); //load PWM value en_PCA(); //enable PCA EA = 1; //enable all interrupt TMOD = 0x02; //T0 as 8 bit reload TH0 = 0 - 10; //Reload time AUXR |= 0x80; //T0 as 1T ET0 = 0; //disable T0 interrupt TR0 = 1; //enable T0 PWM0_NORMAL(); //PWM0 normal output PWM1_NORMAL(); //PWM1 normal output for(i=0; i?10000; i++) ; //delay for output PWM TR0 = 0; //disable T0 PWM0_OUT_0(); //PWM0 stop and putput 0 PWM1_OUT_0(); //PWM1 stop and putput 0 TMOD = 0x01; //T0 as 16bit timer TL0 = (0 - Timer0_Reload) % 256; //load the 16bit time TH0 = (0 - Timer0_Reload) / 256; AUXR &= ~0x80; //T0 as 12T ET0 = 1; //enable T0 interrupt TR0 = 1; //enable T0 B_T0_interrupt = 0; //clear the T0 interrupt flag while(!B_T0_interrupt); //wait the T0 interrupt TR0 = 0; //disable T0 } 定時器初始化: void TIM2Inital(void) { TMOD=0x10;//T1設置為定時器 TH1=(65536-50000)/256;//設定初值 TL1=(65536-50000)%256; ET1=1; EA=1; TR1=0;//啟動TR }
六、單片機STC12C5A60S2芯片的pwm模塊介紹與使用
單片機只有s2結尾才代表有獨立的兩個PCB模塊,那么pwm是怎么發出呢?根據手冊,本項目的串口大概是默認 RXD2為P1.2,可以切換到P4.2 ,TXD2默認為-P1.3,可以切換到P4.3。
本研究采用STC12C5A60S2單片機實現CCP脈沖波的精確控制。與傳統51單片機相比,該單片機具有專用的AUXR輔助寄存器,使CCP脈沖波計時更為獨立和準確[16]。本研究通過以下公式計算PWM頻率初始值:
理療儀的各種調制波形根據所需治療效果進行定制,包括脈寬、脈沖間隔、持續時間和關斷時間。實驗中,共80名測試者分為A、B兩組進行治療效果對比。A組僅采用傳統醫療手法,而B組則結合了本設備的輔助治療。兩周的治療后,本研究對比了兩組的效果,如表1所示。
表1 常規手法與設備輔助治療效果的對比
組別 | 治療部位 | 理療手法 | 效果(%) | 匯總(%) |
A組 | 腰部 | 錘擊、揉捏 | 60 | 55 |
A組 | 腿部 | 針刺、揉捏 | 50 | - |
A組 | 手部 | 針刺、叩擊、揉捏 | 70 | - |
A組 | 頭部 | 針刺、揉捏 | 40 | - |
B組 | 腰部 | 錘擊、揉捏 + 設備 | 80 | 82.5 |
B組 | 腿部 | 針刺、揉捏 + 設備 | 90 | - |
B組 | 手部 | 針刺、叩擊、揉捏 + 設備 | 90 | - |
B組 | 頭部 | 針刺、揉捏 + 設備 | 70 | - |
研究利用示波器捕獲了設備輸出的治療波形,以此驗證設備的性能和治療波形的一致性,如圖4所示。
圖4 PWM調制成治療波形展示
具體代碼:
void mol_methor() { switch(mod) { case 0: pwmH_num=120; pwmL_num=50; if(jishi>15) { pwmH_num=50; pwmL_num=120; if(jishi==30) { jishi=0; } } break; case 1: pwmH_num=130; pwmL_num=100; if(jishi>15) { pwmH_num=199; pwmL_num=130; if(jishi==30) { jishi=0; } } break; case 2: pwmH_num=80; pwmL_num=110; if(jishi>15) { pwmH_num=110; pwmL_num=80; if(jishi==30) { jishi=0; } } break; default: pwmH_num=160; pwmL_num=110; if(jishi>15) { pwmH_num=110; pwmL_num=160; if(jishi==30) { jishi=0; } } break; } }
審核編輯 黃宇
-
芯片
+關注
關注
450文章
49603瀏覽量
417028 -
藍牙
+關注
關注
114文章
5677瀏覽量
168034 -
通訊
+關注
關注
9文章
874瀏覽量
34663 -
串口
+關注
關注
14文章
1533瀏覽量
75433 -
keil
+關注
關注
68文章
1207瀏覽量
166159
發布評論請先 登錄
相關推薦
評論