找回密码
 立即注册

QQ登录

只需一步,快速开始

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

汽车自动换挡拨片改装,单片机控制D档实现加减档源程序与电路设计

[复制链接]
跳转到指定楼层
楼主
给大家分享小汽车自动换挡拨片改装教程,D档实现加减档的一些技术资料,是用51单片机通过程序来实现的.
【简要说明】
一、尺寸:长74mm29mm18mm
二、工作电压:直流12V
三、特点:
1、延时时间精确、可调节
2、电路简单实用,接线简单
3、两路数字量输入和一路继电器输出
4、延时开关可以根据顾客的需要做成各种不同种类的延时开关
5、两路数字量输入,低电平有效 低电平(0到1V),高电平(3.5到5V)
6、延时时间按键可调节
四、功能:汽车换挡片换挡用、触发延时开关,延时通断,延时闭合,延时断开等等,都可以根据需要来更改


单路继电器输出两路继电器输入模块(汽车换挡片控制)
  • 工作电压直流12V
  • 两路输入低电平有效,带光电隔离
  • 该模块可编程实现顾客各种要求
  • 有两个按键输入
  • 一路继电器输出,可控制220V/10A负载
  • 具有电源和输出指示


该控制板是专门为别人定制的,默认情况下,实现的功能是:当A或者B开关有输入信号时,输出继电器闭合延时5到15秒(可通过按键增加减小键调节具有掉电记忆功能),继电器断开。 该模块主要用在汽车上的A和B换挡片,换挡时,触发继电器延时5-10的吸合时间

注意两路输入任意一路输入低电平触发时,继电器(即开关闭合)闭合开始延时,延时5到15秒后继电器(开关断开)断开的功能。如果在延时期间,任意触发端,再次触发时,延时时间将为设定值如,设定时间是10秒,触发端触发时开始延时,假如延时时间到8秒,如果再次触发,继电器将再延时10秒断开,如果在延时期间再次触发时,将接着延时10秒断开。。
时间设定注意(最小5秒-最大15秒)
       按一下向上箭头的按键会增加1秒
       按一下向下箭头的按键会减少1秒
       按了之后板子断电后会自动保存设定时间值
          再次给电,即可使用!

实物图如下:


电路原理图如下:

标注说明:


