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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機可燃氣體報警器仿真程序 LCD1202顯示無法改變?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1022621 發表于 2022-5-15 08:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
希望各位大佬幫幫我,1602顯示的內容無法改變,是因為啥啊?

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

  4. #include<intrins.h>
  5. sbit beep = P1^7;   //蜂鳴器IO口定義
  6. uchar a_a;
  7. bit flag_300ms ;

  8. sbit CS=P1^0;                //CS定義為P1口的第0位腳,連接ADC0832CS腳
  9. sbit CLK=P1^1;                //SCL定義為P1口的第1位腳,連接ADC0832CLK腳
  10. sbit DO=P1^2;                //DO定義為P1口的第2位腳,連接ADC0832DO腳
  11. //  按鍵的IO變量的定義
  12. uchar key_can;                 //按鍵值的變量


  13. uchar menu_1;        //菜單設計的變量
  14. uint TRX_h;
  15. uint TRX;                        //天燃氣
  16. /***************************************************************
  17. * 名稱 : delay_1ms()
  18. * 功能 : 延時1ms函數
  19. * 輸入 : q
  20. * 輸出 : 無
  21. ****************************************************************/
  22. void delay_1ms(uint q)
  23. {
  24.         uint i,j;
  25.         for(i=0;i<q;i++)
  26.                 for(j=0;j<120;j++);
  27. }


  28. uchar code table_num[]="0123456789abcdefg";

  29. //這三個引腳參考資料
  30. sbit rs=P2^7;         //1602數據/命令選擇引腳 H:數據              L:命令
  31. sbit rw=P2^6;         //1602讀寫引腳                 H:數據寄存器          L:指令寄存器
  32. sbit e =P2^5;         //1602使能引腳          下降沿觸發
  33. /********************************************************************
  34. * 名稱 : delay_uint()
  35. * 功能 : 小延時。
  36. * 輸入 : 無
  37. * 輸出 : 無
  38. ***********************************************************************/
  39. void delay_uint(uint q)
  40. {
  41.         while(q--);
  42. }

  43. /********************************************************************
  44. * 名稱 : write_com(uchar com)
  45. * 功能 : 1602命令函數
  46. * 輸入 : 輸入的命令值
  47. * 輸出 : 無
  48. ***********************************************************************/
  49. void write_com(uchar com)
  50. {
  51.         e=0;
  52.         rs=0;
  53.         rw=0;
  54.         P0=com;
  55.         delay_uint(25);
  56.         e=1;
  57.         delay_uint(100);
  58.         e=0;
  59. }

  60. /********************************************************************
  61. * 名稱 : write_data(uchar dat)
  62. * 功能 : 1602寫數據函數
  63. * 輸入 : 需要寫入1602的數據
  64. * 輸出 : 無
  65. ***********************************************************************/
  66. void write_data(uchar dat)
  67. {
  68.         e=0;
  69.         rs=1;
  70.         rw=0;
  71.         P0=dat;
  72.         delay_uint(25);
  73.         e=1;
  74.         delay_uint(100);
  75.         e=0;       
  76. }


  77. /***********************lcd1602上顯示兩位十進制數************************/
  78. void write_sfm2(uchar hang,uchar add,uint date)
  79. {
  80.         if(hang==1)   
  81.                 write_com(0x80+add);
  82.         else
  83.                 write_com(0x80+0x40+add);
  84.         write_data(0x30+date/10%10);
  85.         write_data(0x30+date%10);       
  86. }


  87. /***********************lcd1602上顯示兩位十進制數************************/
  88. void write_sfm_TRX(uchar hang,uchar add,uint date)
  89. {
  90.         if(hang==1)   
  91.                 write_com(0x80+add);
  92.         else
  93.                 write_com(0x80+0x40+add);
  94.         write_data(0x30+date/100%10);
  95.         write_data(0x30+date/10%10);
  96.         write_data(0x30+date%10);       
  97. }




  98. /***********************lcd1602上顯示這字符函數************************/
  99. void write_string(uchar hang,uchar add,uchar *p)
  100. {
  101.         if(hang==1)   
  102.                 write_com(0x80+add);
  103.         else
  104.                 write_com(0x80+0x40+add);
  105.                 while(1)                                                                                                                 
  106.                 {
  107.                         if(*p == '\0')  break;
  108.                         write_data(*p);
  109.                         p++;
  110.                 }       
  111. }
  112. /***********************lcd1602初始化設置************************/
  113. void init_1602()        //lcd1602初始化
  114. {
  115.         write_com(0x38);       
  116.         write_com(0x0c);
  117.         write_com(0x06);
  118.         delay_uint(1000);
  119.         write_string(1,0,"    CH4:000 PPM     ");       
  120.         write_string(2,0,"Set CH4:000 PPM     ");       
  121. }

  122. /***********讀數模轉換數據********************************************************/       
  123. //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的
  124.                                                 //  1  0  0 通道
  125.                                                 //  1  1  1 通道
  126. unsigned char ad0832read(bit SGL,bit ODD)
  127. {
  128.         unsigned char i=0,value=0,value1=0;               
  129.                 CLK=1;
  130.                 DO=1;
  131.                 CS=0;                //開始
  132.                 CLK=0;                //第一個上升沿       
  133.                 CLK=1;
  134.                 DO=ODD;
  135.                 CLK=0;          //第二個上升沿
  136.                 CLK=1;
  137.                 DO=SGL;
  138.                 CLK=0;            //第三個上升沿       
  139.                 DO=1;
  140.                 for(i=0;i<8;i++)
  141.                 {
  142.                         CLK=1;
  143.                         CLK=0; //開始從第四個下降沿接收數據
  144.                         value<<=1;
  145.                         if(DO)
  146.                                 value++;                                               
  147.                 }
  148.                 for(i=0;i<8;i++)
  149.                 {                        //接收校驗數據
  150.                         value1>>=1;
  151.                         if(DO)
  152.                                 value1+=0x80;
  153.                         CLK=1;
  154.                         CLK=0;
  155.                 }
  156.                 CLK=1;       
  157.                 if(value==value1)                                //與校驗數據比較,正確就返回數據,否則返回0       
  158.                         return value;
  159.         return 0;
  160. }
  161. /*************定時器0初始化程序***************/
  162. void time_init()          
  163. {
  164.         EA   = 1;                   //開總中斷
  165.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  166.         ET0  = 1;                  //開定時器0中斷
  167.         TR0  = 1;                  //允許定時器0定時
  168. }
  169. /********************獨立按鍵程序*****************/
  170. uchar key_can;         //按鍵值

  171. void key()         //獨立按鍵程序
  172. {
  173.         static uchar key_new;
  174.         key_can = 20;                   //按鍵值還原
  175.         P1 |= 0xc0;
  176.         if((P1 & 0xc0) != 0xc0)                //按鍵按下
  177.         {
  178.                 delay_1ms(1);                     //按鍵消抖動
  179.                 if(((P1 & 0xc0) != 0xc0) && (key_new == 1))
  180.                 {                                                //確認是按鍵按下
  181.                         key_new = 0;
  182.                         switch(P1 & 0xc0)
  183.                         {
  184.                                 case 0x10: key_can = 2; break;           //得到k3鍵值
  185.                                 case 0x20: key_can = 1; break;           //得到k4鍵值
  186.                         }               
  187.                 }                       
  188.         }
  189.         else
  190.                 key_new = 1;       
  191. }

  192. /****************按鍵顯示函數***************/
  193. void key_with()
  194. {
  195.         if(key_can == 1)
  196.         {
  197.                 TRX_h ++ ;                        //設置天燃氣加1
  198.                 if(TRX_h >= 999)
  199.                         TRX_h = 999;
  200.         }
  201.         if(key_can == 2)                         //設置天燃氣減1
  202.         {
  203.                 TRX_h -- ;                       
  204.                 if(TRX_h <= 1)
  205.                         TRX_h = 1;
  206.         }
  207.         write_sfm_TRX(2,7,TRX_h);           //顯示濕度
  208. }
  209. /****************報警函數***************/
  210. void clock_h_l()
  211. {
  212.         if(TRX >= TRX_h)
  213.         {
  214.                 beep = ~beep;           //蜂鳴器報警
  215.         }
  216.         else
  217.         {
  218.                 beep = 1;
  219.         }
  220.        
  221. }
  222. /******************主程序**********************/          
  223. void main()
  224. {               
  225.         beep = 0;                                //開機叫一聲   
  226.         delay_1ms(150);
  227.         P0 = P1 = P2 = P3 = 0xff;
  228.         time_init();          //定時器初始化
  229.         init_1602();        //lcd1602初始化
  230.         write_sfm_TRX(2,7,TRX_h);                           //顯示天燃氣
  231.         while(1)
  232.         {
  233.                 if(flag_300ms == 1)
  234.                 {
  235.                         flag_300ms = 0;
  236.                         if(menu_1 == 0)           //開始界面顯示的內容
  237.                         {               
  238.                                 TRX = ad0832read(1,0);       
  239.                                 TRX = TRX * 450 / 255.0;
  240.                             TRX = TRX - 100;              //首先減去零點漂移,
  241.                                 write_sfm_TRX(1,7,TRX);                           //顯示天燃氣
  242.                         }       
  243.                         clock_h_l();   //報警函數
  244.                 }
  245.                 key();
  246.                 if(key_can < 10)
  247.                 {
  248.                         key_with();                            //設置報警溫度       
  249.                 }
  250.                 delay_1ms(1);
  251.         }
  252. }
  253. /*************定時器0中斷服務程序***************/
  254. void time0_int() interrupt 1
  255. {       
  256.         static uchar value;
  257.         TH0 = 0x3c;
  258.         TL0 = 0xb0;     // 50ms
  259.         value ++;         
  260.         if(value % 6 == 0)
  261.         {
  262.                 flag_300ms = 1;           //300ms       
  263.                 value = 0;       
  264.         }
  265. }
