玩过无刷电机的和电动车维修的人经常碰到电机霍尔和控制器不匹配的问题。主控是AT89c2051以前51单片机入门的时候买的扔了可惜所以拿来用了当然使用现在市面上的51单片机都可以 显示是12864液晶屏串行驱动, 按键就3个, 第一个是复位 第2个是匹配方式加 第3个是匹配方式减
总共6种接法。编程水平入门级 大神看了程序不要取笑。
废话少说直接上制作出来的实物图
Altium Designer画的原理图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- /* 液晶模块型号: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, 下载次数: 29)
|