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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 818|回復: 0
打印 上一主題 下一主題
收起左側(cè)

單片機設計求助,現(xiàn)在lcd顯示脈搏特別奇怪,數(shù)字特別小,特別容易報警?

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1075720 發(fā)表于 2023-5-12 16:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


單片機源程序如下:
  1. #include <reg52.h>             //調(diào)用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義    變量范圍0~255
  3. #define uint  unsigned int     //無符號整型 宏定義    變量范圍0~65535

  4. uchar menu_1;           //設置不同報警參數(shù)的變量
  5. uchar flag_200ms ;        //200毫秒的變量

  6. unsigned char i=0,rate=0,timecount=0;
  7. unsigned int time[6]={0};
  8. uchar rate_l=2,rate_h=200;   //脈搏上下限報警值

  9. sbit rs=P1^0;     //寄存器選擇信號 H:數(shù)據(jù)寄存器      L:指令寄存器
  10. sbit rw=P1^1;     //寄存器選擇信號 H:數(shù)據(jù)寄存器      L:指令寄存器
  11. sbit e =P1^2;     //片選信號   下降沿觸發(fā)
  12. sbit beep = P3^7;       //蜂鳴器IO口定義,仿真
  13. sbit key1 = P3^6;        //按鍵IO口定義,仿真
  14. sbit key2 = P3^5;        //按鍵IO口定義,仿真
  15. sbit key3 = P3^4;        //按鍵IO口定義,仿真

  16. /***********************1ms延時函數(shù)*****************************/
  17. void delay_1ms(uint q)
  18. {
  19.     uint i,j;
  20.     for(i=0;i<q;i++)
  21.         for(j=0;j<120;j++);
  22. }

  23. /********************************************************************
  24. * 名稱 : delay_uint()
  25. * 功能 : 小延時。
  26. * 輸入 : 無
  27. * 輸出 : 無
  28. ***********************************************************************/
  29. void delay_uint(uint q)
  30. {
  31.     while(q--);
  32. }

  33. /********************************************************************
  34. * 名稱 : write_com(uchar com)
  35. * 功能 : 1602指令函數(shù)
  36. * 輸入 : 輸入的指令值
  37. * 輸出 : 無
  38. ***********************************************************************/
  39. void write_com(uchar com)
  40. {
  41.      rs=0;         //寫指令
  42.     rw=0;         //對1602寫操作
  43.     P0=com;         //P0口對1602寫指令
  44.     delay_uint(25);
  45.     e=1;         //e=1使能信號
  46.     delay_uint(100);   //延時一下等1602完成操作
  47.     e=0;
  48. }

  49. /********************************************************************
  50. * 名稱 : write_data(uchar dat)
  51. * 功能 : 1602寫數(shù)據(jù)函數(shù)
  52. * 輸入 : 需要寫入1602的數(shù)據(jù)
  53. * 輸出 : 無
  54. ***********************************************************************/
  55. void write_data(uchar dat)
  56. {
  57.      rs=1;         //寫數(shù)據(jù)
  58.     rw=0;         //對1602寫操作
  59.     P0=dat;          //P0口對1602寫數(shù)據(jù)
  60.     delay_uint(25);
  61.     e=1;         //e=1使能信號
  62.     delay_uint(100);   //延時一下等1602完成操作
  63.     e=0;   
  64. }

  65. /********************************************************************
  66. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  67. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  68.           write_string(1,5,"ab cd ef;")
  69. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  70. * 輸出 : 無
  71. ***********************************************************************/
  72. void write_string(uchar hang,uchar add,uchar *p)
  73. {
  74.     if(hang==1)   
  75.         write_com(0x80+add);       //寫1602第一行的地址
  76.     else
  77.         write_com(0x80+0x40+add);   //寫1602第二行的地址
  78.     while(1)                                                         
  79.     {
  80.         if(*p == '\0')  break;    //\0字符串的結(jié)尾標志  break結(jié)束while循環(huán) 結(jié)束寫字符
  81.         write_data(*p);        //寫數(shù)據(jù)
  82.         p++;                //指針地址加1  
  83.     }   
  84. }

  85. /*****************控制光標函數(shù)********************/
  86. void write_guanbiao(uchar hang,uchar add,uchar date)
  87. {        
  88.     if(hang==1)   
  89.         write_com(0x80+add);
  90.     else
  91.         write_com(0x80+0x40+add);
  92.     if(date == 1)
  93.         write_com(0x0f);     //顯示光標并且閃爍   
  94.     else
  95.         write_com(0x0c);   //關(guān)閉光標
  96. }   

  97. /***********************lcd1602上顯示3位十進制數(shù)************************/
  98. void write_lcd3(uchar hang,uchar add,uint date)
  99. {
  100.     if(hang==1)   
  101.         write_com(0x80+add);       //寫1602第一行的地址
  102.     else
  103.         write_com(0x80+0x40+add);  //寫1602第二行的地址
  104.     write_data(0x30+date/100%10);    //顯示百位數(shù),加0x30轉(zhuǎn)換為ASCII字符
  105.     write_data(0x30+date/10%10);    //顯示十位數(shù)
  106.     write_data(0x30+date%10);       //顯示個位數(shù)   
  107. }

  108. /***********************lcd1602初始化設置************************/
  109. void init_1602()
  110. {
  111.     write_com(0x38);  //顯示模式設置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口 不檢測忙信號
  112.     write_com(0x0c);  //開顯示 不顯示光標
  113.     write_com(0x06);  //當寫一個字符是,地址指針加 1
  114.     write_string(1,0,"    000/min    ");      //初始化1602顯示
  115.     write_string(2,0,"  H:000  L:000  ");      //初始化1602顯示
  116.     write_lcd3(2,4,rate_h);           
  117.     write_lcd3(2,11,rate_l);
  118. }

  119. /*************定時器0初始化程序***************/
  120. void time_init()      
  121. {
  122.     EA   = 1;           //開總中斷
  123.     TMOD = 0X01;      //定時器0工作方式1
  124.     ET0  = 1;          //開定時器0中斷
  125.     TR0  = 1;          //允許定時器0定時
  126. }

  127. /***********外部中斷0初始化程序****************/
  128. void init_int0()      //外部中斷0初始化程序
  129. {
  130.     EX0=1;              //允許外部中斷0中斷
  131.     EA=1;               //開總中斷
  132.     IT0 = 1;           //外部中斷0負跳變中斷
  133. }
  134.   
  135. /********************獨立按鍵程序*****************/
  136. uchar key_can;     //按鍵值

  137. void key()     //獨立按鍵程序
  138. {
  139.     static uchar key_new;        //key_new  這個變量的功能是做按鍵松手檢測的
  140.     key_can = 0;                //按鍵值還原成0
  141.      if(key1 == 0 || key2 == 0 || key3 == 0)        //有按鍵按下
  142.     {
  143.         delay_1ms(1);             //按鍵延時消抖動
  144.         if(key_new == 1)
  145.         {                     
  146.             key_new = 0;        //key_new = 0   說明按鍵已按下
  147.             if(key1 == 0)        //確認是按鍵按下
  148.                 key_can = 1;     //得到按鍵值
  149.             if(key2 == 0)        //確認是按鍵按下
  150.                 key_can = 2;     //得到按鍵值
  151.             if(key3 == 0)        //確認是按鍵按下
  152.                 key_can = 3;     //得到按鍵值
  153.         }            
  154.     }
  155.     else
  156.         key_new = 1;     //key_new = 1   說明按鍵已經(jīng)松開了   
  157. }

  158. /**********************設置函數(shù)************************/
  159. void key_with()
  160. {
  161.     if(key_can == 1)    //設置鍵
  162.     {
  163.         menu_1++;
  164.         if(menu_1 > 2)   
  165.         {
  166.             menu_1 = 0;          //menu_1 = 0 退出設置了,在正常顯示界面下
  167.             init_1602();      //初始化液晶顯示
  168.         
  169.         }
  170.     }
  171. /***************設置*********************/
  172.     if(menu_1 != 0)
  173.     {
  174.         if(menu_1 == 1)          //設置脈搏上限報警值
  175.         {
  176.             if(key_can == 2)    //加鍵
  177.             {
  178.                 rate_h ++;           //設置脈搏上限報警值 加1
  179.                 if(rate_h >= 255)
  180.                     rate_h = 0;
  181.             }        
  182.             if(key_can == 3)    //減鍵      
  183.             {
  184.                 rate_h -- ;           //設置脈搏上限報警值 減1
  185.                 if(rate_h <= rate_l)
  186.                     rate_h = rate_l + 1;    //限制脈搏上限不能低于脈搏下限
  187.             }   
  188.         }
  189.         if(menu_1 == 2)          //設置脈搏下限報警值
  190.         {
  191.             if(key_can == 2)    //加鍵
  192.             {
  193.                 rate_l ++;                   //設置脈搏下限報警值 加1
  194.                 if(rate_l >= rate_h)
  195.                     rate_l = rate_h - 1;   //限制脈搏下限不能高于脈搏上限
  196.             }   
  197.             if(key_can == 3)    //減鍵      
  198.             {
  199.                 if(rate_l == 0)
  200.                     rate_l = 1;
  201.                 rate_l -- ;                  //設置脈搏下限報警值 減1
  202.             }
  203.         }
  204.         write_lcd3(2,4,rate_h);               //顯示上限報警值
  205.         write_lcd3(2,11,rate_l);        //顯示下限報警值
  206.         delay_1ms(10);   
  207.     }
  208. }

  209. /****************報警函數(shù)***************/
  210. void clock_h_l()
  211. {
  212.     if(rate != 0)
  213.     {
  214.         if((rate <= rate_l) || (rate >= rate_h))
  215.         {
  216.             beep = ~beep;       //蜂鳴器報警            
  217.         }
  218.         else
  219.         {
  220.             beep = 1;    //取消報警
  221.         }
  222.     }else
  223.     {
  224.         beep = 1;   //取消報警   
  225.     }
  226.             
  227. }

  228. /****************主函數(shù)***************/
  229. void main()
  230. {   


  231.     init_1602();                    //1602初始化
  232.     time_init();                    //初始化定時器
  233.     init_int0();      //外部中斷0初始化程序
  234.     while(1)
  235.     {            
  236.         key();                     //按鍵函數(shù)
  237.          key_with();                 //按鍵設置函數(shù)
  238.           rate=60000/(time[1]+time[2]+time[3]+time[4]+time[5])/5;      //計算脈搏次數(shù)
  239.             write_lcd3(1,5,rate);     //顯示脈搏
  240.             clock_h_l();             //報警函數(shù)
  241.         delay_1ms(1);          //延時1毫秒
  242.     }
  243. }

  244. void int0() interrupt 0         //外部中斷0,由P3.2端口引入,低電平或下降沿引起
  245. {
  246.     if(timecount<8)   //當連續(xù)兩次檢測時間間隔小于8*50ms=400ms不處理
  247.         {
  248.            TR0=1;//開定時器
  249.         }
  250.     else
  251.     {
  252.          time[i]=timecount*50+TH0+TL0;//算出間隔時間,timecount是50ms計數(shù),每隔50ms timecount加1
  253. //         time[i]=timecount*50+TH0*0.256+TL0/1000;
  254. //         time[i]=TH0*256+TL0;
  255.          TH0 = 0x3c;
  256.          TL0 = 0xb0;     // 50ms         12M
  257.          timecount=0;//50ms計數(shù)清零
  258.           i++;
  259.         if(i==6)//記錄到超過等于6次時間
  260.         {
  261.             i=1;//計數(shù)從1開始
  262.         }
  263.     }                                
  264. }


  265. void time0_int() interrupt 1
  266. {        
  267.         TH0 = 0x3c;
  268.         TL0 = 0xb0;     // 50ms         12M
  269.         timecount++;//每50ms一次計數(shù)
  270.         if(timecount>25)     //當超過25*50ms=1.5s沒有檢測到信號停止顯示
  271.         {
  272.             i=0;//數(shù)據(jù)個數(shù)清零
  273.             timecount=0;//50ms計數(shù)清零
  274.             TR0=0;//定時器關(guān)
  275.             TH0 = 0x3c;
  276.             TL0 = 0xb0;     // 50ms         12M
  277.         }
  278. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产91久久综合桃花 | 国产精品日本一区二区在线播放 | 欧美黄色一区 | 在线一区 | 永久免费在线观看 | 亚洲精品一区二区三区中文字幕 | 91在线看| 成人久久久| 中文字幕不卡在线观看 | 国产精品久久久久久久久久 | 久久夜视频 | 久久国产婷婷国产香蕉 | 在线观看欧美一区 | 一区二区三区日韩 | 欧洲色综合 | 黄色大片免费网站 | 亚洲 日本 欧美 中文幕 | 久久久综合 | 国内精品久久久久久 | 成人精品一区亚洲午夜久久久 | 亚州午夜精品 | 国产亚洲成av人在线观看导航 | 日韩欧美国产一区二区三区 | 午夜视频网 | 91麻豆精品国产91久久久久久 | 国产成人免费 | 夜夜爽99久久国产综合精品女不卡 | 青青草综合网 | 亚洲国产精品一区二区久久 | 精品乱人伦一区二区三区 | 中文精品视频 | 日韩1区| 毛片国产 | 欧美激情一区 | 伊人网综合 | 精品一区久久 | 国产麻豆一区二区三区 | 国产高清在线精品一区二区三区 | 精品国产一区二区在线 | 日韩视频精品在线 | 美女三区 |