久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5417|回復: 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:511890 發表于 2019-6-1 03:59 | 只看該作者
程序不全。不知道為啥要這樣做,可能和讀取的位數有關,每次只能read_add兩個字符。按照你給的代碼。uchar應該是unsigned char類型。范圍為0~255的整數。而Mileage最大值應該是一個6-7位數以上的數,超出了unsigned char范圍。因此,Mileage_H表示第6位以上的數,Mileage_M表示第4位第5位,Mileage_L表示第2位第3位。

評分

參與人數 1黑幣 +12 收起 理由
我的國兒 + 12 很給力!

查看全部評分

回復

使用道具 舉報

板凳
ID:552248 發表于 2019-6-1 07:28 | 只看該作者
從void SETS()可以看出,這是個用整形數據來處理浮點類型數據的函數, Mileage=Mileage_H*100000+Mileage_M*1000+Mileage_L*10;Mileage是最終浮點數據值用整形存儲的變量值,Mileage_H*100000是高位擴大100000倍作為記錄單元,其它*1000同理
回復

使用道具 舉報

地板
ID:330198 發表于 2019-6-1 09:20 | 只看該作者
你這個估計是把數據存在EEPROM中的,乘100000是為了變成整數,好把每一位數值取出來單獨保存。

評分

參與人數 1黑幣 +10 收起 理由
我的國兒 + 10 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:160500 發表于 2019-6-1 10:49 | 只看該作者
H、M、L是高中低三個位段的數,乘100000,1000,10是分別擴大這么多倍的和賦值給Mileage。為什么要乘因為把原來的數分開時縮小了這么多的倍,恢復自然要再乘回來

評分

參與人數 1黑幣 +10 收起 理由
我的國兒 + 10 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:551568 發表于 2019-6-1 14:01 | 只看該作者
幻劍心 發表于 2019-6-1 03:59
程序不全。不知道為啥要這樣做,可能和讀取的位數有關,每次只能read_add兩個字符。按照你給的代碼。uchar ...

那我可以把全部程序發給你看一下嗎  就這里不怎么懂什么意思   你的評論我覺得挺好的  但是好像有什么24小時評分限制   我明天再給評分  謝謝了  希望能回復一下   實在是單片機小白  想學習一下 很多不懂的
回復

使用道具 舉報

7#
ID:511890 發表于 2019-6-1 16:30 | 只看該作者
我的國兒 發表于 2019-6-1 14:01
那我可以把全部程序發給你看一下嗎  就這里不怎么懂什么意思   你的評論我覺得挺好的  但是好像有什么24 ...

可以,不過要晚上才有時間了。
回復

使用道具 舉報

8#
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. }
復制代碼

這是主程序,這個程序主要用來測速,用的是光電傳感器,通過定時記脈沖來進行測速,用了一個外部存儲器,就是這里不怎么懂,希望大佬幫下忙,謝謝
回復

使用道具 舉報

9#
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. }
復制代碼
回復

使用道具 舉報

10#
ID:511890 發表于 2019-6-1 21:02 | 只看該作者
程序應該是一個里程計數器。外部應該還有霍爾之類的轉速傳感器。根據轉速傳感器得到count,然后根據車輪周長計算,累加成Mileage。通過uchar code tab3[]={"Wheel Radius  cm"};           // 半徑   知道RADIUS是半徑。脈沖數20應該是車輪轉20分之1就會發出一次脈沖。再除以10,得到Mileage的單位為分米。
Mileage=Mileage+count*2*3.14*RADIUS/20/10;//里程數mileage=里程+記數值*輪周長/脈沖數/10

程序中READS()作用是單片機開機時從AT24C02讀出存儲在AT24C02中的歷史里程數。SETS()是存儲當前里程數。
根據SETS()中的存儲方式:首先假設Mileage = 6543210  由于AT24C02每次操作的地址或者數據都只是8位(即值范圍為:0~255)Mileage = 6543210遠大于255,所以要把它分開存儲。由前面知道Mileage的單位為分米,再舍掉個位,剛好得到米為單位的值。所以用一下方法存取:
低位:Mileage%100000%1000/10=21
中位:Mileage%100000/1000=43
高位:Mileage/100000=65

