找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机程序定义没怎么看懂,H,M,L没懂什么意思,还有就是为什么要乘100000,100...

[复制链接]
跳转到指定楼层
楼主
ID:551568 发表于 2019-6-1 00:50 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
void READS()
{
        uchar Mileage_H,Mileage_M,Mileage_L;
        delay(10);
        RADIUS=read_add(0x01);
        delay(10);
        SAFE_SPEED=read_add(0x02);

        delay(10);
        Mileage_H=read_add(0x03);
        delay(10);
        Mileage_M=read_add(0x04);
        delay(10);
        Mileage_L=read_add(0x05);

        Mileage=Mileage_H*100000+Mileage_M*1000+Mileage_L*10;
}  


//写初值
void SETS()
{
        delay(10);
        write_add(0x01,RADIUS);
        delay(10);
        write_add(0x02,SAFE_SPEED);

/*        Mileage_H=Mileage/10000;                         //123.4560
        Mileage_M=Mileage%10000/100;
        Mileage_L=Mileage%10000%100;          */
        delay(10);
        write_add(0x03,Mileage/100000);
        delay(10);
        write_add(0x04,Mileage%100000/1000);
        delay(10);
        write_add(0x05,Mileage%100000%1000/10);        
}
我是一个单片机小白,希望各位大佬相助一下,

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

使用道具 举报

沙发
ID:551568 发表于 2019-6-1 14:01 | 显示全部楼层
幻剑心 发表于 2019-6-1 03:59
程序不全。不知道为啥要这样做,可能和读取的位数有关,每次只能read_add两个字符。按照你给的代码。uchar ...

那我可以把全部程序发给你看一下吗  就这里不怎么懂什么意思   你的评论我觉得挺好的  但是好像有什么24小时评分限制   我明天再给评分  谢谢了  希望能回复一下   实在是单片机小白  想学习一下 很多不懂的
回复

使用道具 举报

