|
程序出問題了,電機轉不了,顯示也出不來。單片機新手,看不出哪兒出了問題。麻煩論壇里能幫忙朋友們幫我看看,謝謝
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0; //啟停按鍵K1
sbit k2=P3^2; //正反轉按鍵K2
sbit up=P1^2; //加速按鍵up
sbit down=P1^3; //減速按鍵down
sbit in1=P1^5; //正反轉輸入口
sbit in2=P1^6;
sbit ENA=P1^7; //PWM信號輸入口
sbit LED1=P2^3; //綠燈正轉
sbit LED2=P2^4; //紅燈反轉
uchar a=0;
uchar count=48; //速度上限
uchar t=0;
char speed=20; //初始速度
uint qt;
/*-----------------------端口命名------------------------*/
sbit rs=P2^0; //LCD的數據/命令選擇端
sbit rw=P2^1; //LCD的讀寫選擇端
sbit e=P2^2; //LCD的使能信號端
/*-------------------------------------------------------*/
/*-----------------------定義參數------------------------*/
uint i,z,count,zhuan,msec; //定義參數
uchar display[]={" speed= r/min "}; //定義顯示參數
/*-------------------------------------------------------*/
/*-----------------------正反轉延時函數------------------*/
viod delay(void)
{
uchar i,j,k;
for(i=50;i>0;i--)
{
for(j=200;j>0;j--)
for(k=230;k>0;k--)
}
}
/*------------------------------------------------------*/
/*-----------------------啟停函數------------------------*/
void qiting(uint b) //b為啟停標志
{
if(k1==0)
{
ENA=1;
b=1;
}
else
{
ENA=0;
b=0;
}
return b;
}
/*-------------------------------------------------------*/
/*-----------------------正反轉函數----------------------*/
void INTT0_zhengfan() interrupt 2
{
a++;
if(a==1) //正轉
{
LED1=1;
LED2=0;
ENA=0;
delay();
ENA=1;
in1=1;
in2=0;
}
else //反轉
{
LED1=0;
LED2=1;
ENA=0;
delay();
ENA=1;
in1=0;
in2=1;
}
if(a>=2)
{
a=0;
}
}
/*--------------------------------------------------------*/
/*-----------------------增減速函數-----------------------*/
void speed_control()
{
if(up==0) //增速
{
speed++;
while(up==0) //即時對計滿數的speed值控制在設定范圍之內
if(speed>count)speed=count;
}
if(down==0) //減速
{
speed--;
while(down==0)
if(speed<0)speed=0;
}
}
/*----------------------------------------------------------------------------*/
/*-------輸出PWM的定時器中斷(與增減函數配合輸出PWM信號)---------------------*/
void timer0_PWM() interrupt 3 //計滿1ms跳一次,有speed個之后PWM跳變
{
if(t<speed) ENA=1;
else ENA=0;
t++;
if(t>=count)t=0;
}
/*-------------------------------------------------------*/
/*-----------------------毫秒延時------------------------*/
void delay1(uint ms)
{
uint i,j; //為延時引入i,j兩參數
for (j=0;j<ms;j++) //延時第一循環(huán)
for (i=0;i<120;i++); //延時第二循環(huán)
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫命令--------------------*/
void write_command(uchar command)
{
rs=0; //數據、命令選擇端0為命令
rw=0; //讀、寫選擇端0為寫
P0=command; //向LCD寫命令
delay1(5); //稍做延遲,代替檢測忙狀態(tài)
e=1; //信號使能端高電平
delay1(5); //稍做延遲,代替檢測忙狀態(tài)
e=0; //信號使能端低電平
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫數據--------------------*/
void write_data(uchar data0)
{
rs=1; //數據、命令選擇端 1為數據
rw=0; //讀、寫選擇端0為寫
P0=data0; //向LCD寫數據
delay1(5); //稍做延遲,代替檢測忙狀態(tài)
e=1; //信號使能端高電平
delay1(5); //稍做延遲,代替檢測忙狀態(tài)
e=0; //信號使能端低電平
}
/*-------------------------------------------------------*/
/*-------------------外部中斷0計數程序-------------------*/
void counter(void) interrupt 0
{
count++;
if(count==2) //2次循環(huán)為發(fā)動機轉一圈
{
count=0; //初始化計數
z++; //轉圈計數加1
}
}
/*-------------------------------------------------------*/
/*------------------------LCD顯示------------------------*/
void displaytolcd()
{
write_command(0x80); //向LCD1602寫命令80H
for (i=0;i<sizeof(display)-1;i++) //循環(huán)要傳輸的字符個數次,每一次傳一個字符
{
write_data(display);
delay(5);
}
}
/*-------------------------------------------------------*/
/*-----------------內部中斷0計時計數程序-----------------*/
void Timer_0(void) interrupt 1
{
TH0=0x3c; //50ms定時
TL0=0xb0;
msec++;
if(msec==20) //50*20=1S
{
msec=0;
zhuan=60*z; //每分鐘轉速
displaytolcd();
count=0;
z=0;
}
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{
z=0; //初始化z的值
count=0; //初始化count的值
zhuan=0; //初始化轉的值
rw=0; //選擇LCD寫數據指令
delay1(15); //延時15ms
write_command(0x38); //向LCD1602寫命令38H
delay1(5); //延時5ms
write_command(0x0e); //向LCD1602寫命令0EH
delay1(5); //延時5ms
write_command(0x06); //向LCD1602寫命令06H
TMOD=0x21; //內部中斷定時器選擇;定時器0工作在方式1,定時器1工作在方式2
TH0=0x3c; //50ms定時
TL0=0xb0;
TH1=0xF7; //
TL1=0xF7;
EA=1; //開中斷總開關
IT0=1; //外部中斷0為下降沿觸發(fā)
ET0=1; //開內部中斷0
TR0=1; //計時器開始工作
EX0=1; //開外部中斷0
IT1=1; //外部中斷1為下降沿觸發(fā)
ET1=1;
TR1=1;
EX1=1;
}
/*-------------------------------------------------------*/
/*-----------------------數據處理------------------------*/
void disp_count()
{
display[9]=(zhuan/1000+'0'); //轉換轉速的千位
display[10]=(zhuan/100%10+'0'); //轉換轉速的百位
display[11]=(zhuan/10%10+'0'); //轉換轉速的十位
display[12]=(zhuan%10+'0'); //轉換轉速的個位
}
void main()
{
int_all();
while(1)
{
qiting(qt);
if(qt==1)
{
speed_control();
}
disp_count(); //數據處理
displaytolcd(); //LCD顯示
}
}
|
-
1.jpg
(124.67 KB, 下載次數: 120)
下載附件
2017-5-16 08:30 上傳
這是仿真的圖
|