数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3929|回复: 20

[C51] 电动车定时器只做完了,感觉。。。。。

[复制链接]
发表于 2019-11-22 11:28:06 | 显示全部楼层 |阅读模式
本帖最后由 llftom 于 2019-11-22 16:14 编辑

    家里面有个定时器,但是每次要对好了开始时间和结束时间有点麻烦,所以自己做个定时器,
刚开始想用stc89c52,后来想了想有点浪费l/O口,又用了stc11f02e。

先从最基本的焊接把数码管线焊接上,一个月之前就开始做了,有好多事耽误制作。

做好了就是下载程序了。
下面是程序,大概只有1K多,写的比较垃圾,没专业学过编程,如果程序有写的不对的地方请指正,谢谢

复制代码
  1. #include<STC11F.h>     
  2. #include<intrins.h>  
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. sbit k1=P3^2;
  6. sbit k2=P3^1;
  7. sbit k3=P3^0;
  8. sbit J1=P3^7;                 //继电器输出
  9. bit  flag=0;     //存储标志位
  10. bit  flag1=1;                 //倒计时结束标志位
  11. bit  flag2=0;    //显示小绿灯标志位
  12. bit  flag3=0;
  13. uchar time,g1=0,timec=0;
  14. uchar disp[4];
  15. uint counter=0,a=5000,i=800;  //i代表循环快慢,越小循环越快   a代表按键完成到计时开始的延时
  16. //uchar timec=0;
  17. uchar code leddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,  
  18.                                                                 0x77,  //"A"
  19.                 0x7C,  //"B"
  20.                 0x39,  //"C"
  21.                 0x5E,  //"D"
  22.                 0x79,  //"E"
  23.                 0x71,  //"F"
  24.                 0x76,  //"H"
  25.                 0x38,  //"L"
  26.                 0x37,  //"n"
  27.                 0x3E,  //"u"
  28.                 0x73,  //"P"
  29.                 0x5C,  //"o"
  30.                 0x40,  //"-"
  31.                 0x00,  //熄灭
  32.                                                                 0x01,  //24
  33.                                                                 0x02,                //25
  34.                                                                 0x04,                //26
  35.                                                                 0x08,                //27
  36.                                                                 0x10,                //28
  37.                                                                 0x20                //29
  38.         
  39.         };//0~9

  40. /*Declare SFR associated with the IAP
  41. sfr IAP_DATA    =   0xC2;           //Flash data register
  42. sfr IAP_ADDRH   =   0xC3;           //Flash address HIGH
  43. sfr IAP_ADDRL   =   0xC4;           //Flash address LOW
  44. sfr IAP_CMD     =   0xC5;           //Flash command register
  45. sfr IAP_TRIG    =   0xC6;           //Flash command trigger
  46. sfr IAP_CONTR   =   0xC7;           //Flash control register
  47. */
  48. /*Define ISP/IAP/EEPROM command*/
  49. #define CMD_IDLE    0               //Stand-By
  50. #define CMD_READ    1               //uchar-Read
  51. #define CMD_PROGRAM 2               //uchar-Program
  52. #define CMD_ERASE   3               //Sector-Erase

  53. /*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
  54. //#define ENABLE_IAP  0x82            //if SYSCLK<20MHz
  55. #define ENABLE_IAP 0x83           //if SYSCLK<12MHz


  56. //Start address for STC10/11xx EEPROM
  57. #define IAP_address 0x0000

  58. void delayus()//函数功能:延时若干微秒
  59. {
  60.         _nop_();
  61.         _nop_();
  62. }

  63. void delay(uint z)    //函数功能:延时若干毫秒
  64. {
  65.         uchar x,y;
  66.         for(x=z;x>0;x--)
  67.           for(y=120;y>0;y--);
  68. }


  69. void Timer1Init(void)                //50毫秒@12.000MHz
  70. {
  71.         AUXR &= 0xBF;                //定时器时钟12T模式
  72.         TMOD &= 0x0F;                //设置定时器模式
  73.         TMOD |= 0x10;                //设置定时器模式
  74.         TL1 = 0xB0;                //设置定时初值
  75.         TH1 = 0x3C;                //设置定时初值
  76.         TF1 = 0;                //清除TF1标志
  77.         //TR1 = 1;                //定时器1开始计时
  78. }

  79. /*void Timer0Init(void)                //60毫秒@12.000MHz
  80. {
  81.         AUXR &= 0x7F;                //定时器时钟12T模式
  82.         TMOD &= 0xF0;                //设置定时器模式
  83.         TMOD |= 0x01;                //设置定时器模式
  84.         TL0 = 0xA0;                //设置定时初值
  85.         TH0 = 0x15;                //设置定时初值
  86.         TF0 = 0;                //清除TF0标志
  87.         TR0 = 1;                //定时器0开始计时
  88. }

  89. */

  90. void timer1_int() interrupt 3
  91. {
  92.         TF1=0;
  93.         TL1 = 0xB0;                //设置定时初值
  94.         TH1 = 0x3C;          //50ms
  95.         timec+=1;
  96.         if(timec%10==0)
  97.                 flag3= ~flag3;
  98.         if(timec==20)
  99.          {
  100.                 counter+=1;
  101.                 timec=0;
  102.                  
  103.          }
  104.         /*g1++;
  105.         if(g1==25)
  106.      flag3=~flag3;*/
  107.          
  108. }

  109. /*void timer0_int() interrupt 1
  110. {
  111.         TF0=0;
  112.         TL0 = 0xA0;                //设置定时初值
  113.         TH0 = 0x15;                //设置定时初值    定时60mS
  114.   g1+=1;
  115.         if(g1==40)
  116.         {
  117.     //flag2= ~flag2;
  118.                 //g1=0;
  119.         }
  120. }
  121. */
  122. void display()
  123. {

  124.         P3=P3 | 0x78;    //0111 1000
  125.         delay(2);
  126.         
  127.         P1=leddata[disp[3]];  //第4位,        
  128.         P3|=0x38;//0011 1000
  129.   P3&=0xBF;        //1011 1111
  130.         delay(2);
  131.         _nop_();
  132.         P3|=0x78;

  133.         P1=leddata[disp[2]];  //第3位,        
  134.         P3|=0x58;//0101 1000  
  135.         P3&=0xDF;//1101 1111
  136.         delay(2);
  137.         _nop_();
  138.         P3|=0x78;

  139.         P1=leddata[disp[1]];  //第2位,        
  140.         if(flag2)
  141.                 if(flag3)
  142.                 P1|=0x80;
  143.         P3|=0x68;//0110 1000
  144.         P3&=0xEF;//1110 1111
  145.         delay(2);
  146.         _nop_();
  147.         P3|=0x78;

  148.         P1=leddata[disp[0]];  //第1位,        
  149.         P3|=0x70;//0111 0000
  150.         P3&=0xF7;//1111 0111
  151.         delay(2);
  152.         _nop_();
  153.         P3|=0x78;  
  154. }

  155. void display1()
  156. {
  157.         
  158. }
  159. void keyscan()
  160. {
  161.         if(k1==0)
  162.                 {
  163.                         delay(5);//消抖
  164.                         if(k1==0)
  165.                         {
  166.                                 
  167.                                 while(!k1);
  168.                         }
  169.                 }

  170.                 if(k2==0)
  171.                 {
  172.                         delay(5);//消抖
  173.                         if(k2==0)
  174.                         {
  175.                                 time+=1;
  176.                                 a=5000;
  177.                                 if(time>99)
  178.                                         time=0;
  179.                                 while(!k2);
  180.                                 flag=1;
  181.                         }
  182.                 }
  183.                 if(k3==0)
  184.                 {
  185.                         delay(5);//消抖
  186.                         if(k3==0 )//停止计时才有效
  187.                         {
  188.                                 time-=1;
  189.                                 a=5000;
  190.                                 if(time<2)
  191.                                         time=1;
  192.                                 while(!k3);
  193.                                 flag=1;
  194.                         }
  195.                 }
  196.                
  197. }
  198. ////////////
  199. void IapIdle()
  200. {
  201.     IAP_CONTR = 0;                  //Close IAP function
  202.     IAP_CMD = 0;                    //Clear command to standby
  203.     IAP_TRIG = 0;                   //Clear trigger register
  204.     IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
  205.     IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
  206. }

  207. /*----------------------------

  208. ----------------------------*/
  209. uchar IapReadBYTE(uint addr)
  210. {
  211.     uchar dat;                       //Data buffer

  212.     IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  213.     IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command
  214.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  215.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  216.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  217.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  218.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  219.     dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
  220.     IapIdle();                      //Close ISP/IAP/EEPROM function

  221.     return dat;                     //Return Flash data
  222. }

  223. /*----------------------------

  224. ----------------------------*/
  225. void IapProgramBYTE(uint addr, uchar dat)
  226. {
  227.     IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  228.     IAP_CMD = CMD_PROGRAM;          //Set ISP/IAP/EEPROM PROGRAM command
  229.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  230.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  231.     IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
  232.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  233.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  234.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  235.     IapIdle();
  236. }

  237. /*----------------------------

  238. ----------------------------*/
  239. void IapEraseSector(uint addr)
  240. {
  241.     IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  242.     IAP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command
  243.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  244.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  245.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  246.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  247.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  248.     IapIdle();
  249. }

  250. void main()
  251. {
  252.         
  253.         uchar shi,fen,fshi,ffen,k;
  254.         uint b;
  255.         J1=1;
  256.         Timer1Init();
  257.         ET1=1;
  258.         ET0=1;
  259.         EA=1;
  260.         //IapEraseSector(IAP_address);//清除扇区中的内容,
  261.         //IapProgramBYTE(IAP_address,7);//把设置时间写入扇区,
  262.         
  263.                                 delayus();
  264.                                 
  265.                                 flag2=0;
  266.                                 time=IapReadBYTE(IAP_address);
  267.                                 while(a--)
  268.                                 {
  269.                                         disp[3]=time%10;
  270.                                         disp[2]=time/10;
  271.                                         disp[1]=22;     //-
  272.                                         disp[0]=20;     //P
  273.                                         display();
  274.                                                 
  275.                                         keyscan();
  276.                                   delay(5);
  277.                                 }
  278.                                 for(b=0;b<1500;b++)
  279.                                 {
  280.                                         disp[0]=disp[1]=disp[2]=disp[3]=22;//显示----
  281.                                         display();
  282.                                 }
  283.                                 //delay(30000);
  284.                                         //while(1);
  285.                                 if(flag)
  286.                                 {
  287.                                         IapEraseSector(IAP_address);//清除扇区中的内容,
  288.                                         IapProgramBYTE(IAP_address,(uchar)time);//把设置时间写入扇区,
  289.                                         flag=0;
  290.                                 }
  291.                                 TR1  =1;
  292.                                 ffen =1;
  293.                                 fshi =1;
  294.                                 while(flag1)
  295.                                 {
  296.                                         flag2=1;                                                                //显示小绿灯标志位
  297.                                         J1=0;
  298.                                         if(counter==60)
  299.                                         {
  300.                                                 counter=0;
  301.                                                 ffen++;
  302.                                         }
  303.                                         if(ffen==61)
  304.                                         {
  305.                                                 fshi++;
  306.                                                 ffen=1;
  307.                                         }
  308.                                         if(ffen>=time)
  309.                                                 goto page;
  310.                                        
  311.                                         shi=time-fshi;
  312.                                 page:
  313.                                         fen=60-ffen;
  314.                                         //        fen=60-ffen;
  315.                                        
  316.                                         if(fen==0 && shi==0)
  317.                                         {
  318.                                                 flag1=0;
  319.                                                 flag2=0;
  320.                                         }
  321.                                         /*if(shi==0)
  322.                                         goto page;        
  323.                                         if(ffen==60)
  324.                                         {
  325.                                                 ffen=1;
  326.                                                 fshi++;
  327.                                         }
  328.                                         //fen=60-ffen;
  329.                                         shi=time-fshi;
  330.                                         //if(shi==0)
  331.                                         //        shi==0;
  332.                                         //page:
  333.                                         //        if(ffen==60)
  334.                                         //                fen==60-ffen;
  335.                                 page:*/
  336.                                         _nop_();
  337.                                         _nop_();
  338.                                         disp[3]=fen%10;                                        //第4位,
  339.                                         disp[2]=fen/10;                     //第3位,
  340.                                         disp[1]=shi%10;                                        //第2位,
  341.                                         disp[0]=shi/10;                                        //第1位,
  342.                                        
  343.                                         display();
  344.                                         //if(shi==0 && fen==0)
  345.                                        
  346.                                                 
  347.                                 }
  348.                                                                                        
  349.                                         while(1)
  350.                                         {
  351.                                                 J1=1;
  352.                                                 //上面显示,
  353.                                                 for(k=0;k<4;k++)
  354.                                                 {
  355.                                                         
  356.                                                         disp[0]=disp[1]=disp[2]=disp[3]=23;
  357.                                                         disp[k]=24;
  358.                                                         for(b=0;b<i;b++)
  359.                                                                 display();
  360.                                                 }
  361.                                                 //右面显示,
  362.                                                 disp[3]=25;
  363.                                                 disp[1]=disp[2]=disp[0]=23;
  364.                                                 for(b=0;b<i;b++)
  365.                                                  display();
  366.                                                 disp[3]=26;
  367.                                                 disp[1]=disp[2]=disp[0]=23;
  368.                                                 for(b=0;b<i;b++)
  369.                                                  display();
  370.                                                 //下面显示,
  371.                                                 for(k=0;k<4;k++)
  372.                                                 {
  373.                                                         
  374.                                                         disp[0]=disp[1]=disp[2]=disp[3]=23;
  375.                                                         disp[(3-k)]=27;
  376.                                                         for(b=0;b<i;b++)
  377.                                                                 display();
  378.                                                 }
  379.                                                 //左面显示,
  380.                                                 disp[0]=28;
  381.                                                 disp[1]=disp[2]=disp[3]=23;
  382.                                                 for(b=0;b<i;b++)
  383.                                                  display();
  384.                                                 disp[0]=29;
  385.                                                 disp[1]=disp[2]=disp[3]=23;
  386.                                                 for(b=0;b<i;b++)
  387.                                                  display();
  388.                                                 
  389.                                         }
  390. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +18 收起 理由
飞向狙沙 + 18 謝謝分享

查看全部打赏

 楼主| 发表于 2019-11-22 11:29:08 | 显示全部楼层
先占楼一下,说实话我头一次发帖,不太会用
回复 支持 反对

使用道具 举报

发表于 2019-11-22 16:53:51 来自手机浏览器 | 显示全部楼层
很漂亮…注意高低压隔离…
回复 支持 反对

使用道具 举报

发表于 2019-11-24 14:05:02 | 显示全部楼层
做的很好,也很实用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-8 13:17:59 | 显示全部楼层
触景情伤 发表于 2019-11-22 16:53
很漂亮…注意高低压隔离…

谢谢提醒,洞洞板焊盘距离很近所以没在洞洞板上焊接继电器,就是怕高压有干扰和危险。
回复 支持 反对

使用道具 举报

发表于 2019-12-8 17:56:25 | 显示全部楼层
8个三极管?驱动数码管?
回复 支持 反对

使用道具 举报

发表于 2019-12-18 11:50:39 | 显示全部楼层
使用MCU内部EEPROM,记录常用时间,开机直接调用存储的时间。
回复 支持 1 反对 0

使用道具 举报

发表于 2019-12-20 10:24:36 | 显示全部楼层
本帖最后由 fryefryefrye 于 2019-12-20 10:35 编辑

电动车定时器,最方便的还是用发条的那种,插上插头,拧一下,开始充电,最方便。1秒搞定。
那种一个按键,一个数码管,按数次选择一个小时数的,都不够方便。1秒搞不定。
要不就是你自制的,插上电源,自动读取配置,开始计时,连按键设置都不需要。

不过我家用的比较复杂,楼下充电设备带WiFi,可以检测车插上没有,电压电流多少,也可以接受家里控制主机的命令开是充电或者停止充电。

然后楼上的设备可以显示插上,电流,电压,充电电量,还有充电剩余时间等。


骑车回家,不管三七二十一,插上线就行,主机会根据电量,是否快到周末等等条件自动判断是否充电,充电多长时间。

另外楼下主机还有无钥匙系统,如果无线钥匙不在现场,而充电线断了,说明有人偷电池,或者偷车,会自动报警并电话通知。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2019-12-21 14:16:16 | 显示全部楼层
有点看不懂呀
回复 支持 反对

使用道具 举报

发表于 2019-12-24 10:45:52 | 显示全部楼层
这么多三级管是干啥的?
回复 支持 反对

使用道具 举报

发表于 2019-12-28 13:13:52 | 显示全部楼层
用这么多三极管驱动数码管,还不如用一个74hc245。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 23:21:48 | 显示全部楼层
750123208 发表于 2019-12-8 17:56
8个三极管?驱动数码管?

是的,这事共阴的就是8个,共阳的可以用4个
回复 支持 反对

使用道具 举报

发表于 2020-1-6 13:58:39 | 显示全部楼层
可以来打点免费PCB板子做,更稳定。:titter:
回复 支持 反对

使用道具 举报

发表于 2020-1-14 15:42:04 | 显示全部楼层
ZUI最简单使用的是加装时间继电器,定好时间,比如6个小时,插电就工作,不需要调整
回复 支持 反对

使用道具 举报

发表于 2020-1-14 18:36:06 | 显示全部楼层
应该只需要4个三极管就够了。
每个字的位扫端加一个就OK了,你这样在段扫这里加三极管是毫无用处的。
其实是单片机的端口的灌电流一般都比较大,不用加三极管也行。
每次只点亮一个数码管,控制好每段5ma的电流,最大也就是40ma,看看单片机的资料,如果用的是共阴数码管,那应该就不用加三极管了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-10 16:36:59 | 显示全部楼层
jjbboox 发表于 2020-1-14 18:36
应该只需要4个三极管就够了。
每个字的位扫端加一个就OK了,你这样在段扫这里加三极管是毫无用处的。
其实 ...

我用的是共阴的,怕单片机驱动不起来!
回复 支持 反对

使用道具 举报

发表于 2021-4-29 18:08:02 | 显示全部楼层
楼主 这个是通电就开始定时充电吗 简要的硬件连接示意图有没,有些没看懂
回复 支持 反对

使用道具 举报

发表于 2021-5-7 18:20:39 来自手机浏览器 | 显示全部楼层
fryefryefrye 发表于 2019-12-20 10:24
电动车定时器,最方便的还是用发条的那种,插上插头,拧一下,开始充电,最方便。1秒搞定。
那种一个按键, ...

那么高级,层主可否详细介绍下?
回复 支持 反对

使用道具 举报

发表于 2021-9-19 16:46:38 | 显示全部楼层
软硬兼施,很好
回复 支持 反对

使用道具 举报

发表于 2021-9-21 11:23:40 | 显示全部楼层
电路图没有
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-25 04:44 , Processed in 0.171600 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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