找回密码
 立即注册

QQ登录

只需一步,快速开始

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

通过CAN总线单字节发送0-F 仪表寿命驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:282577 发表于 2018-2-6 13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //===================================================================================
  2. // 工程名称: 通过CAN总线单字节发送0-F
  3. // 功能描述: CAN通信测试程序,CAN中继器的功能
  4. //  IDE环境:   ICCAVR
  5. // 组成文件: main.c, REG51.h 2515.h, CAN.h ,function.h
  6. // Content:
  7. //  Init2515: 2515初始化程序
  8. //  CAN_ Send: CAN发送子程序,查询发送
  9. //  CAN_Receive:CAN接收子程序,中断接收   
  10. //   
  11. // 硬件连接:  AT89S51/52+MCP2515
  12. //
  13. // 维护记录: 2009-6-17 v1.0
  14. //===================================================================================
  15. #include<iom8v.h>
  16. #include<bit.h>
  17. #include <macros.h>
  18. #include <math.h>
  19. #include "2515.h"
  20. #include "SPI_Ctrl.h"
  21. #include "Function.h"
  22. #include "CAN0.h"
  23. #define uint unsigned int
  24. #define uchar unsigned char
  25. //sbit key=P2^5; //Button按键
  26. #define key_si1 PINDBIT1
  27. #define key_si2 PINDBIT2
  28. #define key_si3 PINDBIT3
  29. //sbit P3_5=P3^5;//数码管位选
  30. //sbit P2_6=P2^6;
  31. #define IGN_CLR PORTC &= ~(1 << PC0)
  32. #define IGN_SET PORTC |= (1 << PC0)
  33. #define BATT_CLR PORTC &= ~(1 << PC1)
  34. #define BATT_SET PORTC |= (1 << PC1)
  35. #define TTH_CLR PORTC &= ~(1 << PC2)
  36. #define TTH_SET PORTC |= (1 << PC2)
  37. #define TTL_CLR PORTC &= ~(1 << PC3)
  38. #define TTL_SET PORTC |= (1 << PC3)
  39. #define RESI_CLR PORTC &= ~(1 << PC4)
  40. #define RESI_SET PORTC |= (1 << PC4)
  41. char runmodel=000;   //全局运行模式编码
  42. char i=0;   //i是单双周期判断变量
  43. char Counter = 0;                // 10mS计数变量清零 ,变量声明
  44. long num=0;    //转速can信号变量
  45. long num1=800;    //转速can信号变量
  46. char can=0;    //转速can信号变量
  47. char rev=0;    //转速can信号变量
  48. long p=1;     //档位显示变量
  49. int pc;      //档位显示变量
  50. long t2=1;     //t2完成变量
  51. unsigned char msg;
  52. unsigned char kflag = 0;
  53. unsigned char gRXFlag = 0;
  54. #define fosc 6000000
  55. //晶振6MHZ
  56. unsigned int j;
  57. unsigned int k;
  58. char CanKeepCNT =0;
  59. int CanCNT=0;
  60. char Counter1 = 0;                // 1S计数变量清零 ,变量声明
  61. #pragma interrupt_handler timer1_ovf_isr:9
  62. #pragma interrupt_handler timer0_ovf:10
  63. /**************************************************************定时器0中断函数*/
  64. void timer0_ovf(void)
  65. {
  66.   TIMSK&=~(1<<TOIE0);   //关闭T0溢出中断
  67. TCNT0 =146;        //重装计数初值
  68. /*********************************************************************/
  69. if(rev==0)
  70. {
  71. if (num<=150)  Send_prndl_ON(1);
  72. if ((num>150)&(num<=300))  Send_prndl_ON(2);
  73. if ((num>300)&(num<=450))  Send_prndl_ON(3);
  74. if ((num>450)&(num<=600))  Send_prndl_ON(4);
  75. if ((num>600)&(num<=750))  Send_prndl_ON(5);
  76. if (num>750)  Send_prndl_ON(6);
  77. }
  78. else
  79. {
  80. if (num<=100)  Send_prndl_ON(12);
  81. if ((num>100)&(num<=250))  Send_prndl_ON(10);
  82. if ((num>250)&(num<=400))  Send_prndl_ON(9);
  83. if ((num>400)&(num<=650))  Send_prndl_ON(8);
  84. if (num>650)  Send_prndl_ON(7);
  85. }
  86. /*********************************************************************/
  87. delay_ms(1);
  88.   if(rev==0)
  89.     {
  90.   if (num>=790)
  91.      {
  92.      if (CanKeepCNT<40)//最大位置后等待
  93.         {
  94.      Send_Tacho(num*10);
  95.      CanKeepCNT=CanKeepCNT+1;
  96.      }
  97.      else
  98.      {
  99.         rev=1;
  100.      CanKeepCNT=0;
  101.      }
  102.      }
  103.      else
  104.      {
  105.      num=num+3;
  106.      Send_Tacho(num*10);
  107.      j=num/5+10;
  108.      //TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  109.        if (k<=10)
  110.     {
  111.     k++;
  112.     }
  113.     else
  114.     {
  115.     PWM_out(j);
  116.     k=0;
  117.     }
  118.      }
  119.      
  120.   }
  121. else
  122.   {
  123.   if (num<=0)
  124.   {
  125.      if (CanKeepCNT<30)//最小位置后等待
  126.         {
  127.      Send_Tacho(0);
  128.      j=0;
  129.      CanKeepCNT=CanKeepCNT+1;
  130.      TCCR1B = 0; //stop
  131.       }
  132.      else
  133.      {
  134.         rev=0;
  135.      CanKeepCNT=0;
  136.      num=0;
  137.         Send_Tacho(0);
  138.         can=0;
  139.      }
  140.      }
  141.   else
  142.   {
  143.   num=num-3;
  144.   Send_Tacho(num*10);
  145.   j=num/5-10;
  146.   
  147.   //TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  148.   if (k<=10)
  149.   {
  150.   k++;
  151.   }
  152.   else
  153.   {
  154.   PWM_out(j);
  155.   k=0;
  156.   
  157.   }
  158.   }
  159.   

  160. }
  161. /*******************
  162. if(rev==0)
  163.     {
  164.   if (j<=1500)
  165.      {
  166.      TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  167.      j=j+2;
  168.      }
  169.    else
  170.      {
  171.     j=1500;
  172.     TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  173.     }
  174.   }
  175. else
  176.   {
  177.   if (j>=0)
  178.      {
  179.      TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  180.      j=j-2;
  181.      }
  182.    else
  183.      {
  184.     j=0;
  185.     TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  186.     }
  187.   }
  188. /****************************/

  189.   if (can==1)
  190.    {
  191.     TIMSK|=(1<<TOIE0);   //使能T0溢出中断
  192.     }
  193. }
  194. /*******************************************************************中断0配置*/
  195. void timer0_init()
  196. {
  197. SREG = 0x80;          //使能全局中断
  198. //TIMSK|=(1<<TOIE0);   //使能T0溢出中断
  199. TCCR0|=(1<<CS02)|(0<<CS01)|(1<<CS00);  // T/C0工作于普通模式,1024分频,
  200.                                  //定时器频率 = 8M/1024 =7812.5Hz
  201. TCNT0 =146;          //定时初值设置,定时时间 =(256-61)/7812.5=25ms
  202.             //6M/1024=5859.375  256-168=88/5859.375=0.015s
  203.        //256-139=117/5859.375=0.0199        
  204.       //256-146=110/5859.375=0.0187
  205. //256-81=175/5859.375=0.0298
  206. }
  207. //T1初始化程序
  208. /*
  209. void timer1_init(void)
  210. {
  211. TCCR1B = 0; //stop
  212. TCNT1H = 0;
  213. ICR1=0xFF00;
  214. OCR1A=100;
  215. OCR1B=100;
  216. TCCR1A =(0<<WGM11)|(0<<WGM10)|(1<<COM1A1)|(0<<COM1A0);//|(1<<COM1B1)|(1<<COM1B0);
  217. //升序记数时比较匹配将清零OC1A/OC1B,降序记数时比较匹配将置位OC1A/OC1B
  218. TCCR1B =(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);//(1<<WGM13)|(1<<WGM12)|(1<<CS10); //0x1A //start Timer
  219. //相位与频率修正PWM,64分频
  220. }
  221. void PWM_out(unsigned int intFreq)
  222. {
  223. //if (intFreq<=0)
  224.      //TCCR1B = 0; //stop
  225. ICR1=fosc/(intFreq*2*6.4);
  226. OCR1A=ICR1/2;
  227. }*/
  228. //T1初始化程序
  229. void timer1_init(void)
  230. {
  231. TCCR1B = 0; //stop
  232. //TCNT1H = 0;
  233. //ICR1=0xFFFF;
  234. OCR1A=0x0FFF;
  235. TCCR1A =(0<<WGM11)|(0<<WGM10)|(0<<COM1A1)|(1<<COM1A0);//WGM[3:0]=4;
  236. TCCR1B =(0<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);//N=1024,start Timer
  237. TCNT1H = 0;
  238. }
  239. void PWM_out(unsigned int intFreq)
  240. {
  241.   if (intFreq!=0)
  242. {
  243. OCR1A=2930/intFreq;
  244. TCNT1H = 0;
  245. TCNT1L = 0;
  246. }
  247. else
  248. {OCR1A=0;
  249. }

  250. }
  251. /*********************************************/

  252. #pragma interrupt_handler timer1_ovf_isr:9
  253. void timer1_ovf_isr(void)
  254. {
  255. //TIMSK&=~(1<<TOIE1);   //T/C1 溢出中断关闭
  256. //PWM_out(j);
  257. }
  258. void pwm(void)
  259.     {
  260. PWM_out(1);
  261. for(j=1;j<1500;j=j+15)
  262. {TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  263. delay_ms(50);
  264. }
  265. for(j=1500;j>=30;j=j-15)
  266. {TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  267. delay_ms(50);
  268. }
  269. delay_ms(200);
  270. TIMSK&=~(1<<TOIE1);   //T/C1 溢出中断关闭
  271. }
  272. //*************************************************************
  273. //*   函数说明:MCU端口初始化                             *
  274. //*   输入:    无                                       *
  275. //*   输出:    无                                           *
  276. //*   调用函数:                                         *
  277. //*************************************************************
  278. void port_init(void)     //IO端口初始化
  279. {
  280.   //DDRA|=(0Xfc);    //PA output LCD data
  281.   //PORTA&=~(0Xff);  
  282.   
  283.   //DDRD=0xff;     //can信号cs端口
  284.   //PORTD=0xff;    //can信号cs端口
  285.   DDRDBIT3=0;
  286.   PORTDBIT3=1;
  287.   DDRBBIT0=1;
  288.   PORTBBIT0=1;
  289.         
  290.   //DDRD  &= ~(1 << PD2);
  291.   //PORTD |= (1 << PD2);
  292.   //MCUCR = 0X00;      //低电平出发中断
  293.   //GICR = (1 << INT0);   //INT0中断使能
  294. DDRB=1<<1;    //PWM输出端口为输出
  295. PORTB=1<<1;
  296.   
  297.   
  298. }
  299. //call this routine to initialize all peripherals
  300. void init_devices(void)
  301. {
  302. //stop errant interrupts until set up
  303. CLI(); //disable all interrupts
  304. port_init();

  305. MCUCR = 0x00;
  306. //EMCUCR = 0x00;
  307. GICR = 0x00;
  308. TIMSK = 0x00;
  309. SEI(); //re-enable interrupts
  310. //all peripherals are now initialized
  311. }
  312.   //延时函数
  313. void CAN_ID(unsigned long ID)
  314. {
  315.    unsigned int IDH;
  316.   unsigned int IDL;
  317.   IDH= ID>>3;/右移3位
  318.   IDL=(ID & 7)<< 5;/取底3位左移5位
  319.    SPIByteWrite(TXB0SIDH,IDH);//设置发送缓冲器0的标准标识符,待修改***
  320.   SPIByteWrite(TXB0SIDL,IDL);//用到标准标识符
  321. }
  322. void Send_Tacho(unsigned long iTacho)//iTacho 0-7000
  323. {
  324.    unsigned int ValH;
  325.   unsigned int ValL;
  326.   unsigned char b[8]={0x0,0x00,0x00,0x00,0x7D,0x00,0x00,0x7D};
  327.   ValL=iTacho*4 ;
  328.   ValH=iTacho*4 >>8;
  329.   b[2]=ValH;
  330.   b[3]=ValL;
  331.   CAN_ID(0x094);
  332.   CAN_Send(b);
  333. }
  334.   
  335. /*****************************************************************************/  
  336. void Send_Temperature_full(void)//iTemperature 130
  337. {
  338.    
  339.   unsigned char b[8]={0xDF,0x02,0x00,0x50,0x00,0x00,0x00,0x00};
  340.   CAN_ID(0x288);
  341.   CAN_Send(b);

  342. }
  343. void Send_Temperature_zoo(void)//iTemperature 50
  344. {
  345.   
  346.   unsigned char b[8]={0x74,0x02,0x00,0x50,0x00,0x00,0x00,0x00};
  347.   CAN_ID(0x288);
  348.   CAN_Send(b);
  349. }
  350. /*****************************************************************************/

  351. /*****************************************************************************/
  352. void Send_ashen_background(void)//进入LED诊断环境
  353. {
  354.   unsigned char b2[5]={0x04,0x31,0xFA,0x08,0xFF};
  355.    CAN_ID(0x7E3);
  356.    CAN_Send(b2);
  357. }
  358. void Send_allset(void)//LED全部亮
  359. {
  360.   unsigned char b1[6]={0x05,0x31,0xFA,0x1C,0xE7,0xFF};
  361.    CAN_ID(0x7E3);
  362.     CAN_Send(b1);         
  363. }
  364. void Send_allclr(void)//LED全部关
  365. {
  366.   unsigned char b2[6]={0x05,0x31,0xFA,0x1C,0x00,0x00};
  367.    CAN_ID(0x7E3);
  368.    CAN_Send(b2);
  369. }
  370. /*****************************************************************************/

  371. /*****************************************************************************/
  372. void Send_door_ON(void)//四个车门-全亮
  373. {
  374. unsigned char b[3]={0xF0,0x23,0x00};
  375. CAN_ID(0x4D4);
  376. CAN_Send(b);
  377. }
  378. /*****************************************************************************/
  379. void Send_Wakeup(void)//Wakeup msg
  380. {
  381. unsigned char b[5]={0x00,0x00,0x00,0x00,0x00};
  382. CAN_ID(0x400);
  383. CAN_Send(b);
  384. }
  385. /*****************************************************************************/
  386. void Send_prndl_OFF(void)//档位的不同显示
  387. {
  388. unsigned char b[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  389.   CAN_ID(0x115);
  390.   CAN_Send(b);
  391.    
  392. }
  393. void Send_prndl_ON(long b)//
  394. {
  395. unsigned char b1[8]={0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00};
  396. unsigned char b2[8]={0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00};
  397. unsigned char b3[8]={0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00};
  398. unsigned char b4[8]={0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00};
  399. unsigned char b5[8]={0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00};
  400. unsigned char b6[8]={0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00};
  401. unsigned char br[8]={0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00};
  402. unsigned char bp[8]={0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00};
  403. unsigned char bn[8]={0x00,0x00,0x00,0xF1,0x00,0x00,0x00,0x00};
  404. unsigned char bd[8]={0x00,0x00,0x00,0xF2,0x00,0x00,0x00,0x00};
  405. unsigned char bs[8]={0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0x00};
  406. unsigned char bl[8]={0x00,0x00,0x00,0xF4,0x00,0x00,0x00,0x00};
  407. //unsigned char be[8]={0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00};
  408. CAN_ID(0x115);
  409. switch(b)
  410.   {
  411.   case 1:CAN_Send(b1);break;
  412.   case 2:CAN_Send(b2);break;
  413.   case 3:CAN_Send(b3);break;
  414.   case 4:CAN_Send(b4);break;
  415.   case 5:CAN_Send(b5);break;
  416.   case 6:CAN_Send(b6);break;
  417.   case 7:CAN_Send(br);break;
  418.   case 8:CAN_Send(bp);break;
  419.   case 9:CAN_Send(bn);break;
  420.   case 10:CAN_Send(bd);break;
  421.   case 11:CAN_Send(bs);break;
  422.   case 12:CAN_Send(bl);break;
  423.   //case 13:CAN_Send(be);break;
  424.    default:;break;
  425.   }
  426. }
  427. /*****************************************************************************
  428. void Send_prndl_DSI(long b)//DSI Mode
  429. {
  430. unsigned char r[8]={0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00};
  431. unsigned char p[8]={0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00};
  432. unsigned char n[8]={0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00};
  433. unsigned char d[8]={0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00};

  434. CAN_ID(0x116);
  435. switch(b)
  436.   {
  437.   case 8:CAN_Send(r);break;
  438.   case 9:CAN_Send(p);break;
  439.   case 10:CAN_Send(n);break;
  440.   case 11:CAN_Send(d);break;
  441.    default:;break;
  442.   }
  443. }
  444. /*****************************************************************************/
  445. void Send_Sleep(void)      //进入休眠状态
  446. {
  447. unsigned char b[5]={0x00,0x00,0x00,0x00,0x00};
  448.   CAN_ID(0x401);
  449.   CAN_Send(b);
  450. }
  451. /*****************************************************************************/
  452. void Send_ON(void)//安全带,门,转向灯
  453. {
  454. unsigned char b0[3]={0xFF,0x23,0x00};
  455. CAN_ID(0x4D4);
  456. CAN_Send(b0);
  457. }
  458. /*****************************************************************************/
  459. void Send_ESC()//电子稳定控制报警
  460. {
  461. unsigned char b[8]={0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  462. CAN_ID(0x068);
  463. CAN_Send(b);
  464. }
  465. /*****************************************************************************/
  466. void Send_Seatbelt()//驾驶座安全带开
  467. {
  468. unsigned char b[2]={0x07,0x00};
  469.   CAN_ID(0x268);
  470.   CAN_Send(b);
  471. }
  472. /*****************************************************************************/
  473. void Send_Engine()//发动机故障
  474. {
  475. unsigned char b[7]={0x00,0x02,0x00,0x00,0x00,0x00,0x00};
  476.   CAN_ID(0x288);
  477.   CAN_Send(b);
  478. }
  479. /*****************************************************************************/
  480. void Send_Cruise()//巡航
  481. {
  482. unsigned char b[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80};
  483.   CAN_ID(0x082);
  484.   CAN_Send(b);
  485. }
  486. /*****************************************************************************/  
  487. void stop(void)     //停止函数
  488. {
  489. /****************************
  490. Send_ashen_background();//进入led诊断环境
  491. delay_ms(50);
  492. Send_allclr();//led全部灭
  493. /****************************/
  494. TIMSK&=~(1<<TOIE0);   //关闭T0溢出中断
  495. TTH_CLR;//停止高电平
  496. TTL_CLR;//停止低电平
  497. RESI_CLR;//停止电阻
  498. IGN_CLR;//停止点火
  499. delay_ms(20);
  500. BATT_CLR;//停止电池
  501. delay_ms(500);
  502. }
  503. /****************************************************************************
  504. *****************************************************************************/
  505. void run(void)
  506. {
  507. can=1;
  508. num=0;
  509. num1=800;
  510. rev=0;

  511. TTH_CLR;//停止高电平
  512. TTL_CLR;//停止低电平
  513. IGN_CLR;//停止点火
  514. delay_ms(20);
  515. BATT_CLR;//停止电池
  516. timer1_init();   //PWM使用定时器初始化
  517. delay_ms(500);
  518. /******************************/
  519. if (i==0)
  520.    {
  521.    RESI_SET;//高电阻
  522.    }
  523. else
  524. {
  525. RESI_CLR;//低电阻
  526. }
  527. /**********************************/
  528. delay_ms(600);
  529. BATT_SET;//给电池
  530. delay_ms(20);
  531. IGN_SET;//给点火
  532. delay_ms(150);
  533. Send_prndl_ON(1);
  534. delay_ms(1500);
  535. /******************************/
  536. if (i==0)
  537.    {
  538.    Send_Temperature_full();//高温
  539.    }
  540. else
  541. {
  542. Send_Temperature_zoo();//低温
  543. }
  544. delay_ms(20);
  545. /**********************************
  546. Send_door_ON();//四个车门-全亮
  547. /***********************************/
  548. Send_prndl_ON(1);
  549. delay_ms(50);
  550. /****************************
  551. Send_ashen_background();//进入led诊断环境
  552. delay_ms(50);
  553. Send_allset();//led全部亮
  554. /****************************/
  555. Send_ON();//车门,转向灯
  556. delay_ms(10);
  557. Send_ESC();//ESC
  558. delay_ms(10);
  559. Send_Seatbelt();//安全带
  560. delay_ms(10);
  561. //Send_Engine();
  562. delay_ms(10);
  563. Send_Cruise();//巡航
  564. delay_ms(20);
  565. TTH_SET;//高电平
  566. TTL_SET;//低电平

  567. Send_prndl_ON(1);
  568. delay_ms(100);
  569. //转盘扫描程序
  570. //TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  571. //j=10;
  572. //DDRB=1<<1;    //PWM输出端口为输出
  573. //PORTB=1<<1;
  574. TIMSK|=(1<<TOIE0);   //使能T0溢出中断
  575. while(can)    //等待扫描结束
  576. {

  577. //PWM_out(j);
  578. //delay_ms(200);
  579. }
  580. TIMSK&=~(1<<TOIE0);   //关闭T0溢出中断
  581. //DDRB=0<<1;    //PWM输出端口为输入
  582.    if (i==0)   //i为0或者为1代表单周或者双周
  583.   i=1;
  584. else
  585.   i=0;
  586. Init2515();
  587. //timer1_init();   //PWM使用定时器初始化
  588. //delay_ms(200);
  589. }//end run
  590. /******************************************************************************
  591. ******************************************************************************/
  592. void main()
  593. {
  594. char m1=0,m2=0,m3=0;   //模式编码变量
  595. char before=000;//前次运行模式变量
  596. port_init();
  597. PORTD=0xff;
  598. SPI_MasterInit();//SPI初始化,并启动
  599. Init2515();
  600. timer1_init();   //PWM使用定时器初始化
  601. timer0_init();
  602. //TIMSK&=~(1<<TOIE1);   //T/C1 溢出中断关闭
  603. //TIMSK|=(1<<TOIE1);   //T/C1 溢出中断允许
  604. delay_ms(2000);

  605. while(0)
  606. {
  607. run();
  608. }
  609. while(1)
  610.   {

  611.   
  612.    if(key_si1)  //
  613.      {
  614.     delay_ms(20); //延时去抖,一般10-20ms
  615.        if(key_si1)     //再次确认按键是否按下,没有按下则退出
  616.        {
  617.    m1=1;
  618.    
  619.    }
  620.   }
  621.   if(!key_si1)  //
  622.      {
  623.     delay_ms(20); //延时去抖,一般10-20ms
  624.        if(!key_si1)     //再次确认按键是否按下,没有按下则退出
  625.        {
  626.    m1=0;
  627.    
  628.    }
  629.   }
  630.   
  631. /********************************************************************/
  632.   if(key_si2)  //
  633.      {
  634.     delay_ms(20); //延时去抖,一般10-20ms
  635.        if(key_si2)     //再次确认按键是否按下,没有按下则退出
  636.        {
  637.    m2=1;
  638.    }
  639.   }
  640.   if(!key_si2)  //
  641.      {
  642.     delay_ms(20); //延时去抖,一般10-20ms
  643.        if(!key_si2)     //再次确认按键是否按下,没有按下则退出
  644.        {
  645.    m2=0;
  646.    }
  647.   }
  648.    
  649. /********************************************************************/
  650.   if(key_si3)  //外部测试
  651.      {
  652.     delay_ms(500); //延时去抖,一般10-20ms
  653.        if(key_si3)     //再次确认按键是否按下,没有按下则退出
  654.        {
  655.    m3=1;
  656.    
  657.    }
  658.   }
  659.   if(!key_si3)  //外部测试
  660.      {
  661.     delay_ms(20); //延时去抖,一般10-20ms
  662.        if(!key_si3)     //再次确认按键是否按下,没有按下则退出
  663.        {
  664.    m3=0;
  665.    
  666.    }
  667.   }
  668.    
  669. /********************************************************************/
  670. runmodel=m3*100+m2*10+m1;//m1,m2,m3编码组合
  671. //runmodel=000;
  672. delay_ms(2);
  673. switch(runmodel)    //判断编码模式
  674. {
  675. case 100:     //正常模式,驱动板停止工作
  676.   if (before==100)
  677.    {
  678.   stop();
  679.   before=100;
  680.   }
  681. else
  682.   {
  683.   stop();
  684.   before=100;
  685.   }  
  686.   break;
  687.   
  688. case 111:   //正常模式,驱动板开始工作
  689.   if (before==111)
  690.    {
  691.   before=111;
  692.   run();  //调用正常运行函数
  693.   }
  694. else
  695.   {
  696.   stop();
  697.   delay_ms(1000);
  698.   run();  //调用正常运行函数
  699.    before=111;
  700.   }
  701.   break;
  702.   
  703. case 11:   //外部测试模式,仅给电池和点火信号
  704.   if (before==11)
  705.    {
  706.   before=11;
  707.   delay_ms(3000);
  708.   }
  709. else
  710.   {
  711.   stop();
  712.   delay_ms(50);
  713.   BATT_SET;//给电池
  714.   delay_ms(10);
  715.   IGN_SET;//给点火
  716.   before=11;
  717.   
  718.   }  
  719.   break;   
  720.   
  721. case 110:     //m2有效,休眠模式,只给电池信号
  722.   if (before==110)
  723.    {
  724.   before=110;
  725.   delay_ms(1000);
  726.   }
  727. else
  728.   {
  729.   stop();
  730.   delay_ms(100);
  731.   BATT_SET;//给电池
  732.   delay_ms(500);
  733.   Send_Sleep();//进入休眠
  734.   before=110;
  735.   }
  736. break;

  737. case 101:  //m1有效,外控模式,类似正常启动模式
  738.   if (before==101)
  739.    {
  740.   before=101;
  741.   run();  //调用正常运行函数
  742.   
  743.   }
  744. else
  745.   {
  746.   stop();
  747.   delay_ms(1000);
  748.   run();  //调用正常运行函数
  749.    before=101;
  750.   }
  751.   break;
  752.   
  753. default:stop();break;   
  754. }//end switch
  755. /******************************************************************/   
  756.   }//end while
  757. }//end main

复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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