玩過無刷電機的和電動車維修的人經常碰到電機霍爾和控制器不匹配的問題。主控是AT89c2051以前51單片機入門的時候買的扔了可惜所以拿來用了當然使用現在市面上的51單片機都可以 顯示是12864液晶屏串行驅動, 按鍵就3個, 第一個是復位 第2個是匹配方式加 第3個是匹配方式減
總共6種接法。編程水平入門級 大神看了程序不要取笑。
廢話少說直接上制作出來的實物圖
1539256152280.jpg (2.64 MB, 下載次數: 55)
下載附件
2018-10-11 19:14 上傳
IMG_20181011_181232.jpg (2.69 MB, 下載次數: 80)
下載附件
2018-10-11 19:16 上傳
IMG_20181011_181237.jpg (2.61 MB, 下載次數: 75)
下載附件
2018-10-11 19:16 上傳
Altium Designer畫的原理圖如下:(51hei附件中可下載工程文件)
0.png (22.21 KB, 下載次數: 61)
下載附件
2018-10-12 16:24 上傳
單片機源程序如下:
- /* 液晶模塊型號:JLX12864C-1
- 接口方式:串行
- 液晶模塊驅動IC是:ST7920(或兼容的IC),
- */
- #include <reg51.h>
- sbit sid=P3^2; //R/W
- sbit sclk=P3^3; //E
- sbit k1=P3^5;
- sbit k2=P3^4;
- sbit Q1=P3^7;
- #define uchar unsigned char
- #define uint unsigned int
- uchar a=1;
- bit b=1;
- /*=============延時=====================*/
- void delay(int i)
- {
- int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<110;k++);
- }
- //=============transfer command to LCM===============
- void transfer_command(int data1) //傳輸命令到LCM
- {
- int i;
- for(i=0;i<5;i++)
- {
- sid=1;
- sclk=0;
- sclk=1;
- }
- sid=0;
- sclk=0;
- sclk=1;
- sid=0;
- sclk=0;
- sclk=1;
- sid=0;
- sclk=0;
- sclk=1;
- for(i=0;i<4;i++)
- {
-
- if(data1&0x80) sid=1;
- else sid=0;
- sclk=0;
- sclk=1;
- data1=data1<<=1;
- }
-
- for(i=0;i<4;i++)
- {
- sid=0;
- sclk=0;
- sclk=1;
- }
- for(i=0;i<4;i++)
- {
-
- if(data1&0x80) sid=1;
- else sid=0;
- sclk=0;
- sclk=1;
- data1=data1<<=1;
- }
-
- for(i=0;i<4;i++)
- {
- sid=0;
- sclk=0;
- sclk=1;
- }
- }
- //-----------transfer data to LCM---------------
- void transfer_data(int data1)//將數據傳輸到LCM
- {
- int i;
- for(i=0;i<5;i++) /*SID=1,5個脈沖,同步信號串*/
- {
- sid=1;
- sclk=0;
- sclk=1;
- }
- sid=0; /*這一位為R/W設置,R/W=0表示寫*/
- sclk=0;
- sclk=1;
- sid=1; /*這一位為RS設置,RS=1表示數據寄存器*/
- sclk=0;
- sclk=1;
- sid=0;
- sclk=0;
- sclk=1;
- for(i=0;i<4;i++) /*傳數據的高4位*/
- {
-
- if(data1&0x80) sid=1;
- else sid=0;
- sclk=0;
- sclk=1;
- data1=data1<<=1;
- }
-
- for(i=0;i<4;i++) /*SID=0,過4個脈沖*/
- {
- sid=0;
- sclk=0;
- sclk=1;
- }
- for(i=0;i<4;i++) /*傳數據的低4位*/
- {
-
- if(data1&0x80) sid=1;
- else sid=0;
- sclk=0;
- sclk=1;
- data1=data1<<=1;
- }
-
- for(i=0;i<4;i++) /*SID=0,過4個脈沖*/
- {
- sid=0;
- sclk=0;
- sclk=1;
- }
-
- }
- void clear_ddram()
- {
- transfer_command(0x30);
- transfer_command(0x01);
- delay(5);
- }
- /*初始化*/
- void Initial_ic()
- {
- delay(100);
- transfer_command(0x30); /*選用基本指令集*/
- delay(10);
- transfer_command(0x01); /*清屏*/
- delay(10);
- transfer_command(0x06); //
- delay(10);
- // transfer_command(0x1c); //光標右移
- transfer_command(0x0c);/*開顯示,關光標*/
- delay(10);
- }
- /*調用中文字庫里的漢字*/
- void display_char(int y,int x,int char_length,uchar *p)
- {
- uchar i=0;
- transfer_command(0x30); /*選用基本指令集*/
- delay(2);
- //transfer_command(0x01); /*清屏*/
- delay(2);
- if(y<3)
- {
- transfer_command(0x80+(y-1)*(0x10)+(x-1));
- }
- else
- {
- transfer_command(0x80+(y-3)*(0x10)+(x+7));
- }
- for(i=0;i<char_length;i++)
- {
- transfer_data(*p);
- p++;
- transfer_data(*p);/* 以上兩行數據合起來顯示一個漢字*/
- p++;
- }
- }
- //單行反顯
- /*void OneLine_reverse(int y)
- {
- if(y>0&&y<3)
- {
- transfer_command(0x34);
- delay(10);
- transfer_command(0x04+y-1);
- delay(10);
- }
- else
- {
- y-=2;
- transfer_command(0x34);
- delay(10);
- transfer_command(0x04+y-1);
- delay(10);
- }
- }*/
- /*主程序*/
- void main(void)
- {
- clear_ddram();
- Initial_ic(); /*初始化*/
- display_char(1,1,8,"無刷電機霍爾配對"); /*(在第1行,第1列,8個漢字)調用顯示漢字子程序*/
- //黃對黃 綠對綠 藍對藍 1
- //黃對黃 綠對藍 藍對綠 2
-
- //黃對綠 綠對黃 藍對藍 3
- //黃對綠 綠對藍 藍對黃 4
-
- //黃對藍 綠對綠 藍對黃 5
- //黃對藍 綠對黃 藍對綠 6
-
- while(1)
- {
- if(k1==0)
- delay(150); //消抖
- {
- if(k1==0)
- {
- while(!k1);
- a++;b=1;if(a>=6)a=6;
- }
- }
- if(k2==0)
-
- {
- if(k2==0)
- {
- delay(150); //消抖
- while(!k2);
- a--;b=1;if(a<=1)a=1;
- }
- }
- switch(a)
- {
- case(1):if(b==1)
- {P1=0XFC;
- // display_char(1,1,8,"無刷電機霍爾配對"); /*(在第1行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(2,1,8,"黃對黃 綠對綠"); /*(在第2行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(3,1,8,"藍對藍 ");
- display_char(4,1,8,"匹配方式1 "); b=0;
- }
- break;
-
- case(2):if(b==1)
- {P1=0XE4;
- // display_char(1,1,8,"無刷電機霍爾配對"); /*(在第1行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(2,1,8,"黃對黃 綠對藍"); /*(在第2行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(3,1,8,"藍對綠 ");
- display_char(4,1,8,"匹配方式2 "); b=0;
- }
- break;
-
- case(3):if(b==1)
- {P1=0X9C;
- // display_char(1,1,8,"無刷電機霍爾配對"); /*(在第1行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(2,1,8,"黃對綠 綠對黃"); /*(在第2行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(3,1,8,"藍對藍 ");
- display_char(4,1,8,"匹配方式3 "); b=0;
- }
- break;
-
- case(4):if(b==1)
- {P1=0XA8;
- // display_char(1,1,8,"無刷電機霍爾配對"); /*(在第1行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(2,1,8,"黃對綠 綠對藍"); /*(在第2行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(3,1,8,"藍對黃 ");
- display_char(4,1,8,"匹配方式4 "); b=0;
- }
- break;
-
- case(5):if(b==1)
- {P1=0X78;
- // display_char(1,1,8,"無刷電機霍爾配對"); /*(在第1行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(2,1,8,"黃對藍 綠對綠"); /*(在第2行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(3,1,8,"藍對黃 ");
- display_char(4,1,8,"匹配方式5 "); b=0;
- }
- break;
-
- case(6):if(b==1)
- {P1=0X54;
- // display_char(1,1,8,"無刷電機霍爾配對"); /*(在第1行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(2,1,8,"黃對藍 綠對黃"); /*(在第2行,第1列,8個漢字)調用顯示漢字子程序*/
- display_char(3,1,8,"藍對綠 ");
- display_char(4,1,8,"匹配方式6 "); b=0;
- }
- break;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
AT89C2051-12864-霍爾匹配程序.rar
(136.02 KB, 下載次數: 32)
2018-10-11 19:25 上傳
點擊文件名下載附件
霍爾匹配程序+原理圖 下載積分: 黑幣 -5
|