仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
#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下载地址:
单片机自然风.rar
(107.64 KB, 下载次数: 77)
|