仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語(yǔ)言:C語(yǔ)言
設(shè)計(jì)編號(hào):【C04】
1.? 簡(jiǎn)介
? 本文介紹一種用AT89C51作為核心部件進(jìn)行邏輯控制及信號(hào)產(chǎn)生的單片機(jī)技術(shù)和C語(yǔ)言編程設(shè)計(jì)的直流電機(jī)控制系統(tǒng),本控制系統(tǒng)采用單片機(jī)控制,通過(guò)人為按動(dòng)開關(guān)實(shí)現(xiàn)直流電機(jī)的正反轉(zhuǎn)、加速、減速、啟停。具有靈活方便、適用范圍廣的特點(diǎn),基本能夠滿足實(shí)踐需求。
2.? 主要功能
a.支持按鍵設(shè)置正轉(zhuǎn)、反轉(zhuǎn)、啟停、加速、減速。
b.支持LCD1602顯示正反轉(zhuǎn)、轉(zhuǎn)速、占空比。
c.支持L298N驅(qū)動(dòng)直流電機(jī)轉(zhuǎn)動(dòng)。
3.? 源程序(Keil5)
? 本設(shè)計(jì)采用keil5 C51軟件(內(nèi)附安裝包)實(shí)現(xiàn)程序設(shè)計(jì)。如需用keil4打開程序,可自行通過(guò).c和.h文件新建工程即可。
#include"reg51.h"
#include"LCD1602.h"
sbit zheng = P3^0;
sbit fan = P3^1;
sbit K1 = P1^2;
sbit K2 = P1^1;
sbit K3 = P1^0;
sbit K4 = P1^3;
unsigned int t=50,tim=0,num=0;
unsigned char flag=0,sec=0,dir=0,disp=0;
void delay_ms(unsigned int tim)
{
unsigned int i,j;
for(i=0;i<tim;i++);
for(j=0;j<120;j++);
}
void key_control()
{
if(K1==0&&flag==1)
{
delay_ms(100);
//while(!K1);
if(t<100) t++;
}
if(K2==0&&flag==1)
{
delay_ms(100);
//while(!K2);
if(t>0) t--;
}
if(K3==0)
{
delay_ms(10);
while(!K3);
flag=1-flag;
}
if(K4==0)
{
delay_ms(10);
while(!K4);
dir=1-dir;
}
}
void Display()
{
if(flag==1)
{
if((100-t)/100==0)
LCDDispChar(6,1,' ');
else
LCDDispNum(6,1,(100-t)/100);
if((100-t)/100==0&&(100-t)%100/10==0)
LCDDispChar(7,1,' ');
else
LCDDispNum(7,1,(100-t)%100/10);
LCDDispNum(8,1,(100-t)%10);
LCDDispChar(9,1,'%');
LCDDispString(11,1,"On ");
if(dir)
{
LCDDispChar(14,1,'Z');
LCDDispChar(15,1,'z');
}
else
{
LCDDispChar(14,1,'F');
LCDDispChar(15,1,'z');
}
}
else
{
LCDDispChar(6,1,' ');
LCDDispChar(7,1,'-');
LCDDispChar(8,1,'-');
LCDDispChar(9,1,'-');
LCDDispChar(14,1,' ');
LCDDispChar(15,1,' ');
LCDDispString(11,1,"Off");
}
}
void Display_Speed()
{
if(num/100==0)
LCDDispChar(7,2,' ');
else
LCDDispNum(7,2,num/100);
if(num/100==0&&num%100/10==0)
LCDDispChar(8,2,' ');
else
LCDDispNum(8,2,num%100/10);
LCDDispNum(9,2,num%10);
}
void Timer_Init()
{
TMOD = 0x11;
TH0 = 0x3c;
TL0 = 0xb0;
ET0 = 1;
TR0 = 1;
EX0 = 1;
IT0 = 1;
TH1 = (65536-1000)/256;
TL1 = (65536-1000)%256;
ET1 = 1;
TR1 = 1;
EA = 1;
}
void main()
{
LCDInit();
LCDDispString(0,1,"Duty :");
LCDDispString(0,2,"Speed: r/s");
Timer_Init();
while(1)
{
key_control();
Display();
if(disp)
{
disp=0;
Display_Speed();
num=0;
}
}
}
4.? 仿真proteus8.6
? 本設(shè)計(jì)采用proteus8.6軟件(內(nèi)附安裝包)實(shí)現(xiàn)仿真設(shè)計(jì),如下圖所示。proteus軟件一般存在高低版本兼容問(wèn)題,該仿真是通過(guò)proteus8.6導(dǎo)出的,所以請(qǐng)盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
正轉(zhuǎn):
反轉(zhuǎn):
停止:
5.? 設(shè)計(jì)報(bào)告
設(shè)計(jì)報(bào)告主要包括硬件電路、軟件設(shè)計(jì)、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計(jì)資料主要包括C程序+仿真+設(shè)計(jì)報(bào)告+使用說(shuō)明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤下載鏈接:【C04】百度網(wǎng)盤下載鏈接
更多單片機(jī)仿真設(shè)計(jì)合集:單片機(jī)仿真設(shè)計(jì)合集