板凳
ID:551568 发表于 2019-6-1 17:16 | 显示全部楼层
幻剑心 发表于 2019-6-1 16:30
可以,不过要晚上才有时间了。
  1. #include<reg52.h>          //调用单片机头文件
  2. #include "DS18B20.h"         
  3. #include <stdio.h>

  4. #define uchar unsigned char           //无符号字符型        宏定义                 变量范围0~255
  5. #define uint unsigned int           //无符号整型                 宏定义                  变量范围0~65535

  6. #include "Data.h"
  7. #include "DS1302.h"
  8. #include "AT24C02.h"

  9. sbit COUNT_IN=P3^2;                          //脉冲输入端口

  10. //定义1602相关管脚
  11. sbit rs=P1^4;                                //寄存器选择信号   H:数据     L:指令
  12. sbit en=P1^0;                         //片选信号  下降沿触发

  13. //键盘定义
  14. sbit K1=P3^4;        //设置时间
  15. sbit K3=P3^6;        //减按键
  16. sbit K2=P3^5;        //加按键
  17. sbit K4=P3^7;        //设置半径安全距离
  18. sbit BEEP=P3^0;           //蜂鸣器外接端口

  19. uint count;
  20. unsigned long Velocity,Mileage;               

  21. uchar code tab1[]={"  /  /     :    "}; //时间  年 月 日 时 分 星期       
  22. uchar code tab2[]={"  0.000km 00    "};        //里程 速度
  23. uchar code tab3[]={"Wheel Radius  cm"};           // 半径
  24. uchar code tab4[]={"Safe Speed  km/h"};                // 安全速度
  25. uchar code tab5[]={"Sec :           "};           //         在按键设置的时候会显示秒

  26. uchar Display_Buff[30];                                   //显示
  27.                                                   
  28. uchar Mode=0;
  29. uchar bike_set=0;
  30. uchar a;
  31. char RADIUS,SAFE_SPEED;
  32. bit LED_SEC;
  33. uchar before_sec;       

  34. //自定义字符RAM
  35. uchar code num[]={
  36.                                             0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//1         
  37.                                          0x1f,0x01,0x01,0x1f,0x10,0x10,0x1f,0x00,//2
  38.                                             0x1f,0x01,0x01,0x1f,0x01,0x01,0x1f,0x00,//3         
  39.                                                 0x11,0x11,0x11,0x1f,0x01,0x01,0x01,0x00,//4
  40.                                             0x1f,0x10,0x10,0x1f,0x01,0x01,0x1f,0x00,//5         
  41.                                             0x1f,0x10,0x10,0x1f,0x11,0x11,0x1f,0x00,//6
  42.                                     0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x00,//7           显示星期  依次为周一到周日
  43. };          
  44. void READS();
  45. void SETS();
  46. void delay(uint x)
  47. {
  48.         uint i,j;
  49.         for(i=0;i<x;i++)
  50.         for(j=0;j<110;j++);
  51. }
  52. void init()
  53. {
  54.         IT0=1;        //INT0负跳变触发       
  55.     TMOD=0x01;//定时器工作于方式1
  56.         TH0=0x3c;          //50ms
  57.         TL0=0xb0;
  58.         EA=1; //CPU开中断总允许
  59.         ET0=1;//开定时中断
  60.         EX0=1;//开外部INTO中断
  61.     TR0=1;//启动定时
  62. }
  63. /********液晶写入指令函数与写入数据函数,以后可调用**************/

  64. void write_1602com(uchar com)//****液晶写入指令函数****
  65. {
  66.         rs=0;//把寄存器置为指令
  67.         P0=com;//送入数据
  68.         delay(1);
  69.         en=1;//拉高使能端,为制造有效的下降沿做准备
  70.         delay(1);
  71.         en=0;//en由高变低,产生下降沿,液晶执行命令

  72. }


  73. void write_1602dat(uchar dat)//***液晶写入数据函数****
  74. {
  75.         rs=1;//把寄存器置为数据
  76.         P0=dat;//送入数据
  77.         delay(1);
  78.         en=1; //en置高电平,为制造下降沿做准备
  79.         delay(1);
  80.         en=0; //en由高变低,产生下降沿,液晶执行命令
  81. }

  82. void write_1602_Str(uchar *Str)
  83. {
  84.     uchar i = 0;
  85.    
  86.     while (Str[i])
  87.     {
  88.         write_1602dat(Str[i++]);
  89.     }
  90. }
  91. //自定义字符集         
  92. void Lcd_ram()                 //         液晶写数据。
  93. {
  94. uchar i,j,k=0;
  95. uchar temp=0x40;//设定CGRAM地址指令01000000(DB5~DB0含义)
  96. for(i=0;i<7;i++)  //自定义7个字符
  97. {      
  98.            for(j=0;j<8;j++)
  99.            {
  100.             write_1602com(temp+j);
  101.             write_1602dat(num[k]); //分别写入CGRAM的字模
  102.             k++;
  103.            }
  104.            temp=temp+8;
  105.         }
  106. }

  107. void lcd_init()//***液晶初始化函数****
  108. {
  109.         Lcd_ram();
  110.         write_1602com(0x38);//设置液晶8位数据工作模式,2行,5×7
  111.         write_1602com(0x0c);//整体显示、开光标、不闪烁
  112.         write_1602com(0x06);//设定输入方式屏不移位
  113.         write_1602com(0x01);//清除屏幕显示

  114.         write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
  115.         for(a=0;a<16;a++)
  116.         {
  117.                 write_1602dat(tab1[a]);//向液晶屏写固定符号部分
  118.         }
  119.         write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
  120.         for(a=0;a<16;a++)
  121.         {
  122.                 write_1602dat(tab2[a]);//写显示固定符号
  123.         }
  124. }

  125. void display()                                                                  //液晶显示部分
  126. {
  127.         if(Mode==0&&bike_set==0)
  128.         {
  129.                 //读时间
  130.                         Ds1302_Read_Time();
  131.                         //显示时间
  132.                         write_1602com(0x80);
  133.                         write_1602dat(0x30+time_buf1[1]/10);                 //显示设置
  134.                         write_1602dat(0x30+time_buf1[1]%10);
  135.                         write_1602com(0x80+3);
  136.                         write_1602dat(0x30+time_buf1[2]/10);
  137.                         write_1602dat(0x30+time_buf1[2]%10);
  138.                         write_1602com(0x80+6);
  139.                         write_1602dat(0x30+time_buf1[3]/10);
  140.                         write_1602dat(0x30+time_buf1[3]%10);
  141.                         write_1602com(0x80+9);
  142.                         write_1602dat(0x30+time_buf1[4]/10);
  143.                         write_1602dat(0x30+time_buf1[4]%10);
  144.                         write_1602com(0x80+12);
  145.                         write_1602dat(0x30+time_buf1[5]/10);
  146.                         write_1602dat(0x30+time_buf1[5]%10);
  147.                         write_1602com(0x80+15);
  148.                         write_1602dat(time_buf1[7]-1);       
  149.             
  150.             

  151.                         if(before_sec!=time_buf1[6])
  152.                         {
  153.                                 before_sec=time_buf1[6];
  154.                                 write_1602com(0x80+11);
  155.                                 write_1602dat(':');
  156.                                 LED_SEC=1;
  157.                         }
  158.                         if(LED_SEC==0)
  159.                         {
  160.                                 write_1602com(0x80+11);
  161.                                 write_1602dat(' ');       
  162.                         }

  163.                         write_1602com(0x80+0x40);
  164.                         if(Mileage/1000000==0)
  165.                         write_1602dat(' ');
  166.                         else
  167.                         write_1602dat(0x30+Mileage/1000000);//数字+0x30得到该数字的LCD1602显示码
  168.                         if(Mileage%1000000/100000==0)
  169.                         write_1602dat(' ');
  170.                         else       
  171.                         write_1602dat(0x30+Mileage%1000000/100000);//数字+0x30得到该数字的LCD1602显示码
  172.                         write_1602dat(0x30+Mileage%1000000%100000/10000);//数字+0x30得到该数字的LCD1602显示码
  173.                         write_1602com(0x80+0x40+4);
  174.                         write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//数字+30得到该数字的LCD1602显示码
  175.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//数字+30得到该数字的LCD1602显示码
  176.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//数字+30得到该数字的LCD1602显示码
  177.                         SETS();
  178.        
  179.                         write_1602com(0x80+0x40+10);
  180.                         write_1602dat(0x30+Velocity/10);
  181.                         write_1602dat(0x30+Velocity%10);//数字+30得到该数字的LCD1602显示码
  182.             
  183.             write_1602com(0x80+0x40+13);
  184.             sprintf(Display_Buff, "%dC", Temperature);
  185.             write_1602_Str(Display_Buff);
  186.         }
  187.         else if(Mode!=0)
  188.         {
  189.                 switch(Mode)
  190.                 {
  191.                         case 1:       
  192.                                 write_1602com(0x80+0x40);//显示固定符号写入位置
  193.                                 for(a=0;a<16;a++)
  194.                                 {
  195.                                         write_1602dat(tab5[a]);//写显示固定符号
  196.                                 }
  197.                                 write_1602com(0x80+0x40+14);
  198.                                 write_1602dat(0x30+time_buf1[6]/10);
  199.                                 write_1602dat(0x30+time_buf1[6]%10);       
  200.                                 write_1602com(0x0F);         //打开闪烁
  201.                                 write_1602com(0x80+1);
  202.                                 break;                                                  
  203.                         case 2:
  204.                                 write_1602com(0x80+4);
  205.                                 break;
  206.                         case 3:
  207.                                 write_1602com(0x80+7);
  208.                                 break;
  209.                         case 4:
  210.                                 write_1602com(0x80+10);
  211.                                 break;
  212.                         case 5:
  213.                                 write_1602com(0x80+13);
  214.                                 break;
  215.                         case 6:
  216.                                 write_1602com(0x80+0x40+15);
  217.                                 break;
  218.                         case 7:
  219.                                 write_1602com(0x80+15);
  220.                                 break;
  221.                         case 8:
  222.                                 write_1602com(0x0c);
  223.                                 write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
  224.                                 for(a=0;a<16;a++)
  225.                                 {
  226.                                         write_1602dat(tab1[a]);//向液晶屏写固定符号部分
  227.                                 }
  228.                                 write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
  229.                                 for(a=0;a<16;a++)
  230.                                 {
  231.                                         write_1602dat(tab2[a]);//写显示固定符号
  232.                                 }
  233.                                 break;
  234.                 }
  235.         }
  236.         else if(bike_set!=0)
  237.         {
  238.                 switch(bike_set)
  239.                 {
  240.                         case 1:       
  241.                                 write_1602com(0x80);//显示固定符号写入位置
  242.                                 for(a=0;a<16;a++)
  243.                                 {
  244.                                         write_1602dat(tab3[a]);//写显示固定符号
  245.                                 }
  246.                                 write_1602com(0x80+0x40);//显示固定符号写入位置
  247.                                 for(a=0;a<16;a++)
  248.                                 {
  249.                                         write_1602dat(tab4[a]);//写显示固定符号
  250.                                 }
  251.                                 write_1602com(0x80+12);
  252.                                 write_1602dat(0x30+RADIUS/10);                   //车轮半径
  253.                                 write_1602dat(0x30+RADIUS%10);
  254.                                 write_1602com(0x80+0x40+10);
  255.                                 write_1602dat(0x30+SAFE_SPEED/10);                   //安全速度
  256.                                 write_1602dat(0x30+SAFE_SPEED%10);       
  257.                                 write_1602com(0x0F);         //打开光标闪烁
  258.                                 write_1602com(0x80+13);
  259.                                 break;                                                  
  260.                         case 2:
  261.                                 write_1602com(0x80+0x40+11);
  262.                                 break;
  263.                         case 3:
  264.                                 write_1602com(0x0c);
  265.                                 write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
  266.                                 for(a=0;a<16;a++)
  267.                                 {
  268.                                         write_1602dat(tab1[a]);//向液晶屏写固定符号部分
  269.                                 }
  270.                                 write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
  271.                                 for(a=0;a<16;a++)
  272.                                 {
  273.                                         write_1602dat(tab2[a]);//写显示固定符号
  274.                                 }
  275.                                 break;
  276.                 }
  277.         }       
  278. }

  279. void KEY()
  280. {       
  281.         if(bike_set==0&&K1==0)                //按键部分与蜂鸣器
  282.         {
  283.                 delay(20);
  284.                 if(bike_set==0&&K1==0)
  285.                 {
  286.                         BEEP=0;
  287.                         delay(50);
  288.                         BEEP=1;
  289.                         Mode++;
  290.                         display();
  291.                         if(Mode>=8)
  292.                         {
  293.                                 Mode=0;
  294.                                 Ds1302_Write_Time();
  295.                         }
  296.                 }
  297.                 while(bike_set==0&&K1==0);
  298.         }
  299.         if(K4==0&&Mode==0)
  300.         {
  301.                 delay(20);
  302.                 if(K4==0&&Mode==0)
  303.                 {
  304.                         BEEP=0;
  305.                         delay(50);
  306.                         BEEP=1;
  307.                         bike_set++;
  308.                         display();
  309.                         if(bike_set>=3)
  310.                         {
  311.                                 bike_set=0;
  312.                                 SETS();
  313.                         }
  314.                 }
  315.                 while(Mode==0&&K4==0);
  316.         }

  317.         //+
  318.         if(K2==0&&(Mode!=0||bike_set!=0))
  319.         {
  320.                 delay(20);
  321.                 //调时
  322.                 if(K2==0&&(Mode!=0||bike_set!=0))
  323.                 {
  324.                         BEEP=0;
  325.                         delay(50);
  326.                         BEEP=1;       
  327.                         switch(Mode)
  328.                         {
  329.                                 case 1:
  330.                                         time_buf1[1]++;
  331.                                         if(time_buf1[1]>=100)
  332.                                                 time_buf1[1]=0;
  333.                                         write_1602com(0x80);
  334.                                         write_1602dat(0x30+time_buf1[1]/10);
  335.                                         write_1602dat(0x30+time_buf1[1]%10);
  336.                                         write_1602com(0x80+1);
  337.                                         break;
  338.                                 case 2:
  339.                                         time_buf1[2]++;
  340.                                         if(time_buf1[2]>=13)
  341.                                                 time_buf1[2]=1;
  342.                                         write_1602com(0x80+3);
  343.                                         write_1602dat(0x30+time_buf1[2]/10);
  344.                                         write_1602dat(0x30+time_buf1[2]%10);
  345.                                         write_1602com(0x80+4);
  346.                                         break;
  347.                                 case 3:
  348.                                         time_buf1[3]++;
  349.                                         if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
  350.                                                 time_buf1[3]=1;
  351.                                         write_1602com(0x80+6);
  352.                                         write_1602dat(0x30+time_buf1[3]/10);
  353.                                         write_1602dat(0x30+time_buf1[3]%10);
  354.                                         write_1602com(0x80+7);
  355.                                         break;
  356.                                 case 4:
  357.                                         time_buf1[4]++;
  358.                                         if(time_buf1[4]>=24)
  359.                                                 time_buf1[4]=0;
  360.                                         write_1602com(0x80+9);
  361.                                         write_1602dat(0x30+time_buf1[4]/10);
  362.                                         write_1602dat(0x30+time_buf1[4]%10);
  363.                                         write_1602com(0x80+10);
  364.                                         break;
  365.                                 case 5:
  366.                                         time_buf1[5]++;
  367.                                         if(time_buf1[5]>=60)
  368.                                                 time_buf1[5]=0;
  369.                                         write_1602com(0x80+12);
  370.                                         write_1602dat(0x30+time_buf1[5]/10);
  371.                                         write_1602dat(0x30+time_buf1[5]%10);
  372.                                         write_1602com(0x80+13);
  373.                                         break;
  374.                                 case 6:
  375.                                         time_buf1[6]++;
  376.                                         if(time_buf1[6]>=60)
  377.                                                 time_buf1[6]=0;
  378.                                         write_1602com(0x80+0x40+14);
  379.                                         write_1602dat(0x30+time_buf1[6]/10);
  380.                                         write_1602dat(0x30+time_buf1[6]%10);
  381.                                         write_1602com(0x80+0x40+15);
  382.                                         break;
  383.                                 case 7:
  384.                                         time_buf1[7]++;
  385.                                         if(time_buf1[7]>=8)
  386.                                                 time_buf1[7]=1;
  387.                                         write_1602com(0x80+15);
  388.                                         write_1602dat(time_buf1[7]-1);
  389.                                         write_1602com(0x80+15);
  390.                                         break;
  391.                         }
  392.                         switch(bike_set)
  393.                         {
  394.                                 case 1:
  395.                                         RADIUS++;
  396.                                         if(RADIUS>=71)
  397.                                         RADIUS=0;
  398.                                         write_1602com(0x80+12);
  399.                                         write_1602dat(0x30+RADIUS/10);
  400.                                         write_1602dat(0x30+RADIUS%10);
  401.                                         write_1602com(0x80+13);
  402.                                         break;
  403.                                 case 2:
  404.                                         SAFE_SPEED++;
  405.                                         if(SAFE_SPEED>=100)
  406.                                         SAFE_SPEED=0;
  407.                                         write_1602com(0x80+0x40+10);
  408.                                         write_1602dat(0x30+SAFE_SPEED/10);
  409.                                         write_1602dat(0x30+SAFE_SPEED%10);
  410.                                         write_1602com(0x80+0x40+11);
  411.                                         break;
  412.                         }
  413.                 }
  414.                 while(K2==0);
  415.         }

  416.         //-
  417.         if(K3==0&&(Mode!=0||bike_set!=0))
  418.         {
  419.                 delay(20);
  420.                 //调时
  421.                 if(K3==0&&(Mode!=0||bike_set!=0))
  422.                 {
  423.                         BEEP=0;
  424.                         delay(50);
  425.                         BEEP=1;
  426.                         switch(Mode)
  427.                         {
  428.                                 case 1:
  429.                                         time_buf1[1]--;
  430.                                         if(time_buf1[1]<0)
  431.                                                 time_buf1[1]=99;
  432.                                         write_1602com(0x80);
  433.                                         write_1602dat(0x30+time_buf1[1]/10);
  434.                                         write_1602dat(0x30+time_buf1[1]%10);
  435.                                         write_1602com(0x80+1);
  436.                                         break;
  437.                                 case 2:
  438.                                         time_buf1[2]--;
  439.                                         if(time_buf1[2]<=0)
  440.                                                 time_buf1[2]=12;
  441.                                         write_1602com(0x80+3);
  442.                                         write_1602dat(0x30+time_buf1[2]/10);
  443.                                         write_1602dat(0x30+time_buf1[2]%10);
  444.                                         write_1602com(0x80+4);
  445.                                         break;
  446.                                 case 3:
  447.                                         time_buf1[3]--;
  448.                                         if(time_buf1[3]<=0)
  449.                                                 time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
  450.                                         write_1602com(0x80+6);
  451.                                         write_1602dat(0x30+time_buf1[3]/10);
  452.                                         write_1602dat(0x30+time_buf1[3]%10);
  453.                                         write_1602com(0x80+7);
  454.                                         break;
  455.                                 case 4:
  456.                                         time_buf1[4]--;
  457.                                         if(time_buf1[4]<0)
  458.                                                 time_buf1[4]=23;
  459.                                         write_1602com(0x80+9);
  460.                                         write_1602dat(0x30+time_buf1[4]/10);
  461.                                         write_1602dat(0x30+time_buf1[4]%10);
  462.                                         write_1602com(0x80+10);
  463.                                         break;
  464.                                 case 5:
  465.                                         time_buf1[5]--;
  466.                                         if(time_buf1[5]<0)
  467.                                                 time_buf1[5]=59;
  468.                                         write_1602com(0x80+12);
  469.                                         write_1602dat(0x30+time_buf1[5]/10);
  470.                                         write_1602dat(0x30+time_buf1[5]%10);
  471.                                         write_1602com(0x80+13);
  472.                                         break;
  473.                                 case 6:
  474.                                         time_buf1[6]--;
  475.                                         if(time_buf1[6]<0)
  476.                                                 time_buf1[6]=59;
  477.                                         write_1602com(0x80+0x40+14);
  478.                                         write_1602dat(0x30+time_buf1[6]/10);
  479.                                         write_1602dat(0x30+time_buf1[6]%10);
  480.                                         write_1602com(0x80+0x40+15);
  481.                                         break;
  482.                                 case 7:
  483.                                         time_buf1[7]--;
  484.                                         if(time_buf1[7]<1)
  485.                                                 time_buf1[7]=7;
  486.                                         write_1602com(0x80+15);
  487.                                         write_1602dat(time_buf1[7]-1);
  488.                                         write_1602com(0x80+15);
  489.                                         break;
  490.                         }
  491.                         switch(bike_set)
  492.                         {
  493.                                 case 1:
  494.                                         RADIUS--;
  495.                                         if(RADIUS<0)
  496.                                         RADIUS=70;
  497.                                         write_1602com(0x80+12);
  498.                                         write_1602dat(0x30+RADIUS/10);
  499.                                         write_1602dat(0x30+RADIUS%10);
  500.                                         write_1602com(0x80+13);
  501.                                         break;
  502.                                 case 2:
  503.                                         SAFE_SPEED--;
  504.                                         if(SAFE_SPEED<0)
  505.                                         SAFE_SPEED=99;
  506.                                         write_1602com(0x80+0x40+10);
  507.                                         write_1602dat(0x30+SAFE_SPEED/10);
  508.                                         write_1602dat(0x30+SAFE_SPEED%10);
  509.                                         write_1602com(0x80+0x40+11);
  510.                                         break;
  511.                         }
  512.                 }
  513.                 while(K3==0);
  514.         }       
  515.         if(K2==0&&K3==0&&Mode==0&bike_set==0)
  516.         {
  517.                 BEEP=0;
  518.                 delay(100);
  519.                 BEEP=1;
  520.                 delay(100);
  521.                 BEEP=0;
  522.                 delay(100);
  523.                 BEEP=1;
  524.                 delay(100);
  525.                 Mileage=0;
  526.                 SETS();
  527.                 while(K2==0&&K3==0);
  528.         }
  529. }
  530. void BJ_SAFE()
  531. {
  532.         if(Velocity>SAFE_SPEED)
  533.         {
  534.                 BEEP=0;                                                                 //蜂鸣器响
  535.         }
  536.         else
  537.         {
  538.                 BEEP=1;                                                                  //蜂鸣器不响
  539.         }
  540. }

  541. void main()
  542. {
  543.         //初始化
  544.         Ds1302_Init();
  545.         lcd_init();
  546.         initeeprom();
  547.         //读取初始参数
  548.         READS();
  549.         //定时器初始化
  550. //        InitTimer0();
  551.         init();
  552.         lcd_init();
  553.         before_sec=time_buf1[6];
  554.    
  555.     Temp_Get(); // 第一次采集是错误数据
  556.     delay(200);
  557.     Temp_Get(); // 第一次采集是错误数据
  558.     delay(200);
  559.     Temp_Get(); // 第一次采集是错误数据
  560.     delay(200);
  561.     Temp_Get(); // 第一次采集是错误数据
  562.     delay(200);
  563.     Temp_Get(); // 第一次采集是错误数据
  564.    
  565.         while(1)                          //等待定时器中断
  566.         {
  567.                 if(Mode==0&&bike_set==0)
  568.                 {
  569.                         display();
  570.                         BJ_SAFE();
  571.                 }
  572.                 KEY();
  573.         
  574.         Temp_Handle();
  575.         }
  576. }

  577. void EXINT0() interrupt 0
  578. {
  579.         count++;
  580. }

  581. void time0() interrupt 1
  582. {
  583.         uchar m,n;
  584.         TH0=0x3c;
  585.         TL0=0xb0;         //50ms
  586.         m++;
  587.         if(LED_SEC==1)
  588.         {
  589.                 n++;
  590.                 if(n>=10)                 
  591.                 {
  592.                         n=0;
  593.                         LED_SEC=0;
  594.                 }
  595.         }       
  596.         if(m>=10)
  597.         {
  598.         m=0;
  599.                                                                                   
  600.          Mileage=Mileage+count*2*3.14*RADIUS/20/10;//里程数mileage=里程+记数值*轮周长/脉冲数/10
  601.           Velocity=count*2*3.14*RADIUS/100000*3600*2/20;//总定时500ms
  602.           count=0;

  603.           

  604.         }
  605.         }                                 // 处理数据,并显示里程和速度

  606. //读初值
  607. void READS()
  608. {
  609.         uchar Mileage_H,Mileage_M,Mileage_L;
  610.         delay(10);
  611.         RADIUS=read_add(0x01);
  612.         delay(10);
  613.         SAFE_SPEED=read_add(0x02);

  614.         delay(10);
  615.         Mileage_H=read_add(0x03);
  616.         delay(10);
  617.         Mileage_M=read_add(0x04);
  618.         delay(10);
  619.         Mileage_L=read_add(0x05);

  620.         Mileage=Mileage_H*100000+Mileage_M*1000+Mileage_L*10;
  621. }  


  622. //写初值
  623. void SETS()
  624. {
  625.         delay(10);
  626.         write_add(0x01,RADIUS);
  627.         delay(10);
  628.         write_add(0x02,SAFE_SPEED);

  629. /*        Mileage_H=Mileage/10000;                         //123.4560
  630.         Mileage_M=Mileage%10000/100;
  631.         Mileage_L=Mileage%10000%100;          */
  632.         delay(10);
  633.         write_add(0x03,Mileage/100000);
  634.         delay(10);
  635.         write_add(0x04,Mileage%100000/1000);
  636.         delay(10);
  637.         write_add(0x05,Mileage%100000%1000/10);       
  638. }
