#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit out1=P1^6;//电机
sbit out2=P1^7;
sbit ena=P1^4;
sbit k1=P2^3;//按钮
sbit k2=P2^4;
sbit k3=P2^5;
sbit k4=P2^6;
sbit k5=P2^7;
sbit k6=P3^1;
sbit led1=P3^3;//指示灯
sbit led2=P3^4;
sbit led3=P3^5;
sbit led4=P3^6;
sbit led5=P3^7;
sbit smg1=P2^0;//数码管
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit CLK= P1^0;//时钟,初始状态为0
sbit DI= P1^1;//数据输入
sbit DO= P1^2; // 数据输出
sbit CS= P1^3;
sbit test=P3^0;
//数码管编码
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar pwm=0;//速度
uchar fang=0;//方向
uchar start=0;//启动
uchar speed=0,sudu=0;
uchar sec=0;
uchar time=0;//系统定时
uchar mode=0;//模式
uchar water=0;
//读取ADC
uchar ADC(uchar ch)//通道ch 1,2
{
uchar temp0,temp1,i;
CS=0;
temp0=0;
temp1=0;
_nop_();
_nop_();
DI=1;//开始位
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
DI=0;
_nop_();
_nop_();
//选择通道0
DI=1;
_nop_();
CLK=1;//上升沿DI=1
_nop_();
CLK=0;//1个下降沿DI=1
_nop_();
if(ch==1)
DI=0;
if(ch==2)
DI=1;
_nop_();
CLK=1;
_nop_();
CLK=0;//第3个上升沿DI=0
_nop_();
DI=1;
//********通道选择结束开始读取转换后的二进制数****
//下降沿读数,一下进行判断和处理,共8次
for(i=0;i<8;i++)
{
temp0=temp0<<1;
CLK=1;
if(DO)
temp0++;
_nop_();
CLK=0;
}
for(i=0;i<8;i++)
{
temp1=temp1>>1;
CLK=1;
if(DO)
temp1=temp1 +0x80;
_nop_();
CLK=0;
}
CS=1;
return temp0;
}
//延时
void delay(uint i)
{
while(i--)
{
if(sec<99)//速度控制
sec++;
else
sec=0;
if(start)//启停控制
{
if(sec<pwm)
ena=1;
else
ena=0;
}
else
ena=0;
}
}
//主函数
void main()
{
uchar k=0;
out1=0;
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
//显示
P0=smgduan[water/100];smg1=0;delay(30);smg1=1;
P0=smgduan[water%100/10];smg2=0;delay(30);smg2=1;
P0=smgduan[water%10];smg3=0;delay(30);smg3=1;
//按键检测
if(mode==0)
{
if(!k1)//慢
{
sudu=4;
pwm=30;
led1=0;led2=1;led3=1;
}
if(!k2)//中
{
sudu=2;
pwm=50;
led1=1;led2=0;led3=1;
}
if(!k3)//快
{
sudu=0;
pwm=80;
led1=1;led2=1;led3=0;
}
}
if(!k6 &&(k!=6))//点动
{
k=6;
sudu=4;
pwm=30;
start=1;
mode=2;
}
if(!k4 && (k!=4))//启停
{
k=4;
start=!start;
}
if(!k5 && (k!=5))//手动自动
{
k=5;
mode=!mode;
if(mode==0)
{
sudu=4;
pwm=30;
led1=0;led2=1;led3=1;
}
}
if(k4 && k5 &&k6)
k=0;
//指示灯
if(start)
led4=0;
else
led4=1;
if(mode)
led5=0;
else
led5=1;
}
}
//定时器中断
void Timer0() interrupt 1
{
if(time<10)//0.5s
time++;
else
{
time=0;
water=ADC(1);//测量雨量
if(mode==1)//自动模式
{
pwm=water;
led1=1;led2=1;led3=1;
sudu=4-water/30;
}
if(start)
{
if(speed<sudu)//间歇控制
{
speed++;
}
else
{
speed=0;
out1=!out1;
out2=!out2;
if(mode==3)
{
start=0;
mode=0;
}
if(mode==2)
{
mode++;
}
}
}
}
TH0=0X3C;
TL0=0XB0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于51单片机的感应式雨刮器控制系统(雨量,速度,手动自动,点动,数码管)proteus,原理图、流程图、物料清单、仿真图、源代码 感应式刮水器控制 利用相应传感器检测前挡风玻璃雨量信息,从而自动控制 雨刮器刮水频率。前挡风坡地明里人ri的手动控制功能不雨量小时,刮水器工作频率低。此外,原有的手动控制功能不 变(包含:点动控制、间歇控制、慢中快速调节控制
资源推荐
资源详情
资源评论
收起资源包目录
雨刮器(雨量,速度,手动自动,点动,数码管).zip (30个子文件)
QQ截图20220619145112.png 126KB
程序
STARTUP.LST 14KB
main_uvproj.bak 13KB
main.OBJ 10KB
STARTUP.A51 6KB
main.plg 207B
main.M51 13KB
main.LST 10KB
main.uvproj 13KB
main.lnp 41B
main.uvopt 54KB
STARTUP.OBJ 749B
main.hex 2KB
main 10KB
main.c 3KB
main_uvopt.bak 54KB
元件清单.xlsx 6KB
流程图.bmp 1.38MB
QQ截图20220619145134.png 220KB
原理图
__Previews
Sheet1.SchDocPreview 65KB
History
Sheet1.~(4).SchDoc.Zip 28KB
Sheet1.~(3).SchDoc.Zip 18KB
Sheet1.~(1).SchDoc.Zip 1KB
Sheet1.SchDoc 223KB
QQ截图20220619145100.png 113KB
QQ截图20220619145123.png 224KB
ISIS仿真
仿真.PWI 792B
仿真.DSN 173KB
Last Loaded 仿真.DBK 173KB
功能.jpg 138KB
共 30 条
- 1
资源评论
cqtianxingkeji
- 粉丝: 2436
- 资源: 1433
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功