1602+步進電機控制
矩陣鍵盤、附帶程序和仿真圖
0.png (76.11 KB, 下載次數: 75)
下載附件
2017-5-28 16:55 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<stdio.h>
- #include"1602.h"
- #include"delay.h"
- sbit A1=P2^0; //定義步進電機連接端口
- sbit B1=P2^1;
- sbit C1=P2^2;
- sbit D1=P2^3;
- sbit key1=P3^7;
- sbit key2=P3^4;
- sbit key3=P1^7;
- sbit key4=P1^3;
- #define KeyPort P3
- void Init_Timer0(void);
- unsigned char KeyPro(void);
- #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通電,其他相斷電
- #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通電,其他相斷電
- #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通電,其他相斷電
- #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
- #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通電,其他相斷電
- #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通電,其他相斷電
- #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通電,其他相斷電
- #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
- #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部斷電
- unsigned char Speed=1;
- bit StopFlag;
- unsigned char code code_1602[]={'1','2','3','4','5','6','7','8','9'};//轉換成液晶顯示的字符
- main()
- {
- unsigned int i=512;//旋轉一周時間
- // unsigned char num;
- unsigned shi,ge;
- Init_Timer0();
- LCD_Init();
- // LCD_Clear();
-
- while(1) //正向
- {
- //num為鍵盤值
- //num=KeyPro();
- //LCD_Write_String(0,1,"Speed:0");
- switch(KeyPro())
- {
- case 1:{
- Coil_OFF
- StopFlag=1;
- LCD_Write_String(2,0," stop ");
- LCD_Write_String(0,1,"Speed:0");
- }break;
- case 2:{
- StopFlag=0;
- LCD_Write_String(2,0," running ");
- }break;
- case 3:{
- if(Speed<18)
- {
- Speed++;
- LCD_Write_String(2,0," Speed up ");
- LCD_Write_String(0,1,"Speed:");
- shi=Speed/10;
- ge=Speed%10;
- LCD_Write_Char(6,1,code_1602[shi]);
- LCD_Write_Char(7,1,code_1602[ge]);
- }
- }break;
- case 4:{
- if(Speed>1)
- {
- Speed--;
- LCD_Write_String(2,0,"Speed down");
- LCD_Write_String(0,1,"Speed:");
- LCD_Write_Char(6,1,code_1602[Speed]);
- }
- }break;
- }
- // if(num==2)//第一個按鍵,速度等級增加
- // {
- // if(Speed<18)
- // {
- // Speed++;
- // LCD_Write_String(2,0," Speed up ");
- // LCD_Write_String(0,1,"Speed:");
- // shi=Speed/10;
- // ge=Speed%10;
- // LCD_Write_Char(6,1,code_1602[shi]);
- // LCD_Write_Char(7,1,code_1602[ge]);
- // }
- // }
- // else if(num==3)//第二個按鍵,速度等級減小
- // {
- // if(Speed>1)
- // Speed--;
- // LCD_Write_String(2,0,"Speed down");
- // LCD_Write_String(0,1,"Speed:");
- // LCD_Write_Char(6,1,code_1602[Speed]);
- // }
- // else if(num==0)//電機停止
- // {
- // Coil_OFF
- // StopFlag=1;
- // LCD_Write_String(2,0," stop ");
- // LCD_Write_String(0,1,"Speed:0");
- // }
- // else if(num==1)//電機啟動
- // {
- // StopFlag=0;
- // LCD_Write_String(2,0," running ");
- // }
- }
- }
- /*------------------------------------------------
- 定時器初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- //TH0=0x00; //給定初值
- //TL0=0x00;
- EA=1; //總中斷打開
- ET0=1; //定時器中斷打開
- TR0=1; //定時器開關打開
- PT0=1; //優先級打開
- }
- /*------------------------------------------------
- 定時器中斷子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- static unsigned char times,i;
- TH0=(65536-1000)/256; //重新賦值 1ms
- TL0=(65536-1000)%256;
-
- //Display(0,8);
- if(!StopFlag)
- {
- if(times==(20-Speed))//最大值18,所以最小間隔值20-18=2
- {
- times=0;
-
- switch(i)
- {
- case 0:Coil_A1;i++;break;
- case 1:Coil_B1;i++;break;
- case 2:Coil_C1;i++;break;
- case 3:Coil_D1;i++;break;
- case 4:i=0;break;
- default:break;
- }
- }
- times++;
- }
- }
- ///*------------------------------------------------
- //按鍵掃描函數,返回掃描鍵值
- //------------------------------------------------*/
- //unsigned char KeyScan(void) //鍵盤掃描函數,使用行列反轉掃描法
- //{
- // unsigned char cord_h,cord_l;//行列值中間變量
- // KeyPort=0x0f; //行線輸出全為0
- // cord_h=KeyPort&0x0f; //讀入列線值
- // if(cord_h!=0x0f) //先檢測有無按鍵按下
- // {
- // DelayMs(10); //去抖
- // if((KeyPort&0x0f)!=0x0f)
- // {
- // cord_h=KeyPort&0x0f; //讀入列線值
- // KeyPort=cord_h|0xf0; //輸出當前列線值
- // cord_l=KeyPort&0xf0; //讀入行線值
- //
- // while((KeyPort&0xf0)!=0xf0);//等待松開并輸出
- //
- // return(cord_h+cord_l);//鍵盤最后組合碼值
- // }
- // }return(0xff); //返回該值
- //}
- ///*------------------------------------------------
- //按鍵值處理函數,返回掃鍵值
- //------------------------------------------------*/
- //unsigned char KeyPro(void)
- //{
- // switch(KeyScan())
- // {
- // case 0x7e:return 0;break;//0 按下相應的鍵顯示相對應的碼值
- // case 0x7d:return 1;break;//1
- // case 0x7b:return 2;break;//2
- // case 0x77:return 3;break;//3
- // case 0xbe:return 4;break;//4
- // case 0xbd:return 5;break;//5
- // case 0xbb:return 6;break;//6
- // case 0xb7:return 7;break;//7
- // case 0xde:return 8;break;//8
- // case 0xdd:return 9;break;//9
- // case 0xdb:return 10;break;//a
- // case 0xd7:return 11;break;//b
- // case 0xee:return 12;break;//c
- // case 0xed:return 13;break;//d
- // case 0xeb:return 14;break;//e
- // case 0xe7:return 15;break;//f
- // default:return 0xff;break;
- // }
- //}
- unsigned char KeyPro(void)
- {
- if(key1 == 0)
- {
- DelayMs(10);//在此處可以添加去抖動程序,防止按鍵抖動造成錯誤
- if(key1 == 0)
- while(!key1);//等待按鍵釋放
- {
- return 1;
- }
- }
- if(key2 == 0)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
實訓.zip
(14.19 MB, 下載次數: 30)
2017-5-28 15:40 上傳
點擊文件名下載附件
1602+步進電機控制 下載積分: 黑幣 -5
|