一、軟件E4A5 APP部署方法
E4A5的部署文件有兩個(gè),


?編輯后綴為e4a為編程文件,技術(shù)人員代碼編輯文件,部署文件為apk。使用E4A5時(shí)候在設(shè)置處可以設(shè)置png格式的圖標(biāo)以及apk文件名,在調(diào)試程序前,需要下載


?編輯雷電模擬器作為手機(jī)模擬發(fā)生器(官網(wǎng)可以下載),E4A5為中文編程,其APK文件通過QQ附件形式可以直接下載安裝在手機(jī)上,有些手機(jī)為了安全會(huì)在QQ下載時(shí)候后綴名改了,這個(gè)時(shí)候在手機(jī)默認(rèn)的文檔里找到該APK,將后綴名修改為APK后可以下載安裝,下載前由于簽字唯一性,需要將之前的程序先卸載,切記。
??
二、軟件飛訊語(yǔ)音功能技術(shù)部署方法
訊飛語(yǔ)音組件在E4A5的example例子文件里中級(jí)歷程有例子,在編程的媒體類軟件處可以找到


?編輯,同時(shí)也需要在擴(kuò)展庫(kù)找到權(quán)限操作


?編輯,將例程里將里面的libsarm64-v8alibmsc.so 和 libsarmeabi-v7alibmsc.so 文件導(dǎo)入到E4A左側(cè)的工程里的SO庫(kù)中,并將Msc.jar文件導(dǎo)入到工程里的JAR包中
?