uchar code tab2[]={"  0.000km 00    "};        //里程 速度
write_1602com(0x80+0x40);
                        if(Mileage/1000000==0)
                        write_1602dat(' ');
                        else
                        write_1602dat(0x30+Mileage/1000000);//數字+0x30得到該數字的LCD1602顯示碼
                        if(Mileage%1000000/100000==0)
                        write_1602dat(' ');
                        else        
                        write_1602dat(0x30+Mileage%1000000/100000);//數字+0x30得到該數字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000/10000);//數字+0x30得到該數字的LCD1602顯示碼
                        write_1602com(0x80+0x40+4);
                        write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//數字+30得到該數字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//數字+30得到該數字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//數字+30得到該數字的LCD1602顯示碼
這些代碼也證明了Mileage的單位是分米。

評分

參與人數 1黑幣 +12 收起 理由
我的國兒 + 12 贊一個!

查看全部評分

回復

使用道具 舉報

11#
ID:551568 發表于 2019-6-3 01:27 | 只看該作者
幻劍心 發表于 2019-6-1 21:02
程序應該是一個里程計數器。外部應該還有霍爾之類的轉速傳感器。根據轉速傳感器得到count,然后根據車輪周 ...

哥  我再問一個問題哈,有點疑惑,如果里程的單位為分米的話,那么這上面寫千米的單位不是錯了嗎
回復

使用道具 舉報

12#
ID:551568 發表于 2019-6-3 01:36 | 只看該作者
幻劍心 發表于 2019-6-1 21:02
程序應該是一個里程計數器。外部應該還有霍爾之類的轉速傳感器。根據轉速傳感器得到count,然后根據車輪周 ...

哥 我反應過來了   反應太遲鈍了
回復

使用道具 舉報

13#
ID:56665 發表于 2019-6-3 08:35 | 只看該作者
合并成10進制數
回復

使用道具 舉報

14#
ID:325337 發表于 2020-5-25 10:47 來自手機 | 只看該作者
幻劍心 發表于 2019-6-1 21:02
程序應該是一個里程計數器。外部應該還有霍爾之類的轉速傳感器。根據轉速傳感器得到count,然后根據車輪周 ...

哥,我也想問一下就是這個公式 Velocity=count*2*3.14*RADIUS/100000*3600*2/20;他后邊/100000*3600*2/20是啥意思啊?
回復

使用道具 舉報

15#
ID:325337 發表于 2020-5-25 10:52 來自手機 | 只看該作者
我的國兒 發表于 2019-6-3 01:27
哥  我再問一個問題哈,有點疑惑,如果里程的單位為分米的話,那么這上面寫千米的單位不是錯了嗎

我也想說,那個是分米的話,顯示的是千米,那不是錯了嗎…兄弟你是咋想明白的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久久久久久久久久久 | 亚洲一区在线日韩在线深爱 | 国产一区二区三区欧美 | 请别相信他免费喜剧电影在线观看 | 中文字幕日韩一区 | 日本精品一区二区三区视频 | 国产成人在线视频免费观看 | 久久成人精品 | 日本黄色大片免费 | 久久伊人精品 | 国产激情视频 | 国产剧情一区 | 中文字幕 视频一区 | 久久久久久国产精品 | 久久av一区二区三区 | 亚洲欧美另类在线 | 国产农村一级国产农村 | 91视频一区二区 | 国产 欧美 日韩 一区 | 天天操妹子| 综合久| 久久精品日产第一区二区三区 | 国产成人精品一区二区三区在线观看 | 婷婷综合网 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 欧美一区二区在线 | 日韩免费一二三区 | 中文在线a在线 | 欧美精品欧美精品系列 | 久久99深爱久久99精品 | 久久精品国产99国产 | 精品国产免费一区二区三区演员表 | 999热视频 | 在线免费看毛片 | 国产日韩欧美 | 9久9久9久女女女九九九一九 | 欧美一级大片 | 日韩电影一区 | 欧美在线视频一区二区 | av免费网址| www天天操|