|
//********************************************
問題:電機是轉一下,停一下,LCD顯示亂碼,請問是怎么回事?
寫了一個LCD1602顯示電機轉速的程序,驅動使用TB6560
/********************************************/
/********************************************
//51單片機通過TB6560驅動器控制兩相步進電機正轉、反轉程序
//單片機:STC89C52RC系列
//驅動器:TB6560
//步進電機:兩相J-4218HB1401步進電機
CLK=1時電機運行,CLK=0時停止
CW=0時正轉,CW=1時反轉
EN=0時工作,EN=1停止
**********************************************/
#include<reg52.h>
/********************************************/
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^7; //使能端
sbit lcdrs=P2^6; //數據命令選擇端
sbit rw=P2^5;
uchar code table[]=" Zhuan Su:"; //輸入的字符
uchar table1[]=0; //輸入的字符
uchar num=0;
//********************************************
//端口定義
sbit CLK=P1^0; //脈沖
sbit ENA=P1^1; //使能
sbit DIR=P1^2; //轉向
//按鍵定義
sbit CW=P3^0; //正傳運行按鍵
sbit STOP=P3^1; //停止運行按鍵
sbit CCW=P3^2; //反轉運行按鍵
sbit ADJ1=P3^3; //調速運行按鍵
sbit ADJ2=P3^4;
sbit Led1=P0^0;
sbit Led2=P0^1;
bit Run_Status;
unsigned char Run_Dir;
#define F_DIR 0; //正轉
#define B_DIR 1; //反轉
uint CYCLE,speed;
/********************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//根據寫時序圖寫出指令程序
{
lcdrs=0;
rw=0;
P0=com;
delay(50);
lcden=1;
delay(50);
lcden=0;
}
void write_data(uchar date)//根據寫時序圖寫出數據程序
{
lcdrs=1;
rw=0;
P0=date;
delay(50);
lcden=1;
delay(50);
lcden=0;
}
void init()
{
lcden=0; //使能端為低電平
write_com(0x38);
/*顯示模式設置 00111000 設置16*2顯示 5*7點陣 8位數據接口*/
write_com(0x0f);
/*顯示開關及光標設置 00001DCB
D=1,開顯示 D=0, 關顯示
C=1,顯示光標 C=0,不顯示光標
B=1,光標閃爍 B=0,光標不閃爍*/
//write_com(0x06);//地址指針自動+1且光標+1,寫字符屏幕不會移動
write_com(0X01);
write_com(0X80);
for(num=0;num<10;num++) //輸入的字符數量,修改
{
write_data(table[num]);
delay(0);
}
}
/*********************************************/
//延時函數
void Delay_ms(unsigned char ms)
{
unsigned char i;
for(;ms>0;ms--)
{
for(i=0;i<125;i++);
}
}
//定時中斷
void timer0_ISR(void) interrupt 1 using 1
{
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
CLK=~CLK;
}
uint zhuan(){
Run_Status=0;
CLK=0;
ENA=0;
while(1)
{
if(!STOP)
{
Delay_ms(1000);
if(!STOP)
{
Run_Status=0;
CLK=0;
ENA=0;
TR0=0;
Led1=1;
Led2=1;
}
}
if(!CW&&!Run_Status)
{
Delay_ms(1000);
if(!CW&&!Run_Status)
{
Run_Status=1;
DIR=0;
ENA=1;
CYCLE=2500;
TMOD|=0X01;
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
IE=0X82;
TR0=1;
Run_Dir=F_DIR;
Led1=0;
}
}
if(!CCW&&!Run_Status)
{
Delay_ms(1000);
if(!CCW&&!Run_Status)
{
Run_Status=1;
DIR=0;
ENA=1;
CYCLE=2500;
TMOD|=0X01;
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
IE=0X82;
TR0=1;
Run_Dir=B_DIR;
Led2=0;
}
}
if(!ADJ1)
{
Delay_ms(1000);
if(!ADJ1)
{
if(CYCLE<20000)CYCLE+=2000;
else CYCLE=1000;
Run_Status=1;
TR0=1;
}
}
return CYCLE;
}
}
void main()
{
while(1){
zhuan();
delay(20);
speed = zhuan();
delay(20);
init();
delay(10);
table1[1] = (uint)((speed/1000+0x38));
table1[2] = (uint)((speed/100+0x38));
table1[3] = (uint)((speed/10+0x38));
table1[4] = (uint)((speed+0x38));
/********************************************/
delay(10);
write_com(0X80+0x40);
for(num=0;num<4;num++) //輸入的字符數量,修改
{
write_data(table1[num]);
delay(50);
}
}
}
|
|