找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机跑步机启停速度控制模块仿真+源程序+电路原理图

[复制链接]
跳转到指定楼层
楼主


51单片机跑步机启停速度控制模块仿真电路原理图如上

51单片机跑步机启停速度控制模块源程序:
  1. #include <AT89X52.h>                       

  2. unsigned char code SEGtable[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};     //字符编码

  3. sbit SEKey =  P1 ^ 0;                        //启动、暂停和停止按键
  4. sbit INCKey = P1 ^ 4;     //速度增加键
  5. sbit DECKey = P1 ^ 7;     //速度减少键

  6. sbit pauseLED = P3 ^ 0;                //暂停指示灯
  7. sbit stopLED = P3 ^ 7;                            //停止指示灯

  8. bit keyFlg;                                        //按键长按、短按标志位 0为短按 1为长按

  9. unsigned char TimeCounter;                                        //计数专用
  10. unsigned char KeyDownFlg,set;                        //按键专用

  11. unsigned char yansi,key,send,unitsdData,tensdData,num,keynum;
  12. bit        keybz;

  13. //延时函数
  14. void delay(unsigned char time)
  15. {
  16.         unsigned char x,y;
  17.         for(x=time;x>0;x--)
  18.   {
  19.                         for(y=110;y>0;y--);
  20.   }
  21. }
  22. //扫描启动、停止、暂停按键
  23. void StartAndStopKeyScan()
  24. {       
  25.   if(SEKey == 0)                                        //键被按下
  26.         {
  27.           KeyDownFlg = 1;                                        //置键按下标志位
  28.           TR0 = 1;                                                        //启动定时器
  29.         }
  30.        
  31.         if((SEKey == 1) && (KeyDownFlg == 1))                //判断设置键是否松开
  32.         {
  33.     KeyDownFlg = 0;                                                //清除键标志位
  34.                 if(keyFlg == 0)                                //如果是短按
  35.                 {
  36.                   stopLED = 1;
  37.                   pauseLED =~pauseLED;
  38.           }
  39.           TR0 = 0;                                                        //关闭定时器
  40.           TimeCounter = 0;                                                          //计数器清零
  41.           keyFlg = 0;                                                //清除短按、长按标志位
  42.         }       
  43. }

  44. void SegDisplay(unsigned char tensdData,unsigned char unitsdData)
  45. {
  46.   P0 = SEGtable[tensdData];
  47.           delay(10);       
  48.         P2 = SEGtable[unitsdData];       
  49.           delay(10);
  50. }

  51. void keyscan1()                        //具有连加功能的的按键扫描程序
  52. {
  53.         if(INCKey==0)                                                        //判断INCKey键是否按下?
  54.                 {
  55.                         SegDisplay(tensdData,unitsdData);                                        //延时去抖动
  56.                         if(INCKey==0)                                        //如果真接下就去执行键盘程序
  57.                         {
  58.                                 if(keybz==0)                                //判断是否是第一次按下?
  59.                                                 {
  60.                                                         num++;                //值加一
  61.                                                         if(num==100)        //判断是否加到100       
  62.                                                                 {num=0;}//加到100清0
  63.                                                         keybz=1;        //第一次进来置标志位
  64.                                                         key--;                //按键次数计数器
  65.                                                         keynum=5;        //快加按键次数计数器
  66.                                                         tensdData=num/10;        //BCD码转为十进制值
  67.                                                         unitsdData=num%10;
  68.                                                         return;                //不用检测松手直接返回
  69.                                                                        
  70.                                                 }
  71.                                         else                                //如果是第二次按下则执行下面的语句
  72.                                         {
  73.                                                 if(key==0)                //判断按键次数到100次了吗?               
  74.                                                         {
  75.                                                         if(keynum==0)        //检测按下时间是否超过加5次的时间
  76.                                                                 {
  77.                                                                         key=10;                //如果按键持续时间超过加5次的时间则以后每10次执行加工厂操作
  78.                                                                         num++;
  79.                                                                         if(num==99)
  80.                                                                                 {
  81.                                                                                         num=0;
  82.                                                                                 }
  83.                                                                         tensdData=num/10;
  84.                                                                         unitsdData=num%10;
  85.                                                                         return;
  86.                                                                 }
  87.                                                           else                //没有到5次时间则执行下面的语句
  88.                                                                   keynum--;        //快加计数器减一
  89.                                                                   key=100;
  90.                                                                   num++;
  91.                                                           if(num==99)
  92.                                                                   {
  93.                                                                   num=0;
  94.                                                                   }
  95.                                                           tensdData=num/10;
  96.                                                           unitsdData=num%10;
  97.                                                           return;
  98.                                                                   
  99.                                                         }
  100.                                                 else                        //没有到100次下次再来判断.
  101.                                                         key--;
  102.                                                         return;
  103.                                        
  104.                                         }

  105.                                                                                
  106.                         }

  107.                         if(INCKey!=0)                                                        //松手后所有的计数器清并置默认值
  108.                                 {
  109.                                         keynum=5;
  110.                                         key=30;
  111.                                         keybz=0;
  112.                                         return;                                                //返回
  113.                                 }                    
  114.                 }
  115. /*************************以下是减一键处理程序,执行效果同加一程序*******************************************************************/       
  116.         if(DECKey==0)
  117.                 {
  118.                         SegDisplay(tensdData,unitsdData);
  119.                         if(DECKey==0)
  120.                         {
  121.                                 if(keybz==0)
  122.                                         {
  123.                                                 num--;
  124.                                                 if(num==-1)
  125.                                                         {num=99;}
  126.                                                 keybz=1;
  127.                                                 key--;
  128.                                                 keynum=5;
  129.                                                 tensdData=num/10;
  130.                                                 unitsdData=num%10;
  131.                                                 return;
  132.                                                                
  133.                                         }
  134.                                 else
  135.                                         {
  136.                                                 if(key==0)
  137.                                                         {
  138.                                                         if(keynum==0)
  139.                                                                 {
  140.                                                                 key=10;
  141.                                                                 num--;
  142.                                                                 if(num==0)
  143.                                                                         {
  144.                                                                                 num=99;
  145.                                                                         }
  146.                                                                 tensdData=num/10;
  147.                                                                 unitsdData=num%10;
  148.                                                                 return;
  149.                                                                 }
  150.                                                           else
  151.                                                           keynum--;
  152.                                                           key=100;
  153.                                                           num--;
  154.                                                           if(num==0)
  155.                                                                   {
  156.                                                                   num=99;
  157.                                                                   }
  158.                                                           tensdData=num/10;
  159.                                                           unitsdData=num%10;
  160.                                                           return;
  161.                                                                   
  162.                                                         }
  163.                                                 else
  164.                                                         key--;
  165.                                                         return;                                       
  166.                                         }                                                                               
  167.                         }                            
  168.                 }
  169.         if(DECKey!=0)
  170.                 {
  171.                         keynum=5;
  172.                         key=30;
  173.                         keybz=0;
  174.                         return;
  175.                 }
  176. }
  177. void Timer0Interrupt(void) interrupt 1
  178. {
  179.         TimeCounter++;
  180.         if(TimeCounter==250)                        //定时时间到
  181.         {
  182.                 keyFlg = 1;                                      //置长按标志位
  183.                 pauseLED = 1;                               
  184.                 stopLED = ~stopLED;                        //取反
  185.                 TR0=0;                                                //关闭定时器
  186.         }
  187.   TH0 = 0xd8;
  188.   TL0 = 0xf0;                                        //定时器重新赋初值
  189. }
  190. //主函数
  191. void main(void)
  192. {
  193.         EA = 1;
  194.         TMOD = 0x01;
  195.   TH0 = 0xd8;                          //10ms
  196.   TL0 = 0xf0;
  197.         ET0 = 1;                                //设置定时器1

  198.         unitsdData=0;
  199.         tensdData=0;
  200.         P1=0xff;
  201.         P2=0;
  202.         key=100;
  203.   SegDisplay(0,9);
  204.         while(1)
  205.         {
  206.           StartAndStopKeyScan();                                //调用按键扫描子程序
  207.     keyscan1();
  208.           SegDisplay(tensdData,unitsdData);
  209.         }
  210. }

复制代码



51单片机跑步机启停速度控制模块仿真所有资料下载:http://www.51hei.com/bbs/dpj-54940-1.html
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:79544 发表于 2016-8-31 18:28 | 只看该作者
楼主辛苦谢谢分享,学习一下按键。
回复

使用道具 举报

板凳
ID:167215 发表于 2017-3-21 17:28 | 只看该作者
请问跑步机当前跑步速度怎么测定?
回复

使用道具 举报

地板
ID:371504 发表于 2018-7-15 13:57 | 只看该作者
为什么下下来打开是乱码
回复

使用道具 举报

5#
ID:449697 发表于 2018-12-19 11:07 | 只看该作者
第二个灯怎么让他亮起来
回复

使用道具 举报

6#
ID:732806 发表于 2020-4-19 16:20 | 只看该作者
怎么下载
回复

使用道具 举报

7#
ID:421189 发表于 2022-11-16 22:41 | 只看该作者
请问仿真软件是?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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