找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6042|回復: 4
打印 上一主題 下一主題
收起左側(cè)

C#上位機串口控制單片機12864顯示漢字與波形

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:226961 發(fā)表于 2017-8-11 22:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
實現(xiàn)的效果





上面是用Proteus仿真的,,對了如果自己想用proteus仿真需要安裝下面這個軟件
再看一下實物顯示效果

先做上位機部分...........

為了程序一啟動就把電腦上能用的串口號顯示在下拉框中

還有就是串口呢可能會隨時改變,所以在用戶點擊下拉框的時候重新更新一下下拉框中的內(nèi)容

虛擬串口軟件下載:http://www.torrancerestoration.com/bbs/dpj-89983-1.html


現(xiàn)在在波特率框中添加常用的波特率
現(xiàn)在的效果
然后放一個按鈕用來打開和關(guān)閉串口
現(xiàn)在就做打開和關(guān)閉串口部分,,,

對了按鈕點擊了打開串口,讓它顯示"關(guān)閉串口"
就用回調(diào)來顯示
現(xiàn)在按鈕事件就這樣了
現(xiàn)在在多優(yōu)化一下,我們在打開了串口的時候,我接著用去選擇別的串口了,那么為了不去重復重新打開的按鈕動作,我們就多加一點程序,,,,這個一會再說吧!現(xiàn)在看不出效果現(xiàn)在寫接收程序部分
放一個textbox

接收的文本框設(shè)置只讀
接收的數(shù)據(jù)肯定會很多,,所以讓他有上下的滾動條
然后界面又加了幾個按鈕和選擇
現(xiàn)在接收數(shù)據(jù)

為了接收到一條完整的數(shù)據(jù)之后再去做處理,我就用個定時器用于檢測接收是否空閑了一段時間,只要出現(xiàn)空閑說明接收到了一條完整的數(shù)據(jù)
設(shè)置的是10ms檢測一次
看程序里面怎么做,,,其實和我的單片機檢測空閑是一樣的道理
定義一個鏈表用于存儲數(shù)據(jù),還有兩個計數(shù)變量
我電腦上安裝了虛擬串口軟件,方便調(diào)試
還有就是
當我們選擇這個的時候希望接收框里面的內(nèi)容也跟著改變
就像是這樣


選擇上
然后再取消選擇
這樣感覺更好一些
寫上以下代碼
加一個功能,,,我已經(jīng)電機打開一個串口了,然后呢想換一個
然而如果和第一次選擇的一樣就不切換了

這段代碼放在了定時器2里面,,,我這樣做的,只要拖動滑塊后500Ms沒在改變滑塊的值,那么就把當前滑塊的值發(fā)給單片機,讓單片機顯示出來
我沒有做成一直發(fā)給單片機的,,因為12864本身刷新整個界面就慢,,一直發(fā)也沒什么用.............
其余的親們看源碼吧!

現(xiàn)在做做下位機--單片機程序
由于單片機程序太多了,所以就事先做好了底層的了,,,就先看一看
直接貼上來把
單片機源程序如下:
  1. #define _MAIN_C_
  2. #include "include.h"
  3. #include "main.h"

  4. void main()
  5. {
  6.         unsigned int CRC=0;
  7.         InitTimer0();//初始化定時器
  8.         InitUART(9600);//初始化串口
  9.         Init12864();//初始化12864
  10.         ClearGDRAM();//清除界面
  11.         CRAM_OFF();//關(guān)閉顯示
  12.         DisplayImage(Image);//顯示圖片
  13.         CRAM_ON();//打開顯示        
  14.         DelayS(1);
  15.         ClearGDRAM();//清除界面
  16.         
  17.         Init12864();//初始化12864
  18.         
  19.         for(CRC = 17;CRC<127;CRC+=23)
  20.         {
  21.                 DrawCircle(32,CRC, 16);
  22.   }
  23.         while(1)
  24.         {
  25.                 if(UsartFlage == 1)
  26.                 {
  27.                         UsartFlage = 0;
  28.                         
  29.                         if(crc16_flage(UsartReceive,UsartReadCntCopy-2))
  30.                         {
  31.                                 ClearGDRAM();//清除界面
  32.               Init12864();//初始化12864
  33.                                 switch(UsartReceive[0])
  34.                                 {
  35.           case 1 : Chinese(1,1,(UsartReadCntCopy-3)/2,&UsartReceive[1]); break;//顯示漢字
  36.                                         case 2 : fsin(UsartReceive[1],UsartReceive[2]); break;//顯示正弦波
  37.                                         case 3 : RecWave(UsartReceive[1],UsartReceive[2]); break;//顯示鋸齒波
  38.                                         case 4 : TriWave(UsartReceive[1],UsartReceive[2]); break;//顯示三角波
  39. ……………………

  40. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
算了剩下的不貼了,反正后面有源碼.......
說幾個地方吧
程序風格呢,還是自己習慣的風格.....
串口接收和上位機一樣的道理
在定時器里面做的判斷是否接收到一個完整的數(shù)據(jù)

串口的配置呢加入了115200的,因為印象深刻......
這個控制顯示正弦波的函數(shù) h呢很容易看出來是控制這個波形的高度,,,,,那個3.14和f共同決定了周期(其實就是點數(shù)),,f越大這個函數(shù)的圖像越拉伸,,,,,
這個三角波函數(shù)是當初自己造的......其實就是畫線.....
上面的 f 很容易看出來就是控制拐點的,,每隔 f 個點拐一下,
x1 和 x2是記錄當前的 i  的值,關(guān)于那個 j 是由于 i 是從 0 開始的 如果不限制一下,那么第一根先就會是這樣
最后看一下主函數(shù)
主函數(shù)呢,沒什么說的....源碼地址


關(guān)于為什么要有實物了,,因為確實有人用到實物,,,,能滿足的就一定要滿足,而且好多元器件放著就浪費了.....
記得當初一個朋友學8266,竟然用了1個多月才能正常通信,,,那時候其實就想著應該做一個實物供朋友使用,這樣的話就不能耽擱這么長時間了...
想想這都過去5個多月了,,我還沒有去做8266的實驗板......哎,,,,,,,感覺太懶了


所有資料51hei提供下載:
上位機控制12864顯示.rar (3.31 MB, 下載次數(shù): 113)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:82765 發(fā)表于 2017-8-12 12:41 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
回復

使用道具 舉報

板凳
ID:169645 發(fā)表于 2018-1-13 12:24 | 只看該作者
正在學習串口編程,謝謝樓主的分享!
回復

使用道具 舉報

地板
ID:275712 發(fā)表于 2018-1-13 23:32 | 只看該作者
STC芯片怎么下載程序
回復

使用道具 舉報

5#
ID:275712 發(fā)表于 2018-1-13 23:33 | 只看該作者
STC怎么燒寫程序?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表