不知道什么原因,回复被屏蔽了:
楼主太厉害,我最近也在研究想用单片机控制车子的自动大灯,楼主可否将程序分享一下,供我这个菜鸟学习一下? 马家的信箱1696229500,不胜感谢!
#include "STC15F204EA.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit qianwei=P2^3;
sbit baiwei=P2^2;
sbit shiwei=P2^1;
sbit gewei=P2^0;
sbit dian=P3^7;
sbit ladi=P2^4;
sbit di=P2^5;
sbit zhishi=P3^1;
sbit kaimen=P2^6;
sbit maichong=P2^7;
sbit xiaodeng=P1^4;
sbit dadeng=P1^5;//位声明
sbit on=P1^2;
sbit off=P1^1;
sbit kongzhi=P1^0;
sbit anjian=P0^1;
uchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义0-9数组
uint uvw,v1,ADC_result7,ADC_result3;
uchar kz_bz,tt_kz,tt00,tt01,tt_mc,tt10,tt11,biaozhi1,bz_mc,qiehuan,tt_qieh,yici,xyz;
uchar bz_star,yic_star,tt_ysk_x,tt_ysk_d,tt_ysg_x,tt_ysg_d,tt_off; //定义变量
void delay(uint z)//延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void display(uint abc) //显示程序
{
P3=led[abc%10];
gewei=1;
delay(2);
gewei=0;
P3=led[abc%100/10];
if(abc>=10)
shiwei=1;
delay(2);
shiwei=0;
P3=led[abc%1000/100];
if(qiehuan==2) //显示电源电压时加“.”
dian=0;
else
dian=1;
if(abc>=100)
baiwei=1;
delay(2);
baiwei=0;
P3=led[abc/1000];
if(abc>=1000)
qianwei=1;
delay(2);
qianwei=0;
}
uint get_ad_result(uchar channel)//AD转换函数
{
uchar ad_finished=0;//存储A/D转换标志
ADC_RES=0;//高8位清零
ADC_RESL=0;//低2位清零
channel&=0x07;//0000 0111 清零高5位
ADC_CONTR=0x60;//转换速率为70个时钟周期转换1次
_nop_();
ADC_CONTR|=channel;//选择A/D当前通道
_nop_();
ADC_CONTR|=0x80;//启动A/D电源
delay(1);//延时一下使输入电压达到稳定
ADC_CONTR|=0x08;//0000,1000 令 ADCS=1, 启动A/D转换,
ad_finished=0;
while(ad_finished==0) //等待A/D转换结束
{
ad_finished=(ADC_CONTR&0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR&=0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
return(ADC_RES*256+ADC_RESL);//返回 A/D 高8位+低2位转换结果
}
void init()
{
TMOD=0x11; //设定定时器工作方式
EA=1; //开总中断
ET0=1; //开定时器0
TR0=1; //启动定时器0
TH0=(65536-50000)/256; //高8位装初值
TL0=(65536-50000)%256; //低8位装初值
ET1=1; //开定时器1
TR1=1; //启动定时器1
TH1=(65536-50000)/256; //高8位装初值
TL1=(65536-50000)%256; //低8位装初值
}
void main()
{
init();
P1ASF=0x88;//1000 1000 将P1.7/3置为模拟口
AUXR1|=0x04;//0000 0100 令ADRJ=1,10位A/D转换结果的最高2位放在ADC_RES寄存器,低8位放在ADC_RESL
ADC_CONTR|=0x80;//打开A/D转换电源启动A/D转换
P1M0=0x31; //0011 0001 设定P1.0/4/5口为强推挽输出模式
P2M0=0x4f;//0100 1111 设定P2.0/1/2/3/6口为强推挽输出模式
di=0;
xiaodeng=0;
dadeng=0;
bz_star=1;
kaimen=0;
kongzhi=0;
while(1)
{
uvw=ADC_result7;//感应器电压
//uvw=ADC_result7*1.0;
v1=ADC_result3*5.0; //ACC 电源电压
//*******************检测ACC是否有电,有电自动大灯有效*********************
if(v1>1000)//钥匙开到第二档,ACC大于10v
{
if(!off)//关闭旋钮动作时令标志置0
{
if(yic_star==0)//一次标志为0时运行一次取反
{
if(tt11>2)//延时100ms
{
bz_star=~bz_star; //取反
yic_star=1;
}
}
}
else
{
tt11=0;
yic_star=0;
}
if(bz_star==1) //开始标志为1是运行自动大灯
{
if(v1>1320)//大于13.2v说明发电机工作可以开启自动大灯
{
if(uvw<180)//感应器电压低于180,弱光环境
{
tt_ysg_x=0;//延时关小灯变量置0
if(tt_ysk_x>40)//延时2秒开小灯
xiaodeng=1;
if(uvw<150)//感应器电压低于150,黑暗环境
{
tt_ysg_d=0;//延时关大灯变量置0
if(tt_ysk_d>40)//延时2秒开大灯
dadeng=1;
}
}
else
{
tt_ysk_d=0;//延时开大灯变量置0
if(tt_ysg_d>40)//延时2秒关大灯
dadeng=0;
if(uvw>210)//高于210才延时关闭 避免临界点频繁开关
{
tt_ysk_x=0;//延时开小灯变量置0
if(tt_ysg_x>40)//延时2秒关小灯
xiaodeng=0;
}
}
}
else //没打火时关大小灯,各变量置0
{
xiaodeng=0;
dadeng=0;
tt_ysk_x=0;
tt_ysg_x=0;
tt_ysk_d=0;
tt_ysg_d=0;
}
}
else //标志为0时关闭大小灯
{
xiaodeng=0;
dadeng=0;
}
}
else //车熄火,自动大灯关闭、开尾门有效
{
xiaodeng=0;
dadeng=0;
tt_ysk_x=0;
tt_ysg_x=0;
tt_ysk_d=0;
tt_ysg_d=0;
//********************脉冲检测,开尾门**********************
if(maichong==0) //(!maichong)=(maichong==0) 来一次低电平脉冲计数一次
{
tt_mc=1;//脉冲计时标志置1
if(bz_mc==1)
{
if(xyz<100)
xyz++;
bz_mc=0;//脉冲标志置0
}
}
else
bz_mc=1; //脉冲标志置1
//if((tt01>25)&(tt01<35)) //1.5秒左右时检测脉冲如果是3或者4个就启动开门程序
if((tt01>35)&(tt01<45))//2秒左右时检测
{
//if((xyz>2)&(xyz<5))//连按2次遥控解锁3个脉冲,连按2次车门解锁4个脉冲
if((xyz>4)&(xyz<7))//连按3次遥控解锁5个脉冲,连按3次车门解锁6个脉冲
{
kaimen=1;
kz_bz=1;//控制标志置1
}
else
kaimen=0;
}
}
//**********************数码管显示、按键检测切换显示模式*********************
//if(ladi==0) //数码管插上显示
biaozhi1=0;
//else //不插数码管指示灯闪烁
// biaozhi1=1;
if(!anjian) //按键切换显示模式
{
tt_qieh=1; //切换标志置1开始计时
if(tt10>1) //延时100ms)
{
if(yici==0) //自加运行一次
{
yici=1;
if(qiehuan<3)
qiehuan++;
else
qiehuan=0;
}
}
}
else //按键抬起变量置0
{
tt_qieh=0;
yici=0;
}
switch(qiehuan)
{
case 0:
display(xyz);//显示脉冲数
break;
case 1:
display(uvw);//显示感应器电压
break;
case 2:
display(v1); //显示电源电压
break;
case 3:
display(8888);
break;
}
}
}
void timer0() interrupt 1 //定时器中断程序 50ms
{
TH0=0x3c;//(65536-50000)/256
TL0=0xb0;//(65536-50000)%256
tt00++;
if(tt00>=6) //0.3秒A/D转换一次.
{
ADC_result7=get_ad_result(7);//A/D转换7通道
ADC_result3=get_ad_result(3);//A/D转换3通道
tt00=0;
}
if(tt_mc==1)
{
tt01++;
if(tt01>50) //超过2.5秒重置
{
tt_mc=0; //脉冲计时标志置0
tt01=0; //变量置0
kaimen=0;
xyz=0;
}
}
else
{
tt01=0;
kaimen=0;
xyz=0;
if(kz_bz==1)
{
tt_kz++;
if(tt_kz>6) //门开关低电平后延时300ms让控制信号拉低为7v
{
if(tt_kz<46)//拉低2秒
{
kongzhi=1;//控制信号启动
}
else
{
kongzhi=0; //控制信号置0
kz_bz=0;//控制标志置0
tt_kz=0;//控制变量置0
}
}
}
else
{
kongzhi=0;
tt_kz=0;
}
}
}
void timer1() interrupt 3 //定时器1服务程序50ms
{
TH1=0x3c;//(65536-50000)/256
TL1=0xb0;//(65536-50000)%256
if(tt_qieh)
{
if(tt10<10)
tt10++;
}
else
tt10=0;
if(tt11<100)
tt11++;
if(tt_ysk_x<100) //延时开小灯变量
tt_ysk_x++;
if(tt_ysk_d<100) //延时开大灯变量
tt_ysk_d++;
if(tt_ysg_x<100) //延时关小灯变量
tt_ysg_x++;
if(tt_ysg_d<100) //延时关大灯变量
tt_ysg_d++;
}
ahao2012 2015-10-11 17:00:21 发表在 48楼
这个版本的程序在电脑上,明天发上来。
已编辑上,测试阶段程序可能有误,仅供参考。
#include "STC15F204EA.h"
#include intrins.h
#define uchar unsigned char
#define uint unsigned int
sbit qianwei=P2^3;
sbit baiwei=P2^2;
sbit shiwei=P2^1;
sbit gewei=P2^0;
sbit dian=P3^7;
sbit ladi=P2^4;
sbit di=P2^5;
sbit zhishi=P3^1;
sbit kaimen=P2^6;
sbit maichong=P2^7;
sbit xiaodeng=P1^4;
sbit dadeng=P1^5;//位声明
sbit on=P1^2;
sbit off=P1^1;
sbit kongzhi=P1^0;
sbit anjian=P0^1;
uchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90...
游客
扫码下载
汽车之家APP
随时获取
最新汽车资讯