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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5454|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

這個(gè)單片機(jī)程序定義沒(méi)怎么看懂,H,M,L沒(méi)懂什么意思,還有就是為什么要乘100000,100...

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:551568 發(fā)表于 2019-6-1 00:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
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;
}  


//寫(xiě)初值
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);        
}
我是一個(gè)單片機(jī)小白,希望各位大佬相助一下,

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:511890 發(fā)表于 2019-6-1 03:59 | 只看該作者
程序不全。不知道為啥要這樣做,可能和讀取的位數(shù)有關(guān),每次只能read_add兩個(gè)字符。按照你給的代碼。uchar應(yīng)該是unsigned char類型。范圍為0~255的整數(shù)。而Mileage最大值應(yīng)該是一個(gè)6-7位數(shù)以上的數(shù),超出了unsigned char范圍。因此,Mileage_H表示第6位以上的數(shù),Mileage_M表示第4位第5位,Mileage_L表示第2位第3位。

評(píng)分

參與人數(shù) 1黑幣 +12 收起 理由
我的國(guó)兒 + 12 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

地板
ID:330198 發(fā)表于 2019-6-1 09:20 | 只看該作者
你這個(gè)估計(jì)是把數(shù)據(jù)存在EEPROM中的,乘100000是為了變成整數(shù),好把每一位數(shù)值取出來(lái)單獨(dú)保存。

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
我的國(guó)兒 + 10 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:160500 發(fā)表于 2019-6-1 10:49 | 只看該作者
H、M、L是高中低三個(gè)位段的數(shù),乘100000,1000,10是分別擴(kuò)大這么多倍的和賦值給Mileage。為什么要乘因?yàn)榘言瓉?lái)的數(shù)分開(kāi)時(shí)縮小了這么多的倍,恢復(fù)自然要再乘回來(lái)

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
我的國(guó)兒 + 10 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

可以,不過(guò)要晚上才有時(shí)間了。
回復(fù)

使用道具 舉報(bào)