然后訊飛語(yǔ)音可以用,如果手機(jī)有攔截警告,可以予以信任,訊飛語(yǔ)音的準(zhǔn)確度一直在平臺(tái)更新,準(zhǔn)確率達(dá)90%。但是有一點(diǎn)需要注意,就是識(shí)別結(jié)束時(shí)候以逗號(hào)結(jié)束,所以一定在代碼要加上“?!北热纾簳r(shí)間設(shè)置為10分鐘。
核心代碼:
事件 窗口1.創(chuàng)建完畢()
如果 權(quán)限操作1.取系統(tǒng)版本號(hào)()>=23 則
權(quán)限操作1.申請(qǐng)全部權(quán)限()
結(jié)束 如果
訊飛語(yǔ)音1.初始化("5cf517a5") '?。?!請(qǐng)?zhí)鎿Q成你自己的APPID,并到左側(cè)的工程選項(xiàng)卡中的 引入SO庫(kù) 那里替換你自己申請(qǐng)到的SDK開發(fā)包中的libmsc.so庫(kù)文件和Msc.jar文件
訊飛語(yǔ)音1.初始化語(yǔ)音識(shí)別()
訊飛語(yǔ)音1.設(shè)置語(yǔ)音識(shí)別參數(shù)(1,真)
訊飛語(yǔ)音1.初始化語(yǔ)音合成()
訊飛語(yǔ)音1.設(shè)置語(yǔ)音合成參數(shù)(1,50,50,50)
結(jié)束 事件
事件 訊飛語(yǔ)音1.語(yǔ)音識(shí)別初始化完畢(初始化結(jié)果 為 邏輯型)
如果 初始化結(jié)果 = 真 則
語(yǔ)音識(shí)別.可用=真
彈出提示("語(yǔ)音識(shí)別初始化成功")
否則
語(yǔ)音識(shí)別.可用=假
彈出提示("語(yǔ)音識(shí)別初始化失敗")
結(jié)束 如果
結(jié)束 事件
事件 訊飛語(yǔ)音1.語(yǔ)音合成初始化完畢(初始化結(jié)果 為 邏輯型)
如果 初始化結(jié)果 = 真 則
彈出提示("語(yǔ)音合成初始化成功")
否則
彈出提示("語(yǔ)音合成初始化失敗")
結(jié)束 如果
結(jié)束 事件
事件 語(yǔ)音識(shí)別.被單擊()
訊飛語(yǔ)音1.開始語(yǔ)音識(shí)別()
結(jié)束 事件
事件 訊飛語(yǔ)音1.語(yǔ)音識(shí)別完畢(識(shí)別結(jié)果 為 邏輯型,識(shí)別內(nèi)容 為 文本型)
變量 分割 為 文本型()
如果 識(shí)別結(jié)果 = 真 則
分割 = 分割文本(識(shí)別內(nèi)容,"n")
如果 取數(shù)組下標(biāo)(分割,1) > 0 則
如果 分割(0)="時(shí)間設(shè)置為10分鐘。" 則
分=10
結(jié)束 如果
如果 分割(0)="時(shí)間設(shè)置為20分鐘。" 則
分=20
結(jié)束 如果
如果 分割(0)="時(shí)間設(shè)置為30分鐘。" 則
分=30
結(jié)束 如果
如果 分割(0)="強(qiáng)度增大。" 則
強(qiáng)度=強(qiáng)度+1
如果 到數(shù)值(強(qiáng)度) > 9 或 到數(shù)值(強(qiáng)度) < 0 則
彈出提示("請(qǐng)輸入0-9數(shù)字" )
強(qiáng)度=強(qiáng)度-1
結(jié)束 如果
結(jié)束 如果
如果 分割(0)="強(qiáng)度減小。" 則
強(qiáng)度=強(qiáng)度-1
如果 到數(shù)值(強(qiáng)度) > 9 或 到數(shù)值(強(qiáng)度) < 0 則
彈出提示("請(qǐng)輸入0-9數(shù)字" )
強(qiáng)度=強(qiáng)度+1
結(jié)束 如果
結(jié)束 如果
如果 分割(0)="模式選擇為針灸模式。" 則
模式="針灸模式"
結(jié)束 如果
如果 分割(0)="模式選擇為腰部模式。" 則
模式="腰部模式"
結(jié)束 如果
如果 分割(0)="模式選擇為腿部模式。" 則
模式="腿部模式"
結(jié)束 如果
如果 分割(0)="模式選擇為腦部模式。" 則
模式="腦部模式"
結(jié)束 如果
如果 分割(0)="啟動(dòng)。" 則
啟動(dòng)狀態(tài)=1
如果 分 > 0 則
秒=59
毫秒=100
分=分-1
時(shí)間設(shè)置.可用=假
強(qiáng)度設(shè)置.可用=假
模式選擇.可用=假
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(啟動(dòng)狀態(tài),"GBK"))
如果 分?10 則
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(",0"&分,"GBK"))
否則
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&分,"GBK"))
結(jié)束 如果
如果 秒?10 則
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(",0"&秒,"GBK"))
否則
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&秒,"GBK"))
結(jié)束 如果
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&強(qiáng)度,"GBK"))
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&模式序號(hào),"GBK"))
啟動(dòng).可用=假
按鈕暫停.可用=真
時(shí)鐘1.時(shí)鐘周期 = 1
結(jié)束 如果
如果 分 = 0 則
彈出提示("請(qǐng)先設(shè)置時(shí)間")
結(jié)束 如果
結(jié)束 如果
如果 分割(0)="暫停。" 則
如果 按鈕暫停.標(biāo)題="暫停" 則
按鈕暫停.標(biāo)題="繼續(xù)"
時(shí)間設(shè)置.可用=真
強(qiáng)度設(shè)置.可用=真
模式選擇.可用=真
時(shí)鐘1.時(shí)鐘周期 = 0
啟動(dòng)狀態(tài)=2
否則
時(shí)鐘1.時(shí)鐘周期 = 1
按鈕暫停.標(biāo)題="暫停"
時(shí)間設(shè)置.可用=假
強(qiáng)度設(shè)置.可用=假
模式選擇.可用=假
啟動(dòng)狀態(tài)=1
結(jié)束 如果
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(啟動(dòng)狀態(tài),"GBK"))
如果 分?10 則
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(",0"&分,"GBK"))
否則
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&分,"GBK"))
結(jié)束 如果
如果 秒?10 則
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(",0"&秒,"GBK"))
否則
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&秒,"GBK"))
結(jié)束 如果
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&強(qiáng)度,"GBK"))
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&模式序號(hào),"GBK"))
結(jié)束 如果
如果 分割(0)="停止。" 則
秒 = 0
分 = 0
時(shí) = 0
強(qiáng)度=0
啟動(dòng)狀態(tài)=0
時(shí)間設(shè)置.可用=真
強(qiáng)度設(shè)置.可用=真
模式選擇.可用=真
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(啟動(dòng)狀態(tài),"GBK"))
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(",0"&分,"GBK"))
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(",0"&秒,"GBK"))
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&強(qiáng)度,"GBK"))
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(","&模式序號(hào),"GBK"))
啟動(dòng).可用=真
按鈕暫停.可用=假
結(jié)束 如果
標(biāo)簽1.標(biāo)題 = "時(shí)間:"&到文本(時(shí)) & ":" & 到文本(分) & ":" & 到文本(秒)&"n"&"強(qiáng)度:"&到文本( 強(qiáng)度 )&" "&"模式:"&模式
結(jié)束 如果
彈出提示(分割(0))
否則
彈出提示("識(shí)別失敗")
結(jié)束 如果
結(jié)束 事件
三、軟件E4A5藍(lán)牙技術(shù)說明
?
(一)使用串口助手或者HID轉(zhuǎn)串口小助手

