找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1701|回复: 0
打印 上一主题 下一主题
收起左侧

单片机电风扇控制

[复制链接]
跳转到指定楼层
楼主
ID:283680 发表于 2018-2-11 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uint unsigned int
#define uchar unsignde char
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;
sbit A=P2^6;//电机驱动端口
sbit D=P2^7;
sbit wei1=P2^0;
sbit wei2=P2^3;
sbit wei3=P2^2;
sbit wei4=P2^1;
sbit wxout=P2^5; //温度 太高 报警灯
sbit clock=P2^4;
sbit start=P3^5;
sbit eoc=P3^6;  //adc0809 驱动端口定义
sbit oe=P3^7;  
unsigned char wxin=100;//定义初始值为100,转换成实际电压值为1.95V
unsigned int getdata,ss;// 温度过高标志位
int num=0,count=0,se=1,flag=1;//定时标志位;电机正反转标志位
int shou_num,di_num,gao_num, le,bai,shi,ge;//电机占空比标志位
void  display(  );  //声明显示函数
void delay(uint x);//声明延时函数
void qudong();    //声明电机驱动函数
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管
char  seg[3]={0};
//延时函数
void delay(uint x)
{
uint i;
while(x--)
for(i=122;i>0;i--);
}
//数码管显示函数
void display()
{
bai=num/100;//百位
shi=num%100/10;//十位
ge=num%10;//个位
seg[0]=bai;
seg[1]=shi;
seg[2]=ge;
wei1=0;
P1=table[shou_num];
delay(1);
wei1=1;
wei2=0;
P1=table[seg[0]];
delay(1);
wei2=1;
wei3=0;
P1=table[seg[1]];
delay(1);
wei3=1;
wei4=0;
P1=table[seg[2]];
delay(1);
wei4=1;
}
//按键扫描函数
void scan()
{
if(key1==0)
{
if(key1==0)
display();
le=1;
}
else
{
le=0;A=0;D=0;
}
if(key2==0)
{
if(key2==0)
{
le=2;
display();
}  
else
{le=0;A=0;D=0;
}}
if(key3==0)
{
if(key3==0)
{
le=3;
display();
}
else
{
le=0;A=0;D=0;                           
}}
if(key4==0)   //定时键按下
delay(5);
{if(key4==0)
{
TR0=1;
num=num+10;
if(num==1000)
num=990;
while(key4==0)
display();
}}
if(key5==0)   //电机正反转按键
{
delay(5);
if(key5==0)
{
flag=!flag;
while(key5==0)
display();
}}}
//电机驱动函数
void  qudong()
{
int  i;
if(ss!=0)  // 电机是否发热?
{                                       
if(se!=0) //定时到了吗?
{if(flag)     //是否正转?
{
D=0;
for(i=0;i<di_num;i++) //输出di_num个低电平
{A=0;
display(); //用显示函数做延时函数,一举两得   
}
for(j=0;j<gao_num;j++) //输出gao_num个高电平
{A=1;
display();
}
display();
}
else     //电机反转
{A=0;
for(i=0;i<di_num;i++)   //输出di_num个低电平
{
D=0;
display();
}
for(j=0;j<gao_num;j++)   //输出gao_num个高电平
{
D=1;
display();
}}}
else
{
A=0;
D=0;
}}
//按键处理函数
void dispose()
{
switch(le)
{
case 1:
shou_num=1;
gao_num=1;
di_num=3;
break;
case 2:
shou_num=2;
gao_num=3;
di_num=1;
break;
case 3:
shou_num=3;
gao_num=1;
di_num=5;
break;
default: break;
}}
//定时器T1中断函数
void time1() interrupt  3
{
clock=!clock;  //clock信号取反
}
//AD转换函数
void adc0809()
{
start=0;
start=1;
display();
start=0;
while(eoc==0)  //转换成功
oe=1;
getdata=P0;   
oe=0;
if(getdata>wxin)   //如果转换值大于100则发光二极管灯亮,电机停止
{
wxout=0;
ss=0;
display();
}
else                                    
{
ss=1;
wxout=1;
display();
}}
//主函数
void  main()
{
TMOD=0x21;   //定义T1和T0的工作方式风别为方式2和方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=216;
TL1=216;
EA=1;
ET1=1;
TR1=1;
ET0=1;
A=0;D=0;  // 刚开机电机不转
while(1)  //无限循环
{
display();//调用显示函数
adc0809();//调用ADC0809函数
scan(); //调用按键扫描函数               
dispose(); //调用按键处理函数
qudong();  //调用电机驱动函数
}}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表