复制代码

这是主程序,这个程序主要用来测速,用的是光电传感器,通过定时记脉冲来进行测速,用了一个外部存储器,就是这里不怎么懂,希望大佬帮下忙,谢谢
回复

使用道具 举报

地板
ID:551568 发表于 2019-6-1 18:37 | 显示全部楼层
幻剑心 发表于 2019-6-1 16:30
可以,不过要晚上才有时间了。

主要是还是太多不懂了,之前发了一份,不知道发成功没用,我重新发一下
  1. #include<reg52.h>          //调用单片机头文件
  2. #include "DS18B20.h"         
  3. #include <stdio.h>

  4. #define uchar unsigned char           //无符号字符型        宏定义                 变量范围0~255
  5. #define uint unsigned int           //无符号整型                 宏定义                  变量范围0~65535

  6. #include "Data.h"
  7. #include "DS1302.h"
  8. #include "AT24C02.h"

  9. sbit COUNT_IN=P3^2;                          //脉冲输入端口

  10. //定义1602相关管脚
  11. sbit rs=P1^4;                                //寄存器选择信号   H:数据     L:指令
  12. sbit en=P1^0;                         //片选信号  下降沿触发

  13. //键盘定义
  14. sbit K1=P3^4;        //设置时间
  15. sbit K3=P3^6;        //减按键
  16. sbit K2=P3^5;        //加按键
  17. sbit K4=P3^7;        //设置半径安全距离
  18. sbit BEEP=P3^0;           //蜂鸣器外接端口

  19. uint count;
  20. unsigned long Velocity,Mileage;               

  21. uchar code tab1[]={"  /  /     :    "}; //时间  年 月 日 时 分 星期       
  22. uchar code tab2[]={"  0.000km 00    "};        //里程 速度
  23. uchar code tab3[]={"Wheel Radius  cm"};           // 半径
  24. uchar code tab4[]={"Safe Speed  km/h"};                // 安全速度
  25. uchar code tab5[]={"Sec :           "};           //         在按键设置的时候会显示秒

  26. uchar Display_Buff[30];                                   //显示
  27.                                                   
  28. uchar Mode=0;
  29. uchar bike_set=0;
  30. uchar a;
  31. char RADIUS,SAFE_SPEED;
  32. bit LED_SEC;
  33. uchar before_sec;       

  34. //自定义字符RAM
  35. uchar code num[]={
  36.                                             0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//1         
  37.                                          0x1f,0x01,0x01,0x1f,0x10,0x10,0x1f,0x00,//2
  38.                                             0x1f,0x01,0x01,0x1f,0x01,0x01,0x1f,0x00,//3         
  39.                                                 0x11,0x11,0x11,0x1f,0x01,0x01,0x01,0x00,//4
  40.                                             0x1f,0x10,0x10,0x1f,0x01,0x01,0x1f,0x00,//5         
  41.                                             0x1f,0x10,0x10,0x1f,0x11,0x11,0x1f,0x00,//6
  42.                                     0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x00,//7           显示星期  依次为周一到周日
  43. };          
  44. void READS();
  45. void SETS();
  46. void delay(uint x)
  47. {
  48.         uint i,j;
  49.         for(i=0;i<x;i++)
  50.         for(j=0;j<110;j++);
  51. }
  52. void init()
  53. {
  54.         IT0=1;        //INT0负跳变触发       
  55.     TMOD=0x01;//定时器工作于方式1
  56.         TH0=0x3c;          //50ms
  57.         TL0=0xb0;
  58.         EA=1; //CPU开中断总允许
  59.         ET0=1;//开定时中断
  60.         EX0=1;//开外部INTO中断
  61.     TR0=1;//启动定时
  62. }
  63. /********液晶写入指令函数与写入数据函数,以后可调用**************/

  64. void write_1602com(uchar com)//****液晶写入指令函数****
  65. {
  66.         rs=0;//把寄存器置为指令
  67.         P0=com;//送入数据
  68.         delay(1);
  69.         en=1;//拉高使能端,为制造有效的下降沿做准备
  70.         delay(1);
  71.         en=0;//en由高变低,产生下降沿,液晶执行命令

  72. }


  73. void write_1602dat(uchar dat)//***液晶写入数据函数****
  74. {
  75.         rs=1;//把寄存器置为数据
  76.         P0=dat;//送入数据
  77.         delay(1);
  78.         en=1; //en置高电平,为制造下降沿做准备
  79.         delay(1);
  80.         en=0; //en由高变低,产生下降沿,液晶执行命令
  81. }

  82. void write_1602_Str(uchar *Str)
  83. {
  84.     uchar i = 0;
  85.    
  86.     while (Str[i])
  87.     {
  88.         write_1602dat(Str[i++]);
  89.     }
  90. }
  91. //自定义字符集         
  92. void Lcd_ram()                 //         液晶写数据。
  93. {
  94. uchar i,j,k=0;
  95. uchar temp=0x40;//设定CGRAM地址指令01000000(DB5~DB0含义)
  96. for(i=0;i<7;i++)  //自定义7个字符
  97. {      
  98.            for(j=0;j<8;j++)
  99.            {
  100.             write_1602com(temp+j);
  101.             write_1602dat(num[k]); //分别写入CGRAM的字模
  102.             k++;
  103.            }
  104.            temp=temp+8;
  105.         }
  106. }

  107. void lcd_init()//***液晶初始化函数****
  108. {
  109.         Lcd_ram();
  110.         write_1602com(0x38);//设置液晶8位数据工作模式,2行,5×7
  111.         write_1602com(0x0c);//整体显示、开光标、不闪烁
  112.         write_1602com(0x06);//设定输入方式屏不移位
  113.         write_1602com(0x01);//清除屏幕显示

  114.         write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
  115.         for(a=0;a<16;a++)
  116.         {
  117.                 write_1602dat(tab1[a]);//向液晶屏写固定符号部分
  118.         }
  119.         write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
  120.         for(a=0;a<16;a++)
  121.         {
  122.                 write_1602dat(tab2[a]);//写显示固定符号
  123.         }
  124. }

  125. void display()                                                                  //液晶显示部分
  126. {
  127.         if(Mode==0&&bike_set==0)
  128.         {
  129.                 //读时间
  130.                         Ds1302_Read_Time();
  131.                         //显示时间
  132.                         write_1602com(0x80);
  133.                         write_1602dat(0x30+time_buf1[1]/10);                 //显示设置
  134.                         write_1602dat(0x30+time_buf1[1]%10);
  135.                         write_1602com(0x80+3);
  136.                         write_1602dat(0x30+time_buf1[2]/10);
  137.                         write_1602dat(0x30+time_buf1[2]%10);
  138.                         write_1602com(0x80+6);
  139.                         write_1602dat(0x30+time_buf1[3]/10);
  140.                         write_1602dat(0x30+time_buf1[3]%10);
  141.                         write_1602com(0x80+9);
  142.                         write_1602dat(0x30+time_buf1[4]/10);
  143.                         write_1602dat(0x30+time_buf1[4]%10);
  144.                         write_1602com(0x80+12);
  145.                         write_1602dat(0x30+time_buf1[5]/10);
  146.                         write_1602dat(0x30+time_buf1[5]%10);
  147.                         write_1602com(0x80+15);
  148.                         write_1602dat(time_buf1[7]-1);       
  149.             
  150.             

  151.                         if(before_sec!=time_buf1[6])
  152.                         {
  153.                                 before_sec=time_buf1[6];
  154.                                 write_1602com(0x80+11);
  155.                                 write_1602dat(':');
  156.                                 LED_SEC=1;
  157.                         }
  158.                         if(LED_SEC==0)
  159.                         {
  160.                                 write_1602com(0x80+11);
  161.                                 write_1602dat(' ');       
  162.                         }

  163.                         write_1602com(0x80+0x40);
  164.                         if(Mileage/1000000==0)
  165.                         write_1602dat(' ');
  166.                         else
  167.                         write_1602dat(0x30+Mileage/1000000);//数字+0x30得到该数字的LCD1602显示码
  168.                         if(Mileage%1000000/100000==0)
  169.                         write_1602dat(' ');
  170.                         else       
  171.                         write_1602dat(0x30+Mileage%1000000/100000);//数字+0x30得到该数字的LCD1602显示码
  172.                         write_1602dat(0x30+Mileage%1000000%100000/10000);//数字+0x30得到该数字的LCD1602显示码
  173.                         write_1602com(0x80+0x40+4);
  174.                         write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//数字+30得到该数字的LCD1602显示码
  175.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//数字+30得到该数字的LCD1602显示码
  176.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//数字+30得到该数字的LCD1602显示码
  177.                         SETS();
  178.        
  179.                         write_1602com(0x80+0x40+10);
  180.                         write_1602dat(0x30+Velocity/10);
  181.                         write_1602dat(0x30+Velocity%10);//数字+30得到该数字的LCD1602显示码
  182.             
  183.             write_1602com(0x80+0x40+13);
  184.             sprintf(Display_Buff, "%dC", Temperature);
  185.             write_1602_Str(Display_Buff);
  186.         }
  187.         else if(Mode!=0)
  188.         {
  189.                 switch(Mode)
  190.                 {
  191.                         case 1:       
  192.                                 write_1602com(0x80+0x40);//显示固定符号写入位置
  193.                                 for(a=0;a<16;a++)
  194.                                 {
  195.                                         write_1602dat(tab5[a]);//写显示固定符号
  196.                                 }
  197.                                 write_1602com(0x80+0x40+14);
  198.                                 write_1602dat(0x30+time_buf1[6]/10);
  199.                                 write_1602dat(0x30+time_buf1[6]%10);       
  200.                                 write_1602com(0x0F);         //打开闪烁
  201.                                 write_1602com(0x80+1);
  202.                                 break;                                                  
  203.                         case 2:
  204.                                 write_1602com(0x80+4);
  205.                                 break;
  206.                         case 3:
  207.                                 write_1602com(0x80+7);
  208.                                 break;
  209.                         case 4:
  210.                                 write_1602com(0x80+10);
  211.                                 break;
  212.                         case 5:
  213.                                 write_1602com(0x80+13);
  214.                                 break;
  215.                         case 6:
  216.                                 write_1602com(0x80+0x40+15);
  217.                                 break;
  218.                         case 7:
  219.                                 write_1602com(0x80+15);
  220.                                 break;
  221.                         case 8:
  222.                                 write_1602com(0x0c);
  223.                                 write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
  224.                                 for(a=0;a<16;a++)
  225.                                 {
  226.                                         write_1602dat(tab1[a]);//向液晶屏写固定符号部分
  227.                                 }
  228.                                 write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
  229.                                 for(a=0;a<16;a++)
  230.                                 {
  231.                                         write_1602dat(tab2[a]);//写显示固定符号
  232.                                 }
  233.                                 break;
  234.                 }
  235.         }
  236.         else if(bike_set!=0)
  237.         {
  238.                 switch(bike_set)
  239.                 {
  240.                         case 1:       
  241.                                 write_1602com(0x80);//显示固定符号写入位置
  242.                                 for(a=0;a<16;a++)
  243.                                 {
  244.                                         write_1602dat(tab3[a]);//写显示固定符号
  245.                                 }
  246.                                 write_1602com(0x80+0x40);//显示固定符号写入位置
  247.                                 for(a=0;a<16;a++)
  248.                                 {
  249.                                         write_1602dat(tab4[a]);//写显示固定符号
  250.                                 }
  251.                                 write_1602com(0x80+12);
  252.                                 write_1602dat(0x30+RADIUS/10);                   //车轮半径
  253.                                 write_1602dat(0x30+RADIUS%10);
  254.                                 write_1602com(0x80+0x40+10);
  255.                                 write_1602dat(0x30+SAFE_SPEED/10);                   //安全速度
  256.                                 write_1602dat(0x30+SAFE_SPEED%10);       
  257.                                 write_1602com(0x0F);         //打开光标闪烁
  258.                                 write_1602com(0x80+13);
  259.                                 break;                                                  
  260.                         case 2:
  261.                                 write_1602com(0x80+0x40+11);
  262.                                 break;
  263.                         case 3:
  264.                                 write_1602com(0x0c);
  265.                                 write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
  266.                                 for(a=0;a<16;a++)
  267.                                 {
  268.                                         write_1602dat(tab1[a]);//向液晶屏写固定符号部分
  269.                                 }
  270.                                 write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
  271.                                 for(a=0;a<16;a++)
  272.                                 {
  273.                                         write_1602dat(tab2[a]);//写显示固定符号
  274.                                 }
  275.                                 break;
  276.                 }
  277.         }       
  278. }

  279. void KEY()
  280. {       
  281.         if(bike_set==0&&K1==0)                //按键部分与蜂鸣器
  282.         {
  283.                 delay(20);
  284.                 if(bike_set==0&&K1==0)
  285.                 {
  286.                         BEEP=0;
  287.                         delay(50);
  288.                         BEEP=1;
  289.                         Mode++;
  290.                         display();
  291.                         if(Mode>=8)
  292.                         {
  293.                                 Mode=0;
  294.                                 Ds1302_Write_Time();
  295.                         }
  296.                 }
  297.                 while(bike_set==0&&K1==0);
  298.         }
  299.         if(K4==0&&Mode==0)
  300.         {
  301.                 delay(20);
  302.                 if(K4==0&&Mode==0)
  303.                 {
  304.                         BEEP=0;
  305.                         delay(50);
  306.                         BEEP=1;
  307.                         bike_set++;
  308.                         display();
  309.                         if(bike_set>=3)
  310.                         {
  311.                                 bike_set=0;
  312.                                 SETS();
  313.                         }
  314.                 }
  315.                 while(Mode==0&&K4==0);
  316.         }

  317.         //+
  318.         if(K2==0&&(Mode!=0||bike_set!=0))
  319.         {
  320.                 delay(20);
  321.                 //调时
  322.                 if(K2==0&&(Mode!=0||bike_set!=0))
  323.                 {
  324.                         BEEP=0;
  325.                         delay(50);
  326.                         BEEP=1;       
  327.                         switch(Mode)
  328.                         {
  329.                                 case 1:
  330.                                         time_buf1[1]++;
  331.                                         if(time_buf1[1]>=100)
  332.                                                 time_buf1[1]=0;
  333.                                         write_1602com(0x80);
  334.                                         write_1602dat(0x30+time_buf1[1]/10);
  335.                                         write_1602dat(0x30+time_buf1[1]%10);
  336.                                         write_1602com(0x80+1);
  337.                                         break;
  338.                                 case 2:
  339.                                         time_buf1[2]++;
  340.                                         if(time_buf1[2]>=13)
  341.                                                 time_buf1[2]=1;
  342.                                         write_1602com(0x80+3);
  343.                                         write_1602dat(0x30+time_buf1[2]/10);
  344.                                         write_1602dat(0x30+time_buf1[2]%10);
  345.                                         write_1602com(0x80+4);
  346.                                         break;
  347.                                 case 3:
  348.                                         time_buf1[3]++;
  349.                                         if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
  350.                                                 time_buf1[3]=1;
  351.                                         write_1602com(0x80+6);
  352.                                         write_1602dat(0x30+time_buf1[3]/10);
  353.                                         write_1602dat(0x30+time_buf1[3]%10);
  354.                                         write_1602com(0x80+7);
  355.                                         break;
  356.                                 case 4:
  357.                                         time_buf1[4]++;
  358.                                         if(time_buf1[4]>=24)
  359.                                                 time_buf1[4]=0;
  360.                                         write_1602com(0x80+9);
  361.                                         write_1602dat(0x30+time_buf1[4]/10);
  362.                                         write_1602dat(0x30+time_buf1[4]%10);
  363.                                         write_1602com(0x80+10);
  364.                                         break;
  365.                                 case 5:
  366.                                         time_buf1[5]++;
  367.                                         if(time_buf1[5]>=60)
  368.                                                 time_buf1[5]=0;
  369.                                         write_1602com(0x80+12);
  370.                                         write_1602dat(0x30+time_buf1[5]/10);
  371.                                         write_1602dat(0x30+time_buf1[5]%10);
  372.                                         write_1602com(0x80+13);
  373.                                         break;
  374.                                 case 6:
  375.                                         time_buf1[6]++;
  376.                                         if(time_buf1[6]>=60)
  377.                                                 time_buf1[6]=0;
  378.                                         write_1602com(0x80+0x40+14);
  379.                                         write_1602dat(0x30+time_buf1[6]/10);
  380.                                         write_1602dat(0x30+time_buf1[6]%10);
  381.                                         write_1602com(0x80+0x40+15);
  382.                                         break;
  383.                                 case 7:
  384.                                         time_buf1[7]++;
  385.                                         if(time_buf1[7]>=8)
  386.                                                 time_buf1[7]=1;
  387.                                         write_1602com(0x80+15);
  388.                                         write_1602dat(time_buf1[7]-1);
  389.                                         write_1602com(0x80+15);
  390.                                         break;
  391.                         }
  392.                         switch(bike_set)
  393.                         {
  394.                                 case 1:
  395.                                         RADIUS++;
  396.                                         if(RADIUS>=71)
  397.                                         RADIUS=0;
  398.                                         write_1602com(0x80+12);
  399.                                         write_1602dat(0x30+RADIUS/10);
  400.                                         write_1602dat(0x30+RADIUS%10);
  401.                                         write_1602com(0x80+13);
  402.                                         break;
  403.                                 case 2:
  404.                                         SAFE_SPEED++;
  405.                                         if(SAFE_SPEED>=100)
  406.                                         SAFE_SPEED=0;
  407.                                         write_1602com(0x80+0x40+10);
  408.                                         write_1602dat(0x30+SAFE_SPEED/10);
  409.                                         write_1602dat(0x30+SAFE_SPEED%10);
  410.                                         write_1602com(0x80+0x40+11);
  411.                                         break;
  412.                         }
  413.                 }
  414.                 while(K2==0);
  415.         }

  416.         //-
  417.         if(K3==0&&(Mode!=0||bike_set!=0))
  418.         {
  419.                 delay(20);
  420.                 //调时
  421.                 if(K3==0&&(Mode!=0||bike_set!=0))
  422.                 {
  423.                         BEEP=0;
  424.                         delay(50);
  425.                         BEEP=1;
  426.                         switch(Mode)
  427.                         {
  428.                                 case 1:
  429.                                         time_buf1[1]--;
  430.                                         if(time_buf1[1]<0)
  431.                                                 time_buf1[1]=99;
  432.                                         write_1602com(0x80);
  433.                                         write_1602dat(0x30+time_buf1[1]/10);
  434.                                         write_1602dat(0x30+time_buf1[1]%10);
  435.                                         write_1602com(0x80+1);
  436.                                         break;
  437.                                 case 2:
  438.                                         time_buf1[2]--;
  439.                                         if(time_buf1[2]<=0)
  440.                                                 time_buf1[2]=12;
  441.                                         write_1602com(0x80+3);
  442.                                         write_1602dat(0x30+time_buf1[2]/10);
  443.                                         write_1602dat(0x30+time_buf1[2]%10);
  444.                                         write_1602com(0x80+4);
  445.                                         break;
  446.                                 case 3:
  447.                                         time_buf1[3]--;
  448.                                         if(time_buf1[3]<=0)
  449.                                                 time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
  450.                                         write_1602com(0x80+6);
  451.                                         write_1602dat(0x30+time_buf1[3]/10);
  452.                                         write_1602dat(0x30+time_buf1[3]%10);
  453.                                         write_1602com(0x80+7);
  454.                                         break;
  455.                                 case 4:
  456.                                         time_buf1[4]--;
  457.                                         if(time_buf1[4]<0)
  458.                                                 time_buf1[4]=23;
  459.                                         write_1602com(0x80+9);
  460.                                         write_1602dat(0x30+time_buf1[4]/10);
  461.                                         write_1602dat(0x30+time_buf1[4]%10);
  462.                                         write_1602com(0x80+10);
  463.                                         break;
  464.                                 case 5:
  465.                                         time_buf1[5]--;
  466.                                         if(time_buf1[5]<0)
  467.                                                 time_buf1[5]=59;
  468.                                         write_1602com(0x80+12);
  469.                                         write_1602dat(0x30+time_buf1[5]/10);
  470.                                         write_1602dat(0x30+time_buf1[5]%10);
  471.                                         write_1602com(0x80+13);
  472.                                         break;
  473.                                 case 6:
  474.                                         time_buf1[6]--;
  475.                                         if(time_buf1[6]<0)
  476.                                                 time_buf1[6]=59;
  477.                                         write_1602com(0x80+0x40+14);
  478.                                         write_1602dat(0x30+time_buf1[6]/10);
  479.                                         write_1602dat(0x30+time_buf1[6]%10);
  480.                                         write_1602com(0x80+0x40+15);
  481.                                         break;
  482.                                 case 7:
  483.                                         time_buf1[7]--;
  484.                                         if(time_buf1[7]<1)
  485.                                                 time_buf1[7]=7;
  486.                                         write_1602com(0x80+15);
  487.                                         write_1602dat(time_buf1[7]-1);
  488.                                         write_1602com(0x80+15);
  489.                                         break;
  490.                         }
  491.                         switch(bike_set)
  492.                         {
  493.                                 case 1:
  494.                                         RADIUS--;
  495.                                         if(RADIUS<0)
  496.                                         RADIUS=70;
  497.                                         write_1602com(0x80+12);
  498.                                         write_1602dat(0x30+RADIUS/10);
  499.                                         write_1602dat(0x30+RADIUS%10);
  500.                                         write_1602com(0x80+13);
  501.                                         break;
  502.                                 case 2:
  503.                                         SAFE_SPEED--;
  504.                                         if(SAFE_SPEED<0)
  505.                                         SAFE_SPEED=99;
  506.                                         write_1602com(0x80+0x40+10);
  507.                                         write_1602dat(0x30+SAFE_SPEED/10);
  508.                                         write_1602dat(0x30+SAFE_SPEED%10);
  509.                                         write_1602com(0x80+0x40+11);
  510.                                         break;
  511.                         }
  512.                 }
  513.                 while(K3==0);
  514.         }       
  515.         if(K2==0&&K3==0&&Mode==0&bike_set==0)
  516.         {
  517.                 BEEP=0;
  518.                 delay(100);
  519.                 BEEP=1;
  520.                 delay(100);
  521.                 BEEP=0;
  522.                 delay(100);
  523.                 BEEP=1;
  524.                 delay(100);
  525.                 Mileage=0;
  526.                 SETS();
  527.                 while(K2==0&&K3==0);
  528.         }
  529. }
  530. void BJ_SAFE()
  531. {
  532.         if(Velocity>SAFE_SPEED)
  533.         {
  534.                 BEEP=0;                                                                 //蜂鸣器响
  535.         }
  536.         else
  537.         {
  538.                 BEEP=1;                                                                  //蜂鸣器不响
  539.         }
  540. }

  541. void main()
  542. {
  543.         //初始化
  544.         Ds1302_Init();
  545.         lcd_init();
  546.         initeeprom();
  547.         //读取初始参数
  548.         READS();
  549.         //定时器初始化
  550. //        InitTimer0();
  551.         init();
  552.         lcd_init();
  553.         before_sec=time_buf1[6];
  554.    
  555.     Temp_Get(); // 第一次采集是错误数据
  556.     delay(200);
  557.     Temp_Get(); // 第一次采集是错误数据
  558.     delay(200);
  559.     Temp_Get(); // 第一次采集是错误数据
  560.     delay(200);
  561.     Temp_Get(); // 第一次采集是错误数据
  562.     delay(200);
  563.     Temp_Get(); // 第一次采集是错误数据
  564.    
  565.         while(1)                          //等待定时器中断
  566.         {
  567.                 if(Mode==0&&bike_set==0)
  568.                 {
  569.                         display();
  570.                         BJ_SAFE();
  571.                 }
  572.                 KEY();
  573.         
  574.         Temp_Handle();
  575.         }
  576. }

  577. void EXINT0() interrupt 0
  578. {
  579.         count++;
  580. }

  581. void time0() interrupt 1
  582. {
  583.         uchar m,n;
  584.         TH0=0x3c;
  585.         TL0=0xb0;         //50ms
  586.         m++;
  587.         if(LED_SEC==1)
  588.         {
  589.                 n++;
  590.                 if(n>=10)                 
  591.                 {
  592.                         n=0;
  593.                         LED_SEC=0;
  594.                 }
  595.         }       
  596.         if(m>=10)
  597.         {
  598.         m=0;
  599.                                                                                   
  600.          Mileage=Mileage+count*2*3.14*RADIUS/20/10;//里程数mileage=里程+记数值*轮周长/脉冲数/10
  601.           Velocity=count*2*3.14*RADIUS/100000*3600*2/20;//总定时500ms
  602.           count=0;

  603.           

  604.         }
  605.         }                                 // 处理数据,并显示里程和速度

  606. //读初值
  607. void READS()
  608. {
  609.         uchar Mileage_H,Mileage_M,Mileage_L;
  610.         delay(10);
  611.         RADIUS=read_add(0x01);
  612.         delay(10);
  613.         SAFE_SPEED=read_add(0x02);

  614.         delay(10);
  615.         Mileage_H=read_add(0x03);
  616.         delay(10);
  617.         Mileage_M=read_add(0x04);
  618.         delay(10);
  619.         Mileage_L=read_add(0x05);

  620.         Mileage=Mileage_H*100000+Mileage_M*1000+Mileage_L*10;
  621. }  


  622. //写初值
  623. void SETS()
  624. {
  625.         delay(10);
  626.         write_add(0x01,RADIUS);
  627.         delay(10);
  628.         write_add(0x02,SAFE_SPEED);

  629. /*        Mileage_H=Mileage/10000;                         //123.4560
  630.         Mileage_M=Mileage%10000/100;
  631.         Mileage_L=Mileage%10000%100;          */
  632.         delay(10);
  633.         write_add(0x03,Mileage/100000);
  634.         delay(10);
  635.         write_add(0x04,Mileage%100000/1000);
  636.         delay(10);
  637.         write_add(0x05,Mileage%100000%1000/10);       
  638. }
复制代码
回复

使用道具 举报

5#
ID:551568 发表于 2019-6-3 01:27 | 显示全部楼层
幻剑心 发表于 2019-6-1 21:02
程序应该是一个里程计数器。外部应该还有霍尔之类的转速传感器。根据转速传感器得到count,然后根据车轮周 ...

哥  我再问一个问题哈,有点疑惑,如果里程的单位为分米的话,那么这上面写千米的单位不是错了吗
回复

使用道具 举报

6#
ID:551568 发表于 2019-6-3 01:36 | 显示全部楼层
幻剑心 发表于 2019-6-1 21:02
程序应该是一个里程计数器。外部应该还有霍尔之类的转速传感器。根据转速传感器得到count,然后根据车轮周 ...

哥 我反应过来了   反应太迟钝了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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