可以對(duì)HC-4或者更高級(jí)版本進(jìn)行AT指令編輯。當(dāng)HC-4藍(lán)牙連接電腦時(shí)候,需要HC-USB-T 參數(shù)架配合使用,但當(dāng)跟單片機(jī)具體硬件時(shí)候則可以HC-4藍(lán)牙直接與單片機(jī)TXD和RXD通訊。具體執(zhí)行圖如圖1 圖2 圖3

圖1
?

圖3
(二)在ESA5里需要三個(gè)控件,分別是藍(lán)牙、位置傳感器、權(quán)限操作,藍(lán)牙初始化程序:
事件 主窗口.創(chuàng)建完畢()
如果 權(quán)限操作1.檢查權(quán)限("android.permission.BLUETOOTH") = 真 且 權(quán)限操作1.檢查權(quán)限("android.permission.BLUETOOTH_ADMIN") = 真 且 權(quán)限操作1.檢查權(quán)限("android.permission.READ_PHONE_STATE") = 真 則
彈出提示("已獲得權(quán)限,直接初始化藍(lán)牙")
初始化藍(lán)牙()
否則
彈出提示("未獲得權(quán)限,開始申請(qǐng)權(quán)限")
權(quán)限操作1.申請(qǐng)全部權(quán)限()
結(jié)束 如果
結(jié)束 事件
事件 權(quán)限操作1.申請(qǐng)完畢(權(quán)限數(shù)組 為 文本型(),申請(qǐng)結(jié)果 為 整數(shù)型())
如果 權(quán)限操作1.檢查權(quán)限("android.permission.BLUETOOTH") = 真 且 權(quán)限操作1.檢查權(quán)限("android.permission.BLUETOOTH_ADMIN") = 真 且 權(quán)限操作1.檢查權(quán)限("android.permission.READ_PHONE_STATE") = 真 則
初始化藍(lán)牙()
否則
信息框("信息","藍(lán)牙權(quán)限沒有開啟,請(qǐng)?jiān)趹?yīng)用的權(quán)限設(shè)置頁(yè)面開啟藍(lán)牙權(quán)限!","確定")
權(quán)限操作1.打開權(quán)限設(shè)置()
結(jié)束 如果
結(jié)束 事件
過程 初始化藍(lán)牙()
如果 藍(lán)牙1.是否存在() = 假 則
信息框("信息","本機(jī)找不到藍(lán)牙設(shè)備,程序?qū)⑼顺觯?,"確定")
結(jié)束程序()
結(jié)束 如果
如果 藍(lán)牙1.是否已開啟() = 假 則
藍(lán)牙1.開啟藍(lán)牙()
否則
藍(lán)牙1.置工作模式(2)
結(jié)束 如果
結(jié)束 過程
事件 藍(lán)牙1.藍(lán)牙設(shè)置完畢(設(shè)置結(jié)果 為 整數(shù)型)
如果 設(shè)置結(jié)果 = 2則
藍(lán)牙1.置工作模式(2)
結(jié)束 如果
結(jié)束 事件
藍(lán)牙搜索:
事件 按鈕1.被單擊()
位置傳感器1.開始監(jiān)測(cè)() '在新版的安卓系統(tǒng)中,必須開啟GPS定位才能搜索到藍(lán)牙設(shè)備
列表框1.清空項(xiàng)目()
藍(lán)牙1.搜索設(shè)備() '搜索設(shè)備
彈出提示("正在搜索")
結(jié)束 事件
發(fā)現(xiàn)藍(lán)牙
發(fā)現(xiàn)藍(lán)牙陳列:
事件 藍(lán)牙1.發(fā)現(xiàn)設(shè)備(設(shè)備名稱 為 文本型,設(shè)備地址 為 文本型,是否已配對(duì) 為 邏輯型)
列表框1.添加項(xiàng)目("理療" & 列表框1.取項(xiàng)目數(shù)() & "-" & 設(shè)備地址 & "-" & 是否已配對(duì))
列表框1.置項(xiàng)目標(biāo)記(列表框1.取項(xiàng)目數(shù)()-1,設(shè)備地址)
結(jié)束 事件
選擇列表框里藍(lán)牙:
事件 列表框1.表項(xiàng)被單擊(項(xiàng)目索引 為 整數(shù)型)
變量 設(shè)備地址 為 文本型
藍(lán)牙索引=項(xiàng)目索引
設(shè)備地址 = 列表框1.取項(xiàng)目標(biāo)記(項(xiàng)目索引)
標(biāo)簽1.標(biāo)題=設(shè)備地址
保存對(duì)象("標(biāo)簽1",標(biāo)簽1)
'藍(lán)牙1.連接設(shè)備(設(shè)備地址)'連接設(shè)備
'彈出提示("正在連接:" & 設(shè)備地址)
保存窗口("窗口1",創(chuàng)建 窗口1)'這句話很重要,要刷新作用,也是聲明創(chuàng)新窗口
切換窗口(讀取窗口("窗口1"))
結(jié)束 事件
關(guān)閉藍(lán)牙:
事件 關(guān)閉藍(lán)牙.被單擊()
藍(lán)牙1.斷開連接() '退出處理,釋放資源,結(jié)束內(nèi)部處理線程
結(jié)束程序()
結(jié)束 事件
事件 藍(lán)牙1.連接完畢(連接結(jié)果 為 邏輯型,設(shè)備名稱 為 文本型,設(shè)備地址 為 文本型,連接模式 為 整數(shù)型)
變量 設(shè)備信息 為 文本型
變量 文本數(shù)組 為 文本型()
變量 啟動(dòng)窗口 為 主窗口
如果 連接結(jié)果 = 真 則
窗口1.標(biāo)題 = "已連接:"
標(biāo)簽2.標(biāo)題 = "已連接"
彈出提示("連接成功")
否則
標(biāo)簽2.標(biāo)題 = "未連接"
彈出提示("連接失敗")
結(jié)束 如果
結(jié)束 事件
值得注意是這兩句全局定義控件,只有保持對(duì)象了,在其他窗口才可以引用,藍(lán)牙功能就可以跨窗口操作:
保存對(duì)象("藍(lán)牙1",藍(lán)牙1)'這句話很重要,否則權(quán)限無法保存
保存窗口("主窗口",本對(duì)象) '本對(duì)象是當(dāng)前窗口
四、軟件E4A5串口發(fā)送和接收
發(fā)收具體命令:
藍(lán)牙1.發(fā)送數(shù)據(jù)(文本到字節(jié)(啟動(dòng)狀態(tài),"GBK")),
其中啟動(dòng)狀態(tài)是整數(shù)型或者文本型,字符可以直接接收,但是數(shù)字需要轉(zhuǎn)換,單片機(jī)接收是ASCII值,所以接收不能直接接收,需要ASCII碼轉(zhuǎn)換,我是全部將命令以數(shù)字形式發(fā)送給單片機(jī),單片機(jī)有ASCII碼1-9轉(zhuǎn)換表:uchar shijian[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};單片機(jī)接收只能是一個(gè)字符一個(gè)字符接收,ascii碼減去字符0剛好等于對(duì)應(yīng)的數(shù)字,一定要記得。
Recive_table[i]=SBUF;
摘取字符接收:if(Recive_table[i]=='x')//接到需要匯報(bào)
摘取數(shù)字接收:minute=(Recive_table[1]-'0')*10+(Recive_table[2]-'0');
接收具體命令:
E4A5接收字符串后需要用尋找文本(分割數(shù)據(jù),"rp",0) >=0來分割字符,其中rp是尋找標(biāo)記的起始位置,它的起始開始數(shù)字位為0,所以找一個(gè)字符其實(shí)就是到0那個(gè)位置就是準(zhǔn)確位置。我們的字符串格式為zifu="rpm10Ms58Sq4Qa2Ab0B",分別代表分鐘、秒、強(qiáng)度、模式、啟動(dòng)狀態(tài),例:如果 尋找文本(分割數(shù)據(jù),"q",0) >0 則 強(qiáng)度= 取指定文本2(分割數(shù)據(jù),"q","Q") 結(jié)束 如果
事件 藍(lán)牙1.收到數(shù)據(jù)(數(shù)據(jù) 為 字節(jié)型(),設(shè)備名稱 為 文本型,設(shè)備地址 為 文本型)
變量 收到數(shù)據(jù) 為 文本型
分割數(shù)據(jù)=字節(jié)到文本(數(shù)據(jù),"GBK") ’串口通訊接收字符串
如果 尋找文本(分割數(shù)據(jù),"y",0) >=0 則
彈出提示("程序已啟動(dòng)")
結(jié)束 如果
如果 尋找文本(分割數(shù)據(jù),"n",0) >=0 則
彈出提示("程序已停止")
結(jié)束 如果
如果 尋找文本(分割數(shù)據(jù),"z",0) >=0 則
彈出提示("程序已暫停")
結(jié)束 如果
'rpm10Ms58Sq4Qa2Ab0B
如果 尋找文本(分割數(shù)據(jù),"rp",0) >=0 則
如果 尋找文本(分割數(shù)據(jù),"m",0) >0 則
分=取指定文本2(分割數(shù)據(jù),"m","M")
結(jié)束 如果
如果 尋找文本(分割數(shù)據(jù),"s",0) >0 則
秒= 取指定文本2(分割數(shù)據(jù),"s","S")
結(jié)束 如果
如果 尋找文本(分割數(shù)據(jù),"q",0) >0 則
強(qiáng)度= 取指定文本2(分割數(shù)據(jù),"q","Q")
結(jié)束 如果
如果 尋找文本(分割數(shù)據(jù),"a",0) >0 則
模式數(shù)額= 取指定文本2(分割數(shù)據(jù),"a","A")
如果 模式數(shù)額=0 則
模式="針灸模式"
結(jié)束 如果
如果 模式數(shù)額=1 則
模式="腰部模式"
結(jié)束 如果
如果 模式數(shù)額=2 則
模式="腿部按摩"
結(jié)束 如果
如果 模式數(shù)額=3 則
模式="腦部按摩"
結(jié)束 如果
結(jié)束 如果
如果 尋找文本(分割數(shù)據(jù),"b",0) >0 則
啟動(dòng)狀態(tài)= 取指定文本2(分割數(shù)據(jù),"b","B")
如果 啟動(dòng)狀態(tài)=0 則
按鈕暫停.可用=假
啟動(dòng).可用=真
時(shí)鐘1.時(shí)鐘周期 = 0
秒 = 0
分 = 0
時(shí) = 0
強(qiáng)度=0
結(jié)束 如果
如果 啟動(dòng)狀態(tài)=1 則
時(shí)鐘1.時(shí)鐘周期 = 1
按鈕暫停.可用=真
啟動(dòng).可用=假
結(jié)束 如果
如果 啟動(dòng)狀態(tài)=2 則
時(shí)鐘1.時(shí)鐘周期 = 0
如果 按鈕暫停.標(biāo)題="暫停" 則
按鈕暫停.標(biāo)題="繼續(xù)"
時(shí)鐘1.時(shí)鐘周期 = 0
否則
時(shí)鐘1.時(shí)鐘周期 = 1
按鈕暫停.標(biāo)題="暫停"
結(jié)束 如果
結(jié)束 如果
結(jié)束 如果
結(jié)束 如果
標(biāo)簽1.標(biāo)題 = "時(shí)間:"&到文本(時(shí)) & ":" & 到文本(分) & ":" & 到文本(秒)&"n"&"強(qiáng)度:"&到文本( 強(qiáng)度 )&" "&"模式:"&模式
結(jié)束 事件
單片機(jī)發(fā)送字符串:
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; //請(qǐng)求發(fā)送標(biāo)志位
SBUF=fasong_table[j];
while(!TI);
}
五、單片機(jī)幾個(gè)定時(shí)器和中斷器使用說明
定時(shí)器在該項(xiàng)目中非常重要,STC12C5A60S2只有兩個(gè)定時(shí)器T0和T1,項(xiàng)目里T0當(dāng)?shù)褂?jì)時(shí),對(duì)應(yīng)中斷3,T1當(dāng)串口,對(duì)應(yīng)中斷4。但是2路模塊PCA模塊有獨(dú)立2個(gè)16位定時(shí)器,可以很好釋放T0和T1的工作壓力。PCA模塊里啟用PWM模塊時(shí)候需要啟用寄存器TMR2和AUXR1特殊功能寄存器。這樣才能啟動(dòng)獨(dú)立的定時(shí)器。定時(shí)器有12T和1T的晶振頻率,本項(xiàng)目使用是AUXR |= 0x04; 1T的晶振頻率,使用12T啟動(dòng)不了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中斷標(biāo)志,由硬件置位,必須由軟件清0。 sbit CCF1 = CCON^1; //PCA 模塊1中斷標(biāo)志,由硬件置位,必須由軟件清0。 sbit CR = CCON^6; //1: 允許PCA計(jì)數(shù)器計(jì)數(shù),必須由軟件清0。 sbit CF = CCON^7; //PCA計(jì)數(shù)器溢出(CH,CL由FFFFH變?yōu)?000H)標(biāo)志。PCA計(jì)數(shù)器溢出后由硬件置位,必須由軟件清0。 #define PWM0_NORMAL() PCA_PWM0 = 0 //PWM0正常輸出(默認(rèn)) #define PWM0_OUT_0() PCA_PWM0 = 3 //PWM0一直輸出0 #define PWM1_NORMAL() PCA_PWM1 = 0 //PWM1正常輸出(默認(rèn)) #define PWM1_OUT_0() PCA_PWM1 = 3 //PWM1一直輸出0 /************* 本地函數(shù)聲明 **************/ 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位數(shù)據(jù),可變波特率 AUXR |= 0x04; //獨(dú)立波特率發(fā)生器時(shí)鐘為Fosc,即1T BRT = 0xDC; //設(shè)定獨(dú)立波特率發(fā)生器重裝值 AUXR |= 0x01; //串口1選擇獨(dú)立波特率發(fā)生器為波特率發(fā)生器 AUXR |= 0x10; //啟動(dòng)獨(dú)立波特率發(fā)生器 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 } 定時(shí)器初始化: void TIM2Inital(void) { TMOD=0x10;//T1設(shè)置為定時(shí)器 TH1=(65536-50000)/256;//設(shè)定初值 TL1=(65536-50000)%256; ET1=1; EA=1; TR1=0;//啟動(dòng)TR }
六、單片機(jī)STC12C5A60S2芯片的pwm模塊介紹與使用
單片機(jī)只有s2結(jié)尾才代表有獨(dú)立的兩個(gè)PCB模塊,那么pwm是怎么發(fā)出呢?根據(jù)手冊(cè),本項(xiàng)目的串口大概是默認(rèn) RXD2為P1.2,可以切換到P4.2 ,TXD2默認(rèn)為-P1.3,可以切換到P4.3。
本研究采用STC12C5A60S2單片機(jī)實(shí)現(xiàn)CCP脈沖波的精確控制。與傳統(tǒng)51單片機(jī)相比,該單片機(jī)具有專用的AUXR輔助寄存器,使CCP脈沖波計(jì)時(shí)更為獨(dú)立和準(zhǔn)確[16]。本研究通過以下公式計(jì)算PWM頻率初始值:

理療儀的各種調(diào)制波形根據(jù)所需治療效果進(jìn)行定制,包括脈寬、脈沖間隔、持續(xù)時(shí)間和關(guān)斷時(shí)間。實(shí)驗(yàn)中,共80名測(cè)試者分為A、B兩組進(jìn)行治療效果對(duì)比。A組僅采用傳統(tǒng)醫(yī)療手法,而B組則結(jié)合了本設(shè)備的輔助治療。兩周的治療后,本研究對(duì)比了兩組的效果,如表1所示。
表1 常規(guī)手法與設(shè)備輔助治療效果的對(duì)比
| 組別 | 治療部位 | 理療手法 | 效果(%) | 匯總(%) |
| A組 | 腰部 | 錘擊、揉捏 | 60 | 55 |
| A組 | 腿部 | 針刺、揉捏 | 50 | - |
| A組 | 手部 | 針刺、叩擊、揉捏 | 70 | - |
| A組 | 頭部 | 針刺、揉捏 | 40 | - |
| B組 | 腰部 | 錘擊、揉捏 + 設(shè)備 | 80 | 82.5 |
| B組 | 腿部 | 針刺、揉捏 + 設(shè)備 | 90 | - |
| B組 | 手部 | 針刺、叩擊、揉捏 + 設(shè)備 | 90 | - |
| B組 | 頭部 | 針刺、揉捏 + 設(shè)備 | 70 | - |
研究利用示波器捕獲了設(shè)備輸出的治療波形,以此驗(yàn)證設(shè)備的性能和治療波形的一致性,如圖4所示。