8#
ID:551568 發(fā)表于 2019-6-1 17:16 | 只看該作者
幻劍心 發(fā)表于 2019-6-1 16:30
可以,不過(guò)要晚上才有時(shí)間了。
  1. #include<reg52.h>          //調(diào)用單片機(jī)頭文件
  2. #include "DS18B20.h"         
  3. #include <stdio.h>

  4. #define uchar unsigned char           //無(wú)符號(hào)字符型        宏定義                 變量范圍0~255
  5. #define uint unsigned int           //無(wú)符號(hào)整型                 宏定義                  變量范圍0~65535

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

  9. sbit COUNT_IN=P3^2;                          //脈沖輸入端口

  10. //定義1602相關(guān)管腳
  11. sbit rs=P1^4;                                //寄存器選擇信號(hào)   H:數(shù)據(jù)     L:指令
  12. sbit en=P1^0;                         //片選信號(hào)  下降沿觸發(fā)

  13. //鍵盤(pán)定義
  14. sbit K1=P3^4;        //設(shè)置時(shí)間
  15. sbit K3=P3^6;        //減按鍵
  16. sbit K2=P3^5;        //加按鍵
  17. sbit K4=P3^7;        //設(shè)置半徑安全距離
  18. sbit BEEP=P3^0;           //蜂鳴器外接端口

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

  21. uchar code tab1[]={"  /  /     :    "}; //時(shí)間  年 月 日 時(shí) 分 星期       
  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 :           "};           //         在按鍵設(shè)置的時(shí)候會(huì)顯示秒

  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負(fù)跳變觸發(fā)       
  55.     TMOD=0x01;//定時(shí)器工作于方式1
  56.         TH0=0x3c;          //50ms
  57.         TL0=0xb0;
  58.         EA=1; //CPU開(kāi)中斷總允許
  59.         ET0=1;//開(kāi)定時(shí)中斷
  60.         EX0=1;//開(kāi)外部INTO中斷
  61.     TR0=1;//啟動(dòng)定時(shí)
  62. }
  63. /********液晶寫(xiě)入指令函數(shù)與寫(xiě)入數(shù)據(jù)函數(shù),以后可調(diào)用**************/

  64. void write_1602com(uchar com)//****液晶寫(xiě)入指令函數(shù)****
  65. {
  66.         rs=0;//把寄存器置為指令
  67.         P0=com;//送入數(shù)據(jù)
  68.         delay(1);
  69.         en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
  70.         delay(1);
  71.         en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令

  72. }


  73. void write_1602dat(uchar dat)//***液晶寫(xiě)入數(shù)據(jù)函數(shù)****
  74. {
  75.         rs=1;//把寄存器置為數(shù)據(jù)
  76.         P0=dat;//送入數(shù)據(jù)
  77.         delay(1);
  78.         en=1; //en置高電平,為制造下降沿做準(zhǔn)備
  79.         delay(1);
  80.         en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  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()                 //         液晶寫(xiě)數(shù)據(jù)。
  93. {
  94. uchar i,j,k=0;
  95. uchar temp=0x40;//設(shè)定CGRAM地址指令01000000(DB5~DB0含義)
  96. for(i=0;i<7;i++)  //自定義7個(gè)字符
  97. {      
  98.            for(j=0;j<8;j++)
  99.            {
  100.             write_1602com(temp+j);
  101.             write_1602dat(num[k]); //分別寫(xiě)入CGRAM的字模
  102.             k++;
  103.            }
  104.            temp=temp+8;
  105.         }
  106. }

  107. void lcd_init()//***液晶初始化函數(shù)****
  108. {
  109.         Lcd_ram();
  110.         write_1602com(0x38);//設(shè)置液晶8位數(shù)據(jù)工作模式,2行,5×7
  111.         write_1602com(0x0c);//整體顯示、開(kāi)光標(biāo)、不閃爍
  112.         write_1602com(0x06);//設(shè)定輸入方式屏不移位
  113.         write_1602com(0x01);//清除屏幕顯示

  114.         write_1602com(0x80);//顯示固定符號(hào)從第一行第1個(gè)位置之后開(kāi)始顯示
  115.         for(a=0;a<16;a++)
  116.         {
  117.                 write_1602dat(tab1[a]);//向液晶屏寫(xiě)固定符號(hào)部分
  118.         }
  119.         write_1602com(0x80+0x40);//顯示固定符號(hào)寫(xiě)入位置,從第2個(gè)位置后開(kāi)始顯示
  120.         for(a=0;a<16;a++)
  121.         {
  122.                 write_1602dat(tab2[a]);//寫(xiě)顯示固定符號(hào)
  123.         }
  124. }

  125. void display()                                                                  //液晶顯示部分
  126. {
  127.         if(Mode==0&&bike_set==0)
  128.         {
  129.                 //讀時(shí)間
  130.                         Ds1302_Read_Time();
  131.                         //顯示時(shí)間
  132.                         write_1602com(0x80);
  133.                         write_1602dat(0x30+time_buf1[1]/10);                 //顯示設(shè)置
  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);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  168.                         if(Mileage%1000000/100000==0)
  169.                         write_1602dat(' ');
  170.                         else       
  171.                         write_1602dat(0x30+Mileage%1000000/100000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  172.                         write_1602dat(0x30+Mileage%1000000%100000/10000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  173.                         write_1602com(0x80+0x40+4);
  174.                         write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  175.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  176.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  177.                         SETS();
  178.        
  179.                         write_1602com(0x80+0x40+10);
  180.                         write_1602dat(0x30+Velocity/10);
  181.                         write_1602dat(0x30+Velocity%10);//數(shù)字+30得到該數(shù)字的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);//顯示固定符號(hào)寫(xiě)入位置
  193.                                 for(a=0;a<16;a++)
  194.                                 {
  195.                                         write_1602dat(tab5[a]);//寫(xiě)顯示固定符號(hào)
  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);         //打開(kāi)閃爍
  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);//顯示固定符號(hào)從第一行第1個(gè)位置之后開(kāi)始顯示
  224.                                 for(a=0;a<16;a++)
  225.                                 {
  226.                                         write_1602dat(tab1[a]);//向液晶屏寫(xiě)固定符號(hào)部分
  227.                                 }
  228.                                 write_1602com(0x80+0x40);//顯示固定符號(hào)寫(xiě)入位置,從第2個(gè)位置后開(kāi)始顯示
  229.                                 for(a=0;a<16;a++)
  230.                                 {
  231.                                         write_1602dat(tab2[a]);//寫(xiě)顯示固定符號(hào)
  232.                                 }
  233.                                 break;
  234.                 }
  235.         }
  236.         else if(bike_set!=0)
  237.         {
  238.                 switch(bike_set)
  239.                 {
  240.                         case 1:       
  241.                                 write_1602com(0x80);//顯示固定符號(hào)寫(xiě)入位置
  242.                                 for(a=0;a<16;a++)
  243.                                 {
  244.                                         write_1602dat(tab3[a]);//寫(xiě)顯示固定符號(hào)
  245.                                 }
  246.                                 write_1602com(0x80+0x40);//顯示固定符號(hào)寫(xiě)入位置
  247.                                 for(a=0;a<16;a++)
  248.                                 {
  249.                                         write_1602dat(tab4[a]);//寫(xiě)顯示固定符號(hào)
  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);         //打開(kāi)光標(biāo)閃爍
  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);//顯示固定符號(hào)從第一行第1個(gè)位置之后開(kāi)始顯示
  266.                                 for(a=0;a<16;a++)
  267.                                 {
  268.                                         write_1602dat(tab1[a]);//向液晶屏寫(xiě)固定符號(hào)部分
  269.                                 }
  270.                                 write_1602com(0x80+0x40);//顯示固定符號(hào)寫(xiě)入位置,從第2個(gè)位置后開(kāi)始顯示
  271.                                 for(a=0;a<16;a++)
  272.                                 {
  273.                                         write_1602dat(tab2[a]);//寫(xiě)顯示固定符號(hào)
  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.                 //調(diào)時(shí)
  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.                 //調(diào)時(shí)
  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.         //讀取初始參數(shù)
  548.         READS();
  549.         //定時(shí)器初始化
  550. //        InitTimer0();
  551.         init();
  552.         lcd_init();
  553.         before_sec=time_buf1[6];
  554.    
  555.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  556.     delay(200);
  557.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  558.     delay(200);
  559.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  560.     delay(200);
  561.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  562.     delay(200);
  563.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  564.    
  565.         while(1)                          //等待定時(shí)器中斷
  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;//里程數(shù)mileage=里程+記數(shù)值*輪周長(zhǎng)/脈沖數(shù)/10
  601.           Velocity=count*2*3.14*RADIUS/100000*3600*2/20;//總定時(shí)500ms
  602.           count=0;

  603.           

  604.         }
  605.         }                                 // 處理數(shù)據(jù),并顯示里程和速度

  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. //寫(xiě)初值
  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. }
