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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1794|回復: 4
打印 上一主題 下一主題
收起左側

各位大神請問一下這個單片機程序哪里出了錯誤嗎?屏幕顯示是min,但我設置的是r/min

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
  1. #include <reg52.H>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char         //宏定義
  5. /*-----------------------端口命名------------------------*/
  6. sbit rs=P2^0;       //LCD的數據/命令選擇端
  7. sbit rw=P2^1;       //LCD的讀寫選擇端
  8. sbit e=P2^2;      //LCD的使能信號端  
  9. /*-------------------------------------------------------*/
  10. /*-----------------------定義參數------------------------*/
  11. uint i,z,count,zhuan,msec;     //定義參數
  12. uchar display[]={"speed=     r/min "};     //定義顯示參數
  13. /*-------------------------------------------------------*/
  14. /*-----------------------毫秒延時------------------------*/
  15. void delay(uint ms)
  16. {  
  17.         uint i,j;      //為延時引入i,j兩參數  
  18.         for (j=0;j<ms;j++)     //延時第一循環   
  19.         for (i=0;i<120;i++);    //延時第二循環  
  20. }
  21. /*-------------------------------------------------------*/
  22. /*--------------------向LCD1602寫命令--------------------*/
  23. void write_command(uchar command)
  24. {
  25.         rs=0;       //數據、命令選擇端0為命令
  26.         rw=0;       //讀、寫選擇端0為寫
  27.         P0=command;      //向LCD寫命令
  28.         delay(5);      //稍做延遲,代替檢測忙狀態  
  29.         e=1;      //信號使能端高電平
  30.         delay(5);      //稍做延遲,代替檢測忙狀態  
  31.         e=0;      //信號使能端低電平
  32. }
  33. /*-------------------------------------------------------*/
  34. /*--------------------向LCD1602寫數據--------------------*/
  35. void write_data(uchar data0)
  36. {
  37.         rs=1;       //數據、命令選擇端 1為數據
  38.         rw=0;       //讀、寫選擇端0為寫
  39.         P0=data0;      //向LCD寫數據
  40.         delay(5);      //稍做延遲,代替檢測忙狀態
  41.         e=1;      //信號使能端高電平
  42.         delay(5);     //稍做延遲,代替檢測忙狀態
  43.         e=0;      //信號使能端低電平
  44. }
  45. /*-------------------------------------------------------*/
  46. /*-------------------外部中斷0計數程序-------------------*/
  47. void counter(void) interrupt 0
  48. {   
  49.         EX0=0;       //關外部中斷1  
  50.         count++;  
  51.         if(count==2)      //2次循環為發動機轉一圈  
  52.         {   
  53.              count=1;     //初始化計數   
  54.              z++;      //轉圈計數加1
  55.           }      //計數+1  
  56.           EX0=1;       //開外部中斷1  
  57.              return;
  58. }
  59. /*-------------------------------------------------------*/
  60. /*------------------------LCD顯示------------------------*/
  61. void displaytolcd()
  62. {  
  63.           write_command(0x80);     //向LCD1602寫命令80H  
  64.           for (i=0;i<16;i++)   //循環要傳輸的字符個數次,每一次傳一個字符  
  65.         {   
  66.             write_data(display[i]);   
  67.               delay(5);  
  68.           }
  69. } /*-------------------------------------------------------*/  
  70. /*-----------------內部中斷0計時計數程序-----------------*/
  71. void Timer_0(void) interrupt 1
  72. {  
  73.            TH0=0x3c;      //50ms定時  
  74.            TL0=0xb0;  
  75.            msec++;  
  76.            if(msec==20)      //50*20=1S  
  77.         {   
  78.              displaytolcd();   
  79.              msec=0;   
  80.              zhuan=30*z;   
  81.              z=0;
  82.                  TH0=0x3c;      //相比原程序,這里重新計數器賦初值50ms定時  
  83.          TL0=0xb0;  
  84.         }
  85. }
  86. /*-------------------------------------------------------*/
  87. /*----------------------端口初始化-----------------------*/
  88. void int_all()
  89. {  
  90.         z=0;       //初始化z的值  
  91.         count=0;      //初始化count的值  
  92.         zhuan=0;      //初始化轉的值  
  93.         rw=0;       //選擇LCD寫數據指令  
  94.         delay(15);      //延時15ms  
  95.         write_command(0x38);     //向LCD1602寫命令38H  
  96.         delay(5);      //延時5ms  
  97.         write_command(0x0e);     //向LCD1602寫命令0EH  
  98.         delay(5);      //延時5ms  
  99.         write_command(0x06);     //向LCD1602寫命令06H
  100.         TMOD=0x01;      //內部中斷定時器選擇  
  101.         TH0=0x3c;      //50ms定時  
  102.         TL0=0xb0;  
  103.         EA=1;       //開中斷總開關  
  104.         ET0=1;       //開內部中斷0
  105.         TR0=1;       //計時器開始工作  
  106.         IT0=1;       //外部中斷0為下降沿觸發  
  107.         EX0=1;       //開外部中斷0
  108. }
  109. /*-------------------------------------------------------*/
  110. /*-----------------------數據處理------------------------*/
  111. void  disp_count()
  112. {  
  113.         display[9]=(zhuan/1000+'0');    //轉換轉速的千位  
  114.         display[10]=(zhuan/100%10+'0');    //轉換轉速的百位  
  115.         display[11]=(zhuan/10%10+'0');    //轉換轉速的十位   
  116.         display[12]=(zhuan%10+'0');    //轉換轉速的個位
  117. }
  118. /*-------------------------------------------------------*/
  119. /*------------------------主函數-------------------------*/
  120. void main()
  121. {  
  122.            int_all();     //全局初始化  
  123.            while(1)  
  124.           {
  125.            disp_count();     //數據處理
  126.            displaytolcd();     //LCD顯示  
  127.           }
  128. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:235200 發表于 2020-3-30 21:23 | 只看該作者
顯然是數據送入到LCD1602的地址位置錯了,把之前送入的r/min覆蓋掉了
回復

使用道具 舉報

板凳
ID:602576 發表于 2020-3-30 22:49 | 只看該作者
display[7]=(zhuan/1000+'0');    //轉換轉速的千位  
        display[8]=(zhuan/100%10+'0');    //轉換轉速的百位  
        display[9]=(zhuan/10%10+'0');    //轉換轉速的十位   
        display[10]=(zhuan%10+'0');    //轉換轉速的個位
回復

使用道具 舉報

地板
ID:213173 發表于 2020-3-31 11:34 | 只看該作者

  1. #include <reg52.H>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char         //宏定義
  5. /*-----------------------端口命名------------------------*/
  6. sbit rs=P2^0;       //LCD的數據/命令選擇端
  7. sbit rw=P2^1;       //LCD的讀寫選擇端
  8. sbit e=P2^2;      //LCD的使能信號端  
  9. /*-------------------------------------------------------*/
  10. /*-----------------------定義參數------------------------*/
  11. uint i,z,count,zhuan,msec;     //定義參數
  12. uchar display[]={"speed=    r/min "};     //定義顯示參數
  13. /*-------------------------------------------------------*/
  14. /*-----------------------毫秒延時------------------------*/
  15. void delay(uint ms)
  16. {  
  17.         uint i,j;      //為延時引入i,j兩參數  
  18.         for (j=0;j<ms;j++)     //延時第一循環   
  19.                 for (i=0;i<120;i++);    //延時第二循環  
  20. }
  21. /*-------------------------------------------------------*/
  22. /*--------------------向LCD1602寫命令--------------------*/
  23. void write_command(uchar command)
  24. {
  25.         rs=0;       //數據、命令選擇端0為命令
  26.         rw=0;       //讀、寫選擇端0為寫
  27.         P0=command;      //向LCD寫命令
  28.         delay(5);      //稍做延遲,代替檢測忙狀態  
  29.         e=1;      //信號使能端高電平
  30.         delay(5);      //稍做延遲,代替檢測忙狀態  
  31.         e=0;      //信號使能端低電平
  32. }
  33. /*-------------------------------------------------------*/
  34. /*--------------------向LCD1602寫數據--------------------*/
  35. void write_data(uchar data0)
  36. {
  37.         rs=1;       //數據、命令選擇端 1為數據
  38.         rw=0;       //讀、寫選擇端0為寫
  39.         P0=data0;      //向LCD寫數據
  40.         delay(5);      //稍做延遲,代替檢測忙狀態
  41.         e=1;      //信號使能端高電平
  42.         delay(5);     //稍做延遲,代替檢測忙狀態
  43.         e=0;      //信號使能端低電平
  44. }
  45. /*-------------------------------------------------------*/
  46. /*-------------------外部中斷0計數程序-------------------*/
  47. void counter(void) interrupt 0
  48. {   
  49.         EX0=0;       //關外部中斷1  
  50.         count++;  
  51.         if(count==2)      //2次循環為發動機轉一圈  
  52.         {   
  53.                 count=1;     //初始化計數   
  54.                 z++;      //轉圈計數加1
  55.         }      //計數+1  
  56.         EX0=1;       //開外部中斷1  
  57.         return;
  58. }
  59. /*-------------------------------------------------------*/
  60. /*------------------------LCD顯示------------------------*/
  61. void displaytolcd()
  62. {  
  63.         write_command(0x80+0x06);     //向LCD1602寫命令80H  
  64.         for (i=6;i<10;i++)   //更新部分字符
  65.         {   
  66.                 write_data(display[i]);   
  67.                 delay(1);  
  68.         }
  69. } /*-------------------------------------------------------*/  
  70. /*-----------------內部中斷0計時計數程序-----------------*/
  71. void Timer_0(void) interrupt 1
  72. {  
  73.         TH0=0x3c;      //50ms定時  
  74.         TL0=0xb0;  
  75.         msec++;  
  76.         if(msec==20)      //50*20=1S  
  77.         {   
  78. //                displaytolcd();   
  79.                 msec=0;   
  80.                 zhuan=30*z;   
  81.                 z=0;
  82. //                TH0=0x3c;      //相比原程序,這里重新計數器賦初值50ms定時  
  83. //                TL0=0xb0;  
  84.         }
  85. }
  86. /*-------------------------------------------------------*/
  87. /*----------------------端口初始化-----------------------*/
  88. void int_all()
  89. {  
  90.         z=0;       //初始化z的值  
  91.         count=0;      //初始化count的值  
  92.         zhuan=0;      //初始化轉的值  
  93.         rw=0;       //選擇LCD寫數據指令  
  94.         delay(15);      //延時15ms  
  95.         write_command(0x38);     //向LCD1602寫命令38H  
  96.         delay(5);      //延時5ms  
  97.         write_command(0x01);     //向LCD1602寫命令0EH  
  98.         delay(5);      //延時5ms  
  99.         write_command(0x0c);     //向LCD1602寫命令0EH  
  100.         delay(5);      //延時5ms  
  101.         write_command(0x06);     //向LCD1602寫命令06H
  102.         TMOD=0x01;      //內部中斷定時器選擇  
  103.         TH0=0x3c;      //50ms定時  
  104.         TL0=0xb0;  
  105.         EA=1;       //開中斷總開關  
  106.         ET0=1;       //開內部中斷0
  107.         TR0=1;       //計時器開始工作  
  108.         IT0=1;       //外部中斷0為下降沿觸發  
  109.         EX0=1;       //開外部中斷0
  110. }
  111. /*-------------------------------------------------------*/
  112. /*-----------------------數據處理------------------------*/
  113. void  disp_count()
  114. {  
  115.         if(zhuan<1000)
  116.                 display[6]=' ';//不顯示
  117.         else
  118.                 display[6]=(zhuan/1000%10+'0');    //轉換轉速的千位  
  119.         if(zhuan<100)
  120.                 display[7]=' ';//不顯示
  121.         else
  122.                 display[7]=(zhuan/100%10+'0');    //轉換轉速的百位  
  123.         if(zhuan<10)
  124.                 display[8]=' ';//不顯示
  125.         else
  126.                 display[8]=(zhuan/10%10+'0');    //轉換轉速的十位   
  127.         display[9]=(zhuan%10+'0');            //轉換轉速的個位
  128. }
  129. /*-------------------------------------------------------*/
  130. /*------------------------主函數-------------------------*/
  131. void main()
  132. {         
  133.         int_all();     //全局初始化  
  134.         write_command(0x80);     //向LCD1602寫命令80H  
  135.         for (i=0;i<16;i++)   //寫入固定字符  
  136.         {   
  137.                 write_data(display[i]);   
  138.         }
  139.         while(1)  
  140.         {
  141.                 disp_count();     //數據處理
  142.                 displaytolcd();     //LCD顯示  
  143.         }
  144. }
復制代碼



回復

使用道具 舉報

5#
ID:704156 發表于 2020-4-2 12:09 | 只看該作者
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品99久久久久久动医院 | 超碰97免费在线 | 日韩精品成人一区二区三区视频 | 国产欧美精品一区二区色综合朱莉 | 欧美成人aaa级毛片在线视频 | 精品成人免费一区二区在线播放 | 81精品国产乱码久久久久久 | 91精品国产欧美一区二区 | 国产美女黄色 | 中文字幕 在线观看 | 免费在线观看黄网站 | 中文在线а√在线8 | 亚洲成人精品 | 福利片在线观看 | 久久爱黑人激情av摘花 | 久久精品欧美一区二区三区不卡 | 亚洲视频免费观看 | 日本午夜免费福利视频 | 中文字幕国产 | 国产精品亚洲综合 | 超碰8 | 亚洲一区二区三区免费在线观看 | 免费一区 | 久久高清免费视频 | 欧美日韩一区二区电影 | 亚洲精品一二三 | 在线欧美 | 91av久久久 | 9久久婷婷国产综合精品性色 | 国产二区精品视频 | 国产视频第一页 | 91高清在线| 福利视频网址 | 嫩草网| www.国产 | 亚洲国产成人精品女人久久久 | 日韩精品视频网 | 精品国产91| 亚洲啪啪 | 久久久久无码国产精品一区 | 中文字幕视频三区 |