单片机源程序如下:
  1. /********************************************************************
  2.                             汇诚科技

  3. 实现功能:P3.4,A开关输入,P3.5,B开关输入 ,P3.3继电器输出。
  4.    当A或者B开关有输入信号时,输出继电器闭合,延时5到15秒可调节、
  5.    P3.0和p3.3作为按键输入调节时间,具有掉电记忆功能
  6.    首次下载程序一定要先调节增加按键,否则触发后继电器一直吸合,甚至更长的时间才能断开
  7. 使用芯片:STC15F104E
  8. 晶振:12MHZ
  9. 波特率:9600
  10. 编译环境:Keil
  11. 作者:yang
  12. 华龙电子
  13. 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!      

  14. *********************************************************************/
  15. /********************************************************************/

  16. #include<reg52.h>                 //库文件
  17. #include <intrins.H>
  18. #define uchar unsigned char//宏定义无符号字符型
  19. #define uint unsigned int  //宏定义无符号整型
  20. sfr P3M0=0Xb2;
  21. sfr P3M1=0Xb1;
  22. /********************************************************************
  23.                             寄存器设置
  24. *********************************************************************/
  25. sfr IAP_DATA  =0xc2;            //数据寄存器
  26. sfr IAP_ADDRH =0xc3;            //地址寄存器
  27. sfr IAP_ADDRL =0xc4;            //地址寄存器
  28. sfr IAP_CMD   =0xc5;        //命令寄存器
  29. sfr IAP_TRIG  =0xc6;             //触发寄存器
  30. sfr IAP_CONTR =0xc7;        //擦除寄存器
  31. sfr WDT_CONTR=0XC1;                    //看门狗设置寄存器
  32. /********************************************************************
  33.                             命令定义
  34. *********************************************************************/
  35. #define CMD_IDLE     0            //EEPROM无操作
  36. #define CMD_READ     1            //读取字节
  37. #define CMD_PROGRAM  2            //写入字节
  38. #define CMD_ERASE    3            //擦除字节
  39. /********************************************************************
  40.                        编程周期由晶振决定
  41. *********************************************************************/

  42. #define ENABLE_IAP 0X83         //编程周期由晶振决定(如果<12MHZ选用此项)

  43. #define IAP_ADDRESS1 0X0000         //内部EEPROM地址
  44. /********************************************************************
  45.                             初始定义
  46. *********************************************************************/
  47. uint num,settime; //键值判断
  48. /********************************************************************
  49.                             I/O定义
  50. *********************************************************************/
  51. sbit OUT=P3^3;         //继电器输出控制端
  52. sbit INA=P3^4;         //A开关输入端
  53. sbit INB=P3^5;         //B开关输入端
  54. sbit Increase=P3^1; //增加时间
  55. sbit Reduce=P3^0;  //减小时间
  56. void IapIdle();                                              //操作函数
  57. uchar IapReadByte(uint addr);             //读取函数
  58. void IapProgramByte(uint addr,uchar dat); //写入函数
  59. void IapEraseSector(uint addr);                  //擦除函数
  60. /********************************************************************
  61.                             延时函数
  62. *********************************************************************/
  63. void delay(uint z)           //0.2ms
  64. {
  65.         uint x,y;
  66.         for(x=z;x>0; x--)
  67.                 for(y=110;y>0;y--);
  68. }
  69. //定时器T0初始化
  70. void init_Timer0(void)
  71. {
  72.     TMOD=0x01;             //定时器工作在方式1
  73.         TH0=(65536-50000)/256; //对TH0 TL0 赋值
  74.         TL0=(65536-50000)%256;
  75.         ET0=1;
  76.         EA=1;
  77.         //TR0=1;
  78. }
  79. //按键扫描
  80. void keyscan(void)
  81. {
  82.   if(Increase==0)
  83.   {
  84.     delay(30);
  85.         if(Increase==0)
  86.         {
  87.           while(!Increase);
  88.           settime+=15;
  89.           if(settime>=225)
  90.             settime=225;
  91.           IapEraseSector(IAP_ADDRESS1);    //擦除0扇区        
  92.       IapProgramByte(1,settime);               //写入数据
  93.         }
  94.   
  95.   }
  96.   if(Reduce==0)
  97.   {
  98.     delay(30);
  99.         if(Reduce==0)
  100.         {
  101.           while(!Reduce);
  102.           settime-=15;
  103.           if(settime<=75)
  104.             settime=75;
  105.           IapEraseSector(IAP_ADDRESS1);    //擦除0扇区        
  106.       IapProgramByte(1,settime);               //写入数据
  107.         }
  108.   
  109.   }
  110. }
  111. /********************************************************************
  112.                             主函数
  113. *********************************************************************/
  114. void main()
  115. {        
  116.     P3M0=0X08;//强推挽输出
  117.         P3M1=0X00;//强推挽输出
  118.         OUT=0;
  119.         delay(100);
  120.     settime=IapReadByte(1);

  121.         init_Timer0();
  122.         WDT_CONTR=0x3D;          //喂狗时间2.2755s  晶振12mhz,预分频系数是64
  123.         while(1)
  124.         {
  125.           keyscan();  //按键扫描
  126.           if(INA==0||INB==0)
  127.           {
  128.                         delay(50);
  129.                         if(INA==0||INB==0)
  130.                         {
  131.                             num=0;
  132.                                 OUT=1;        //继电器吸合,开始延时
  133.                                 TR0=1;        
  134.                         }
  135.           }
  136.           WDT_CONTR=0x3D;          //喂狗时间2.2755s  晶振12mhz,预分频系数是64
  137.         }
  138. }               
  139. /********************************************************************
  140.                             定时中断服务函数
  141. *********************************************************************/
  142. void t0(void) interrupt 1 using 1 //定时T0中断服务函数
  143. {   
  144.    
  145.     num++;
  146.         if(num==settime)          //设定时间范围是5到15秒
  147.                 {
  148.                         OUT=0; //延时时间到,继电器断开
  149.                         TR0=0;
  150.                 }
  151. }
  152. /********************************************************************
  153.                             操作函数
  154. *********************************************************************/
  155. void IapIdle()
  156. {
  157.         IAP_CONTR=0;
  158.         IAP_CMD=0;
  159.         IAP_TRIG=0;
  160.         IAP_ADDRH=0X80;
  161.         IAP_ADDRL=0;
  162. }
  163. /********************************************************************
  164.                             读取一个字节函数
  165. *********************************************************************/
  166. uchar IapReadByte(uint addr)
  167. {
  168.         uchar dat;  
  169.         IAP_CONTR=ENABLE_IAP;
  170.         IAP_CMD=CMD_READ;
  171.         IAP_ADDRL=addr;
  172.         IAP_ADDRH=addr>>8;
  173.         IAP_TRIG=0X5A;
  174.         IAP_TRIG=0XA5;
  175.         _nop_();
  176.         _nop_();
  177.         _nop_();
  178.         dat=IAP_DATA;
  179.         IapIdle();
  180.         return dat;
  181. }

  182. /********************************************************************
  183.                             写入一个字节函数
  184. *********************************************************************/
  185. void IapProgramByte(uint addr,uchar dat)
  186. {

  187.         IAP_CONTR=ENABLE_IAP;
  188.         IAP_CMD=CMD_PROGRAM;
  189.         IAP_ADDRL=addr;
  190.         IAP_ADDRH=addr>>8;
  191.         IAP_DATA=dat;
  192.         IAP_TRIG=0X5A;
  193.         IAP_TRIG=0XA5;
  194.         _nop_();
  195.         _nop_();
  196.         _nop_();
  197.         IapIdle();
  198. }
  199. /********************************************************************
  200.                             擦除一个字节函数
  201. *********************************************************************/
  202. void IapEraseSector(uint addr)
  203. {
  204.         IAP_CONTR=ENABLE_IAP;
  205.         IAP_CMD=CMD_ERASE;
  206.         IAP_ADDRL=addr;
  207.         IAP_ADDRH=addr>>8;
  208.         IAP_TRIG=0X5A;
  209.         IAP_TRIG=0XA5;
  210.         _nop_();
  211.         _nop_();
  212.         _nop_();
  213.         IapIdle();
  214. }
  215. /********************************************************************
  216.                               结束
  217. *********************************************************************/
复制代码

所有资料51hei提供下载:
使用说明.docx (51.05 KB, 下载次数: 14)
两路输入单路输出按键调节延时闭合时间带看门狗20150417(换挡拨片).rar (34.56 KB, 下载次数: 18)
两路输入单路输出带按键可编程模块原理图.pdf (76.15 KB, 下载次数: 14)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:647326 发表于 2019-11-22 16:15 | 只看该作者
那个宝不是早有了吗
回复

使用道具 举报

板凳
ID:432568 发表于 2019-12-10 18:45 | 只看该作者



按键扫描
void keyscan(void)
{
  if(Increase==0)
  {
    delay(30);
        if(Increase==0)
        {
          while(!Increase);
          settime+=15;
          if(settime>=225)
            settime=225;
          IapEraseSector(IAP_ADDRESS1);    //擦除0扇区        
      IapProgramByte(1,settime);               //写入数据
        }
我是刚接触C语言的小弟,“ settime+=15;”这句是什么意思?+=连在一起表示什么?
回复

使用道具 举报

地板
ID:704585 发表于 2020-6-4 14:47 | 只看该作者
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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