復(fù)制代碼

這是主程序,這個(gè)程序主要用來(lái)測(cè)速,用的是光電傳感器,通過(guò)定時(shí)記脈沖來(lái)進(jìn)行測(cè)速,用了一個(gè)外部存儲(chǔ)器,就是這里不怎么懂,希望大佬幫下忙,謝謝
回復(fù)

使用道具 舉報(bào)

9#
ID:551568 發(fā)表于 2019-6-1 18:37 | 只看該作者
幻劍心 發(fā)表于 2019-6-1 16:30
可以,不過(guò)要晚上才有時(shí)間了。

主要是還是太多不懂了,之前發(fā)了一份,不知道發(fā)成功沒(méi)用,我重新發(fā)一下
  1. #include<reg52.h>          //調(diào)用單片機(jī)頭文件
  2. #include "DS18B20.h"         
  3. #include <stdio.h>

  4. #define uchar unsigned char           //無(wú)符號(hào)字符型        宏定義                 變量范圍0~255
  5. #define uint unsigned int           //無(wú)符號(hào)整型                 宏定義                  變量范圍0~65535

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

  9. sbit COUNT_IN=P3^2;                          //脈沖輸入端口

  10. //定義1602相關(guān)管腳
  11. sbit rs=P1^4;                                //寄存器選擇信號(hào)   H:數(shù)據(jù)     L:指令
  12. sbit en=P1^0;                         //片選信號(hào)  下降沿觸發(fā)

  13. //鍵盤(pán)定義
  14. sbit K1=P3^4;        //設(shè)置時(shí)間
  15. sbit K3=P3^6;        //減按鍵
  16. sbit K2=P3^5;        //加按鍵
  17. sbit K4=P3^7;        //設(shè)置半徑安全距離
  18. sbit BEEP=P3^0;           //蜂鳴器外接端口

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

  21. uchar code tab1[]={"  /  /     :    "}; //時(shí)間  年 月 日 時(shí) 分 星期       
  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 :           "};           //         在按鍵設(shè)置的時(shí)候會(huì)顯示秒

  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負(fù)跳變觸發(fā)       
  55.     TMOD=0x01;//定時(shí)器工作于方式1
  56.         TH0=0x3c;          //50ms
  57.         TL0=0xb0;
  58.         EA=1; //CPU開(kāi)中斷總允許
  59.         ET0=1;//開(kāi)定時(shí)中斷
  60.         EX0=1;//開(kāi)外部INTO中斷
  61.     TR0=1;//啟動(dòng)定時(shí)
  62. }
  63. /********液晶寫(xiě)入指令函數(shù)與寫(xiě)入數(shù)據(jù)函數(shù),以后可調(diào)用**************/

  64. void write_1602com(uchar com)//****液晶寫(xiě)入指令函數(shù)****
  65. {
  66.         rs=0;//把寄存器置為指令
  67.         P0=com;//送入數(shù)據(jù)
  68.         delay(1);
  69.         en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
  70.         delay(1);
  71.         en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令

  72. }


  73. void write_1602dat(uchar dat)//***液晶寫(xiě)入數(shù)據(jù)函數(shù)****
  74. {
  75.         rs=1;//把寄存器置為數(shù)據(jù)
  76.         P0=dat;//送入數(shù)據(jù)
  77.         delay(1);
  78.         en=1; //en置高電平,為制造下降沿做準(zhǔn)備
  79.         delay(1);
  80.         en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  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()                 //         液晶寫(xiě)數(shù)據(jù)。
  93. {
  94. uchar i,j,k=0;
  95. uchar temp=0x40;//設(shè)定CGRAM地址指令01000000(DB5~DB0含義)
  96. for(i=0;i<7;i++)  //自定義7個(gè)字符
  97. {      
  98.            for(j=0;j<8;j++)
  99.            {
  100.             write_1602com(temp+j);
  101.             write_1602dat(num[k]); //分別寫(xiě)入CGRAM的字模
  102.             k++;
  103.            }
  104.            temp=temp+8;
  105.         }
  106. }

  107. void lcd_init()//***液晶初始化函數(shù)****
  108. {
  109.         Lcd_ram();
  110.         write_1602com(0x38);//設(shè)置液晶8位數(shù)據(jù)工作模式,2行,5×7
  111.         write_1602com(0x0c);//整體顯示、開(kāi)光標(biāo)、不閃爍
  112.         write_1602com(0x06);//設(shè)定輸入方式屏不移位
  113.         write_1602com(0x01);//清除屏幕顯示

  114.         write_1602com(0x80);//顯示固定符號(hào)從第一行第1個(gè)位置之后開(kāi)始顯示
  115.         for(a=0;a<16;a++)
  116.         {
  117.                 write_1602dat(tab1[a]);//向液晶屏寫(xiě)固定符號(hào)部分
  118.         }
  119.         write_1602com(0x80+0x40);//顯示固定符號(hào)寫(xiě)入位置,從第2個(gè)位置后開(kāi)始顯示
  120.         for(a=0;a<16;a++)
  121.         {
  122.                 write_1602dat(tab2[a]);//寫(xiě)顯示固定符號(hào)
  123.         }
  124. }

  125. void display()                                                                  //液晶顯示部分
  126. {
  127.         if(Mode==0&&bike_set==0)
  128.         {
  129.                 //讀時(shí)間
  130.                         Ds1302_Read_Time();
  131.                         //顯示時(shí)間
  132.                         write_1602com(0x80);
  133.                         write_1602dat(0x30+time_buf1[1]/10);                 //顯示設(shè)置
  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);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  168.                         if(Mileage%1000000/100000==0)
  169.                         write_1602dat(' ');
  170.                         else       
  171.                         write_1602dat(0x30+Mileage%1000000/100000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  172.                         write_1602dat(0x30+Mileage%1000000%100000/10000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  173.                         write_1602com(0x80+0x40+4);
  174.                         write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  175.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  176.                         write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  177.                         SETS();
  178.        
  179.                         write_1602com(0x80+0x40+10);
  180.                         write_1602dat(0x30+Velocity/10);
  181.                         write_1602dat(0x30+Velocity%10);//數(shù)字+30得到該數(shù)字的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);//顯示固定符號(hào)寫(xiě)入位置
  193.                                 for(a=0;a<16;a++)
  194.                                 {
  195.                                         write_1602dat(tab5[a]);//寫(xiě)顯示固定符號(hào)
  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);         //打開(kāi)閃爍
  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);//顯示固定符號(hào)從第一行第1個(gè)位置之后開(kāi)始顯示
  224.                                 for(a=0;a<16;a++)
  225.                                 {
  226.                                         write_1602dat(tab1[a]);//向液晶屏寫(xiě)固定符號(hào)部分
  227.                                 }
  228.                                 write_1602com(0x80+0x40);//顯示固定符號(hào)寫(xiě)入位置,從第2個(gè)位置后開(kāi)始顯示
  229.                                 for(a=0;a<16;a++)
  230.                                 {
  231.                                         write_1602dat(tab2[a]);//寫(xiě)顯示固定符號(hào)
  232.                                 }
  233.                                 break;
  234.                 }
  235.         }
  236.         else if(bike_set!=0)
  237.         {
  238.                 switch(bike_set)
  239.                 {
  240.                         case 1:       
  241.                                 write_1602com(0x80);//顯示固定符號(hào)寫(xiě)入位置
  242.                                 for(a=0;a<16;a++)
  243.                                 {
  244.                                         write_1602dat(tab3[a]);//寫(xiě)顯示固定符號(hào)
  245.                                 }
  246.                                 write_1602com(0x80+0x40);//顯示固定符號(hào)寫(xiě)入位置
  247.                                 for(a=0;a<16;a++)
  248.                                 {
  249.                                         write_1602dat(tab4[a]);//寫(xiě)顯示固定符號(hào)
  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);         //打開(kāi)光標(biāo)閃爍
  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);//顯示固定符號(hào)從第一行第1個(gè)位置之后開(kāi)始顯示
  266.                                 for(a=0;a<16;a++)
  267.                                 {
  268.                                         write_1602dat(tab1[a]);//向液晶屏寫(xiě)固定符號(hào)部分
  269.                                 }
  270.                                 write_1602com(0x80+0x40);//顯示固定符號(hào)寫(xiě)入位置,從第2個(gè)位置后開(kāi)始顯示
  271.                                 for(a=0;a<16;a++)
  272.                                 {
  273.                                         write_1602dat(tab2[a]);//寫(xiě)顯示固定符號(hào)
  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.                 //調(diào)時(shí)
  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.                 //調(diào)時(shí)
  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.         //讀取初始參數(shù)
  548.         READS();
  549.         //定時(shí)器初始化
  550. //        InitTimer0();
  551.         init();
  552.         lcd_init();
  553.         before_sec=time_buf1[6];
  554.    
  555.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  556.     delay(200);
  557.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  558.     delay(200);
  559.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  560.     delay(200);
  561.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  562.     delay(200);
  563.     Temp_Get(); // 第一次采集是錯(cuò)誤數(shù)據(jù)
  564.    
  565.         while(1)                          //等待定時(shí)器中斷
  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;//里程數(shù)mileage=里程+記數(shù)值*輪周長(zhǎng)/脈沖數(shù)/10
  601.           Velocity=count*2*3.14*RADIUS/100000*3600*2/20;//總定時(shí)500ms
  602.           count=0;

  603.           

  604.         }
  605.         }                                 // 處理數(shù)據(jù),并顯示里程和速度

  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. //寫(xiě)初值
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

程序中READS()作用是單片機(jī)開(kāi)機(jī)時(shí)從AT24C02讀出存儲(chǔ)在AT24C02中的歷史里程數(shù)。SETS()是存儲(chǔ)當(dāng)前里程數(shù)。
根據(jù)SETS()中的存儲(chǔ)方式:首先假設(shè)Mileage = 6543210  由于AT24C02每次操作的地址或者數(shù)據(jù)都只是8位(即值范圍為:0~255)Mileage = 6543210遠(yuǎn)大于255,所以要把它分開(kāi)存儲(chǔ)。由前面知道Mileage的單位為分米,再舍掉個(gè)位,剛好得到米為單位的值。所以用一下方法存取:
低位: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);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
                        if(Mileage%1000000/100000==0)
                        write_1602dat(' ');
                        else        
                        write_1602dat(0x30+Mileage%1000000/100000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000/10000);//數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
                        write_1602com(0x80+0x40+4);
                        write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
                        write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