圖4 PWM調(diào)制成治療波形展示
具體代碼:
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;
}
}
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
463文章
54007瀏覽量
465952 -
藍(lán)牙
+關(guān)注
關(guān)注
119文章
6312瀏覽量
178690 -
通訊
+關(guān)注
關(guān)注
9文章
945瀏覽量
36532 -
串口
+關(guān)注
關(guān)注
15文章
1618瀏覽量
82810 -
keil
+關(guān)注
關(guān)注
69文章
1230瀏覽量
172629
發(fā)布評(píng)論請(qǐng)先 登錄
求基于單片機(jī)控制的紅外理療儀溫控系統(tǒng)設(shè)計(jì)方面的意見
有沒有人做過單片機(jī)控制的紅外理療儀溫控方面的項(xiàng)目?
我想找人開發(fā)一個(gè)中頻理療儀案子誰(shuí)可以接???
重金。。。求一個(gè)中頻理療儀方案,及工業(yè)設(shè)計(jì)
【MAX17270申請(qǐng)?jiān)囉谩恐械皖l康復(fù)理療儀
安卓手機(jī)與藍(lán)牙模塊聯(lián)合調(diào)試—— 單片機(jī)藍(lán)牙控制LED燈亮滅(上)
基于單片機(jī)的串口通訊變長(zhǎng)協(xié)議編寫代碼
Keil5創(chuàng)建51單片機(jī)項(xiàng)目中CPU顯示為空
E4A5 易安卓和單片機(jī)keil串口通訊mini理療儀項(xiàng)目代碼
評(píng)論