仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
a947ffdae7334b497c6e5604726475c.png (39.79 KB, 下載次數: 75)
下載附件
2020-6-5 13:09 上傳
單片機源程序如下:
#include"reg51.h"
#include"intrins.h"
#include"lcd.h"
#define uchar unsigned char
#define uint unsigned int
#define dula P0 //段選
#define wela P2 //位選
sbit P20=P3^4;
sbit P21=P3^5;
uint v_low=50,v_mid=100,v_high=200; //高中低速度
uchar flag=0;/***高低電平標志***/
bit direction=0;/***方向標志***/
static uint constant=380-50;//可以改變占空比
uint count_ms,count_s;
/****函數聲明****/
void delay(uchar i);
void reverse(void);
uchar k; //按鍵值
uchar kflag=1; //標志位
uchar tflag; //標志位
uchar dis[4]; //顯示
const unsigned char table[]={ //數字不帶小數點
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x40,0x76,0x38};
/***定時器t0***/
void time0(void) interrupt 1 using 1
{
static uint i;
i++;
if(kflag==1) //低-中-高 自然風
{
count_ms++;
if(count_ms>10000)
{
count_ms=0;
count_s++;
if(count_s==1) {constant=380-v_low;dis[0]=v_low/1000; //低
dis[1]=v_low/100;
dis[2]=v_low%100/10;
dis[3]=v_low%10;}
else if(count_s==30) {constant=380-v_mid;dis[0]=v_mid/1000;//中
dis[1]=v_mid/100;
dis[2]=v_mid%100/10;
dis[3]=v_mid%10;}
else if (count_s==60) {constant=380-v_high;dis[0]=v_high/1000;//高
dis[1]=v_high/100;
dis[2]=v_high%100/10;
dis[3]=v_high%10;}
else if (count_s>90) {count_s=0;}
}
}
/**頻率為固定的1kHZ左右,只是占空比發生變化**/
if(i<=constant)
flag=1;
if(i<=380&&i>constant)
flag=2;
if(i==380)
i=0;
TH0=0xff;
TL0=0xe7;
}
/***************
延時函數 毫秒
****************/
void delay_ms(unsigned int timer)
{
unsigned int i,j;
for(i=0; i<timer; i++)
for(j=0; j<110; j++);
}
/****改變轉向標志*****/
void int1_srv (void) interrupt 2 using 2
{
if(INT1==0)
{
while(!INT1);
direction=!direction;
}
}
/****延時****/
void delay(uchar i)
{
while(i--)
_nop_();
}
/***************
顯示函數
****************/
void display(unsigned int first,unsigned int second,unsigned int third,unsigned int forth) //顯示函數
{
wela = 0xfe; //位選1
dula = table[first]; //段選1
delay_ms(2); //延時
dula = 0x00; //清零
wela = 0xfd; //位選2
dula = table[second];//段選2
delay_ms(2); //延時
dula = 0x00;//清零
wela = 0xfb; //位選3
dula = table[third];//段選3
delay_ms(2); //延時
dula = 0x00;//清零
wela = 0xf7; //位選4
dula = table[forth];//段選4
delay_ms(2); //延時
dula = 0x00; //清零
}
/*************************/
void Getch (void) //按鍵掃描
{
unsigned char X,Y,Z;
P1=0x0f; //對P1置數 行掃描
if(P1!=0x0f) //有按鍵按下
{
delay_ms(10); //延時消抖
if(P1!=0x0f) //有按鍵按下
{
X=P1; //保存行掃描有按鍵按下的狀態
P1=0xf0; //列掃描
Y=P1; //保存列掃描有按鍵按下的狀態
Z=X|Y; //取出按鍵值
/*********************************************************************/
switch ( Z ) //判斷是哪個按鍵按下
{
case 0xee: k=0; break; //給按鍵賦值
case 0xed: k=1; break;
case 0xeb: k=2; break;
case 0xe7: k=3; break;
case 0xde: k=4; break;
case 0xdd: k=5; break;
case 0xdb: k=6; break;
case 0xd7: k=7; break;
case 0xbe: k=8; break;
case 0xbd: k=9; break;
case 0xbb: k=10;break;
case 0xb7: k=11;break;
case 0x7e: k=12;break;
case 0x7d: k=13;break;
case 0x7b: k=14;break;
case 0x77: k=15;break;
}
while(P1!=0xf0); //按鍵抬起有效
}
}
}
void sel_mode(void)
{
if (k==10){kflag=1;} //自然風
if (k==11){kflag=2;} //連續風
if(kflag==2)
{
if(k==12) {tflag=1;constant=380-v_low;dis[0]=1; //di低
dis[1]=v_low/100;
dis[2]=v_low%100/10;
dis[3]=v_low%10;}
if(k==13) {tflag=2;constant=380-v_mid;dis[0]=1; //中
dis[1]=v_mid/100;
dis[2]=v_mid%100/10;
dis[3]=v_mid%10;}
if(k==14) {tflag=3;constant=380-v_high;dis[0]=1; //高
dis[1]=v_high/100;
dis[2]=v_high%100/10;
dis[3]=v_high%10;}
}
}
//按鍵設置 開機后自動是自然風 按B切換成固定風 在固定風模式下
//按C是低風 此時可調整轉速 連續輸入三位0-9的數字 注意不能超過100
//按D是中風 此時可調整轉速 連續輸入三位0-9的數字 注意不能超過200
//按E是高風 此時可調整轉速 連續輸入三位0-9的數字 注意不能超過350
void set_mode(void)
{
static uchar num=0;
static uchar temp[3];
if(tflag==1)//按C是低風
{
if(k<10)
{
temp[num]=k;
num++;
if(num>=3) // 連續輸入三位0-9的數字
{
v_low=temp[0]*100+temp[1]*10+ temp[2] ; //算出數值
num=0;
tflag=0;
constant=380-v_low;
dis[0]=1; //di低
dis[1]=v_low/100;
dis[2]=v_low%100/10;
dis[3]=v_low%10;
}
k=22;
}
}
if(tflag==2)//按D是中風
{
if(k<10)
{
temp[num]=k;
num++;
if(num>=3) // 連續輸入三位0-9的數字
{
v_mid=temp[0]*100+temp[1]*10+ temp[2] ; //算出數值
num=0;
tflag=0;
constant=380-v_mid;
dis[0]=1; //di低
dis[1]=v_mid/100;
dis[2]=v_mid%100/10;
dis[3]=v_mid%10;
}
k=22;
}
}
if(tflag==3)//按E是高風
{
if(k<10)
{
temp[num]=k; //連續輸入三位0-9的數字
num++;
if(num>=3)
{
v_high=temp[0]*100+temp[1]*10+ temp[2] ; //算出數值
num=0;
tflag=0;
constant=380-v_high;
dis[0]=1; //di低
dis[1]=v_high/100;
dis[2]=v_high%100/10;
dis[3]=v_high%10;
}
k=22;
}
}
}
void main()
{
EA=1;
TMOD=0x01;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
TH0=0xff;
TL0=0xe7;//25us
/************/
LCD_Initial();
delay(10);
/*************/
while(1)
{
Getch();////按鍵掃描
sel_mode();//設置模式
set_mode();//設置轉速
reverse();
display(dis[0],dis[1],dis[2],dis[3]); //顯示函數
}
}
51hei.png (9.42 KB, 下載次數: 63)
下載附件
2020-6-6 01:35 上傳
全部資料51hei下載地址:
單片機自然風.rar
(107.64 KB, 下載次數: 77)
2020-6-5 13:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|