這些代碼也證明了Mileage的單位是分米。

評(píng)分

參與人數(shù) 1黑幣 +12 收起 理由
我的國(guó)兒 + 12 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

11#
ID:551568 發(fā)表于 2019-6-3 01:27 | 只看該作者
幻劍心 發(fā)表于 2019-6-1 21:02
程序應(yīng)該是一個(gè)里程計(jì)數(shù)器。外部應(yīng)該還有霍爾之類的轉(zhuǎn)速傳感器。根據(jù)轉(zhuǎn)速傳感器得到count,然后根據(jù)車輪周 ...

哥  我再問(wèn)一個(gè)問(wèn)題哈,有點(diǎn)疑惑,如果里程的單位為分米的話,那么這上面寫(xiě)千米的單位不是錯(cuò)了嗎
回復(fù)

使用道具 舉報(bào)

12#
ID:551568 發(fā)表于 2019-6-3 01:36 | 只看該作者
幻劍心 發(fā)表于 2019-6-1 21:02
程序應(yīng)該是一個(gè)里程計(jì)數(shù)器。外部應(yīng)該還有霍爾之類的轉(zhuǎn)速傳感器。根據(jù)轉(zhuǎn)速傳感器得到count,然后根據(jù)車輪周 ...

哥 我反應(yīng)過(guò)來(lái)了   反應(yīng)太遲鈍了
回復(fù)

