久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機控制直流電機啟動和正反轉程序,按鍵的時候要按鍵好幾次才啟動
[打印本頁]
作者:
mekio韓
時間:
2019-4-24 18:38
標題:
單片機控制直流電機啟動和正反轉程序,按鍵的時候要按鍵好幾次才啟動
這段程序是控制直流電機啟動和正反轉的,電路圖我也放上了,程序不太對,按鍵的時候要按鍵好幾次才啟動,正反轉按鈕也不好使,有沒有大佬給改改。
QQ截圖20190424183145.png
(49.39 KB, 下載次數: 67)
下載附件
proteus圖
2019-4-24 18:38 上傳
單片機源程序如下:
#include"reg51.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay1(uint ms);
sbit k1=P1^0; //啟停按鍵K1
sbit k2=P1^1; //正反轉按鍵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=1;
uchar count=40; //速度上限
uchar t=0;
char speed=20; //初始速度
/*-----------------------端口命名------------------------*/
sbit rs=P2^0; //LCD的數據/命令選擇端
sbit rw=P2^1; //LCD的讀寫選擇端
sbit e=P2^2; //LCD的使能信號端
/*-------------------------------------------------------*/
/*-----------------------定義參數------------------------*/
uint i,z,cou,zhuan,msec; //定義參數
uchar display[]={"speed= r/min "}; //定義顯示參數
/*-------------------------------------------------------*/
/*-----------------------正反轉延時函數------------------*/
void delay(void)
{
uchar i,j,k;
for(i=50;i>0;i--)
{
for(j=100;j>0;j--)
for(k=230;k>0;k--);
}
}
/*------------------------------------------------------*/
/*-----------------------啟停函數------------------------*/
void qiting() //b為啟停標志
{
if(k1==0)
{
delay1(20);
if(k1==0){
LED1=1;
LED2=0;
ENA=1;
}}
else
{
LED1=0;
LED2=0;
ENA=0;
}
}
/*-------------------------------------------------------*/
/*-----------------------正反轉函數----------------------*/
void zhengfan()
{ if(k1==1)
{
ENA=0;
}
else if(k2==1) //正轉
{
LED1=1;
LED2=0;
delay();
ENA=1;
in1=1;
in2=0;
}
else if(k2==0) //開關按下反轉
{
LED1=0;
LED2=1;
delay();
ENA=1;
in1=0;
in2=1;
}
}
/*--------------------------------------------------------*/
/*-----------------------增減速函數-----------------------*/
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(k1==0)
{
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++) //延時第一循環
for (i=0;i<120;i++); //延時第二循環
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫命令--------------------*/
void write_command(uchar command)
{
rs=0; //數據、命令選擇端0為命令
rw=0; //讀、寫選擇端0為寫
P0=command; //向LCD寫命令
delay1(5); //稍做延遲,代替檢測忙狀態
e=1; //信號使能端高電平
delay1(5); //稍做延遲,代替檢測忙狀態
e=0; //信號使能端低電平
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫數據--------------------*/
void write_data(uchar data0)
{
rs=1; //數據、命令選擇端 1為數據
rw=0; //讀、寫選擇端0為寫
P0=data0; //向LCD寫數據
delay1(5); //稍做延遲,代替檢測忙狀態
e=1; //信號使能端高電平
delay1(5); //稍做延遲,代替檢測忙狀態
e=0; //信號使能端低電平
}
/*-------------------------------------------------------*/
/*-------------------外部中斷1計數程序-------------------*/
void counter(void) interrupt 2
{
cou++;
if(cou==2) //2次循環為發動機轉一圈
{
cou=0; //初始化計數
z++; //轉圈計數加1
}
}
/*-------------------------------------------------------*/
/*------------------------LCD顯示------------------------*/
void displaytolcd()
{
write_command(0x80); //向LCD1602寫命令80H
for (i=0;i<sizeof(display)-1;i++) //循環要傳輸的字符個數次,每一次傳一個字符
{
write_data(display[i]);
delay1(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();
z=0;
}
}
/*-------------------------------------------------------*/
/*-----------------------數據處理------------------------*/
void disp_count()
{
display[7]=(zhuan/1000+'0'); //轉換轉速的千位
display[8]=(zhuan/100%10+'0'); //轉換轉速的百位
display[9]=(zhuan/10%10+'0'); //轉換轉速的十位
display[10]=(zhuan%10+'0'); //轉換轉速的個位
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{
in1=1; //下面五行為啟停、正反轉初始化
in2=0; //2
LED1=0; //3
LED2=0; //4
ENA=0; //5
z=0; //初始化z的值
cou=0; //初始化co的值
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;
TR0=1; //定時器0工作,用于測速
TH1=0xA3; //1ms定時
TL1=0xA3;
TR1=1; //定時器1工作,用于調速
EA=1; //開中斷總開關
IT1=1; //外部中斷1為下降沿觸發
ET1=1; //T1允許中斷
ET0=1; //T0允許中斷
EX1=1; //外部中斷1允許中斷
}
void main()
{
int_all();
ENA=0;
while(1)
{
qiting();
zhengfan();
if(k1==0)
{
speed_control();
}
disp_count(); //數據處理
displaytolcd(); //LCD顯示
}
}
復制代碼
作者:
ccczx
時間:
2019-4-30 13:55
好好學習一下
作者:
ccczx
時間:
2019-4-30 14:01
參考一下,謝謝樓主
作者:
1255230
時間:
2019-4-30 15:26
可以在按鍵那里加一個上拉電阻,使單片機引腳不用時處于高電平,然后把銷抖的延時時間變短一點,五毫秒左右就行了
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品www
|
国产精品视频久久
|
国产激情在线
|
国产高清视频
|
久精品视频
|
九九av
|
www.午夜
|
无码国模国产在线观看
|
超碰97人人人人人蜜桃
|
久久精品视频免费观看
|
欧美性jizz18性欧美
|
欧美综合在线观看
|
一区二区三区不卡视频
|
男女免费网站
|
毛片视频网站
|
99在线精品视频
|
欧美xxxx黑人又粗又长
|
男女羞羞视频大全
|
日本午夜在线视频
|
日韩免费成人av
|
亚洲巨乳自拍在线视频
|
久久99精品国产
|
99资源站
|
精品国产乱码久久久久久牛牛
|
www精品
|
久久亚洲一区二区
|
99reav
|
精品成人免费一区二区在线播放
|
特级黄一级播放
|
鸡毛片
|
www.久久
|
久久国产精品一区
|
久久久一区二区三区
|
久久99精品国产麻豆婷婷
|
国产99久久久国产精品
|
亚洲国产aⅴ精品
|
99免费
|
h视频免费在线观看
|
国产精品成av人在线视午夜片
|
国产九九av
|
精区3d动漫一品二品精区
|