找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 798|回复: 0
收起左侧

有关单片机测5m速度,编程后我给他设定时间100ms但测量显示结果是0.问题出在哪?

[复制链接]
ID:849316 发表于 2022-3-17 20:24 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. /**************************************************************************************                                                  *
  2. *按下K1按键  开始计时
  3. *按下K2按键  计时结束计算速度                                                                                 
  4. ***************************************************************************************/
  5. #include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
  6. #include<intrins.h>             //左右移函数,头文件
  7. #include<absacc.h>           //访问绝对地址头文件
  8. sbit k1=P1^0;     //按键1开始计时
  9. sbit k2=P1^1;     //按键2终止计时开始计算速度

  10. unsigned char ge=0,shi=0;        //定义数码管显示的个位和十位   
  11. unsigned int num=0,sec=0,m=0,v=0;//定义ms、s、时间总数和速度
  12. unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段控口
  13. /*******************************************************************************
  14. * 函 数 名         : delay
  15. * 函数功能           : 延时函数
  16. *******************************************************************************/
  17. void delay(unsigned int i)            
  18. {
  19.     while(i--);               // 去抖延时
  20. }
  21. void Delay10s()        
  22. {                           // 闪烁延时
  23. int i,j,z;
  24. for (i=1000;i>0;i--)
  25. for (j=1000;j>0;j--)
  26. for (z=10;z>0;z--);
  27. }
  28. /*******************************************************************************
  29. * 函 数 名         : Timer0Init
  30. * 函数功能           : 定时器0初始化
  31. * 输    入         : 无
  32. * 输    出         : 无
  33. *******************************************************************************/
  34. void Timer0Init(void)        //10微秒@12.000MHz
  35. {
  36.     TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  37.     TL0 = (65536-10000)%256;        //设置定时初值
  38.     TH0 = (65536-10000)/256;        //设置定时初值
  39.     ET0=1;//打开定时器0中断允许
  40.     EA=1;//打开总中断
  41.     TR0=1;//打开定时器   
  42. }
  43. /*******************************************************************************
  44. * 函 数 名         : display
  45. * 函数功能           : 速度显示函数
  46. *******************************************************************************/
  47. /******速度显示函数******/
  48. void display()              //列车一般情况下列车的平均速度为300km/h约等于83m/s
  49. {
  50. ge=v%10;                  //求个位
  51. shi=v/10;                  //求十位
  52. P2=0xfe;                  //选择数码管1,输入位选信号
  53. P0=table[ge];              //数码管段选信号,显示个位数值
  54. Delay10s();
  55. P2=0xfd;                  //选择数码管2,输入位选信号
  56. P0=table[shi];              //数码管段选信号,显示十位数值
  57. Delay10s();
  58. }
  59. /*******************************************************************************
  60. * 函 数 名         : tt
  61. * 函数功能           : 速度显示函数
  62. *******************************************************************************/
  63. /******时钟显示函数******/
  64. void tt()             // 定时开关函数        
  65.   {                           // 定时100ms
  66.    int a,b;
  67.    for (a=1000;a>0;a--)
  68.    for (b=100;b>0;b--)
  69.    k2=0;
  70.    }
  71. /*******************************************************************************
  72. * 函 数 名         : keypros1
  73. * 函数功能           : 按键处理函数,判断按键是否按下并
  74. *******************************************************************************/
  75. void keypros()
  76.     {
  77.     if(k1==0)          //检测按键K1是否按下
  78.     {   
  79.     delay(1000);   //消除抖动 一般大约1ms
  80.     if(k1==0)     //再次判断按键是否按下
  81.     {
  82.     num++;
  83.     TL0 = (65536-1000)%256;        //设置定时初值
  84.     TH0 = (65536-1000)/256;        //设置定时初值
  85.     if(num==1000)                //时间到达1s
  86.     {
  87.     num=0;                        //重新从1ms开始计时
  88.     sec++;                        //累计1S
  89.     }
  90.     }   
  91.     while(!k1);     //检测按键是否松开
  92.     }
  93.     }   
  94. /*******************************************************************************
  95. * 函 数 名       : main
  96. * 函数功能         : 主函数
  97. *******************************************************************************/
  98. void main()
  99. {   
  100.     Timer0Init();  //定时器0初始化
  101.     while(1)
  102.     {   
  103.     keypros();  //按键处理函数
  104.     tt();
  105.     if(k2==0)          //检测按键K2是否按下
  106.     {   
  107.     delay(1000);   //消除抖动 一般大约1ms
  108.     if(k2==0)     //再次判断按键是否按下
  109.     {
  110.     m=1000*sec+num;         //求时间单位为ms
  111.     v=5000/m;             //速度公式求列车速度单位为m/s
  112.     }
  113.     }   
  114.     display();            
  115.     }        
  116. }

  117. /*******************************************************************************
  118. * 函 数 名         : void Timer0() interrupt 1
  119. * 函数功能           : 定时器0中断函数
  120. *******************************************************************************/
  121. void Timer0() interrupt 1
  122. {
  123.     TL0 = (65536-10000)%256;        //设置定时初值
  124.     TH0 = (65536-10000)/256;        //设置定时初值
  125.     keypros();
  126. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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