復制代碼


可燃氣體報警器.zip

70.71 KB, 下載次數: 8

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

使用道具 舉報

沙發
ID:688692 發表于 2022-5-15 20:34 | 只看該作者
分開調試啊,先測試write_sfm_TRX(1,7,5);  看看能不能顯示5.確定是顯示驅動的問題還是數據采集的問題。
回復

使用道具 舉報

板凳
ID:1026496 發表于 2022-5-15 21:19 | 只看該作者
write_sfm_TRX(2,7,TRX_h);先確定這個函數有沒有問題
回復

使用道具 舉報

地板
ID:1026496 發表于 2022-5-15 21:20 | 只看該作者
可以在主函數 初始化為1個值然后看下這個值顯示的對不對。
回復

使用道具 舉報

5#
ID:123289 發表于 2022-5-16 11:24 | 只看該作者
1、設計制個寄存器(變量),取名為XX吧。
2、先完成從XX中取數據顯示,不要考慮其它,這樣就簡單化了。
3、完成2、后,只要改變XX值就可以達成其它目的了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久久国产 | 美女一级毛片 | 亚洲欧洲一区二区 | 一区二区三区网站 | 欧美 日韩 国产 成人 在线 91 | 国产原创在线观看 | 欧美电影免费观看高清 | 一区二区三区高清不卡 | 视频在线日韩 | 欧美精品一区二区在线观看 | 国产精品亚洲二区 | 久草在线免费资源 | 亚洲人成人一区二区在线观看 | 黄色毛片在线播放 | 久久久久久久久综合 | 水蜜桃久久夜色精品一区 | 国产精品欧美一区二区 | 成人av免费网站 | 国产丝袜一区二区三区免费视频 | 91国在线| 日本一区二区高清视频 | 狠狠操天天操 | 欧美日韩亚洲视频 | 精产国产伦理一二三区 | 亚洲五码在线 | 视频在线一区二区 | 草久久免费视频 | 国产精品.xx视频.xxtv | 一区影院| 精品一区久久 | 亚洲 欧美 另类 综合 偷拍 | 伊人网伊人 | 亚洲永久入口 | 国产精品明星裸体写真集 | 日韩网站在线观看 | 欧美一区二 | 99日韩 | 日本免费视频 | 免费观看黄a一级视频 | 中文字幕视频在线观看 | 小早川怜子xxxxaⅴ在线 |