使用道具 舉報(bào)

13#
ID:56665 發(fā)表于 2019-6-3 08:35 | 只看該作者
合并成10進(jìn)制數(shù)
回復(fù)

使用道具 舉報(bào)

14#
ID:325337 發(fā)表于 2020-5-25 10:47 來(lái)自手機(jī) | 只看該作者
幻劍心 發(fā)表于 2019-6-1 21:02
程序應(yīng)該是一個(gè)里程計(jì)數(shù)器。外部應(yīng)該還有霍爾之類的轉(zhuǎn)速傳感器。根據(jù)轉(zhuǎn)速傳感器得到count,然后根據(jù)車輪周 ...

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

使用道具 舉報(bào)

15#
ID:325337 發(fā)表于 2020-5-25 10:52 來(lái)自手機(jī) | 只看該作者
我的國(guó)兒 發(fā)表于 2019-6-3 01:27
哥  我再問(wèn)一個(gè)問(wèn)題哈,有點(diǎn)疑惑,如果里程的單位為分米的話,那么這上面寫(xiě)千米的單位不是錯(cuò)了嗎

我也想說(shuō),那個(gè)是分米的話,顯示的是千米,那不是錯(cuò)了嗎…兄弟你是咋想明白的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线视频一区二区三区 | 欧洲一区二区视频 | 亚洲综合网站 | 欧美精品一区二区在线观看 | 91精品久久久久久久久中文字幕 | 日韩av大片免费看 | 欧美激情a∨在线视频播放 成人免费共享视频 | 一区二区三区中文 | 亚洲色图综合 | 成人一区二区三区 | 国产成人精品久久二区二区91 | 一区二区三区欧美 | 亚洲午夜一区二区 | 久久久久欧美 | 日韩精品一区二区三区中文在线 | 中文字幕一区在线观看视频 | 一级做a毛片 | 精品国产鲁一鲁一区二区张丽 | 日韩毛片在线免费观看 | 国产成人精品免费视频大全最热 | 午夜在线视频一区二区三区 | 亚洲国产精品人人爽夜夜爽 | 精品中文字幕视频 | 午夜影院普通用户体验区 | 欧美精品一区二区在线观看 | 免费人成激情视频在线观看冫 | 香蕉av免费 | 激情 一区 | 国产精品久久久久一区二区三区 | av在线一区二区三区 | 欧美成视频 | 翔田千里一区二区 | 国产91综合 | 中日韩毛片 | 日韩精品成人一区二区三区视频 | 精品福利视频一区二区三区 | 国产成人精品av | 国产亚洲成av人片在线观看桃 | 久久九七| 在线视频一区二区三区 | 免费一看一级毛片 |