找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4151|回复: 3
收起左侧

51单片机测速仿真

[复制链接]
ID:200620 发表于 2017-5-15 10:08 | 显示全部楼层 |阅读模式
0.png 0.png

单片机源程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint num=0;                           //外部中断次数
  5. uchar num1=0;
  6. uint Speed_dat=0;
  7. uint Total_Dis=0;
  8. uchar Beep_speed=40;
  9. sbit KEY1=P3^5;
  10. sbit KEY2=P3^6;
  11. sbit KEY3=P3^7;

  12. void delayms(uint xms)
  13. {
  14.         uint i,j;
  15.         for(i=xms;i>0;i--)
  16.                 for(j=110;j>0;j--);
  17. }
  18. #include"LCD1602.H"
  19. #include"AT24C02.H"
  20. void keyscan()
  21. {
  22.         if(!KEY1)
  23.         {
  24.                 delayms(5);
  25.                 if(!KEY1)
  26.                 {
  27.                         if(Beep_speed<255)
  28.                         Beep_speed++;
  29.                         Write_AT24C02_Byte(3,Beep_speed);
  30.                         while(!KEY1);
  31.                 }
  32.         }        

  33.         else if(!KEY2)
  34.         {
  35.                 delayms(5);
  36.                 if(!KEY2)
  37.                 {
  38.                         if(Beep_speed>0)
  39.                         Beep_speed--;
  40.                         Write_AT24C02_Byte(3,Beep_speed);
  41.                         while(!KEY2);
  42.                 }
  43.         }        

  44.         else if(!KEY3)
  45.         {
  46.                 delayms(5);
  47.                 if(!KEY3)
  48.                 {
  49.                         Write_AT24C02_Byte(0,0);
  50.                         Write_AT24C02_Byte(1,0);
  51.                         Total_Dis=0;
  52.                         dis_Mileage();
  53.                         while(!KEY3);
  54.                 }
  55.         }        
  56. }

  57. void main()
  58. {
  59.         uchar dat=0;
  60.         float M_dat=0.0;
  61.         init_1602();
  62.         Init_AT24C02();
  63.         Beep_speed=Read_AT24C02_Random(3);
  64.         dat=Read_AT24C02_Random(0);
  65.         Total_Dis=dat*256+Read_AT24C02_Random(1);
  66.         dis_Mileage();
  67.         TMOD=0X01;
  68.         TH0=(65536-1000)/256;
  69.         TL0=(65536-1000)%256;
  70.         ET0=1;
  71.         TR0=1;
  72.         IT0=1;         //边沿触发中断
  73.         EX0=1;
  74.         EA=1;
  75.         while(1)
  76.         {
  77.                 if(num1>99)                //0.1s  计时
  78.                 {
  79.                         num1=0;                           
  80.                         M_dat+=(float)Speed_dat;                        //每1s走的米数
  81.                 }
  82.                 if(M_dat>1000.0)          //路程每增加100m储存一次  总量程+1“注:将得出的里程米数默认除以10  则为0.1s行走的米数”
  83.                 {
  84.                         M_dat-=1000.0;
  85.                         Total_Dis+=1;
  86.                         Write_AT24C02_Byte(0,Total_Dis/256);
  87.                         Write_AT24C02_Byte(1,Total_Dis%256);
  88.                         dis_Mileage();        
  89.                 }
  90.                 display();
  91.                 keyscan();        
  92.         }
  93. }

  94. void T0_time() interrupt 1                 //定时器0 定时1ms
  95. {
  96.         TH0=(65536-1000)/256;
  97.         TL0=(65536-1000)%256;
  98.         if(num<500) num++;          //        如果时间超过0.5s没有检测到脉冲则判断为速度为0
  99.         else Speed_dat=0;
  100.         if(num1<100) num1++;                  //0.1秒定时变量
  101.                         
  102. }

  103. void ex_0() interrupt 0           //外部中断0
  104. {
  105.         Speed_dat=(500/num);        //计算1s 电机转动的圈数    num为电机转动半圈的时间
  106.         num=0;
  107. }

复制代码

全部资料下载地址:
仿真.rar (40.47 KB, 下载次数: 115)
回复

使用道具 举报

ID:203359 发表于 2017-5-22 22:09 | 显示全部楼层
此帖仅作者可见

使用道具 举报

ID:220721 发表于 2017-7-19 10:04 | 显示全部楼层
此帖仅作者可见

使用道具 举报

ID:1010716 发表于 2022-5-8 11:49 | 显示全部楼层
此帖仅作者可见

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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