找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

可否請大佬幫忙看看proteus仿真哪里出了問題,lcd不顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:867316 發(fā)表于 2020-12-27 10:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
附上單片機(jī)的程序,希望大家?guī)蛶臀襬rz指出錯誤和改正方法

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



  3. sbit rs=P2^5;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
  4. sbit rw=P2^6;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
  5. sbit e =P2^7;         //片選信號   下降沿觸發(fā)

  6. unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
  7. unsigned int time[6]={0};


  8. /***********************1ms延時函數(shù)*****************************/
  9. void delay_1ms(uint q)
  10. {
  11.         uint i,j;
  12.         for(i=0;i<q;i++)
  13.                 for(j=0;j<120;j++);
  14. }

  15.                                           
  16. /************ 延時函數(shù)  *****************/
  17. void delay_uint(uint z)
  18. {
  19.    while(z--);
  20. }


  21. /************ 寫命令函數(shù)  *****************/
  22. void write_com(uchar com)
  23. {

  24.    P0=com;
  25.    rw=0;
  26.    rs=0;
  27.    delay_uint(25);
  28.    e=1;
  29.    delay_uint(50);
  30.    e=0;
  31. }
  32. /************ 寫數(shù)據(jù)函數(shù)  *****************/
  33. void write_data(uchar dat)
  34. {

  35.    P0=dat;;
  36.    rw=0;
  37.    rs=1;
  38.    delay_uint(25);
  39.    e=1;
  40.    delay_uint(50);
  41.    e=0;
  42. }

  43. /**********************************************************
  44. *函數(shù)名: addr_12864
  45. *功能:寫地址
  46. *說明:寫漢字時要寫個地址
  47. *輸入:無
  48. *返回:無
  49. **********************************************************/
  50. void addr_12864(uchar hang,uchar lie)          //地址轉(zhuǎn)換
  51. {
  52.         uchar address;
  53.         switch(hang)
  54.         {
  55.                 case 1: address=0x80 + lie ;
  56.                                 break;
  57.                 case 2: address=0x90 + lie ;
  58.                                 break;
  59.                 case 3: address=0x88 + lie ;
  60.                                 break;
  61.                 case 4: address=0x98 + lie ;
  62.                                 break;
  63.                 default :
  64.                                 break;
  65.         }        
  66.         write_com(address);
  67. }

  68. /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
  69. void write_sfm3(uchar hang,uchar add,uint date)
  70. {
  71.         addr_12864(hang,add);         
  72.         write_data(':');
  73.         write_data(0x30+date/100%10);
  74.         write_data(0x30+date/10%10);
  75.         write_data(0x30+date%10);        
  76. }


  77. /**********************************************************
  78. *函數(shù)名: write_string
  79. *功能:在12864上顯示字符數(shù)據(jù)
  80. *說明:
  81. *輸入:無
  82. *返回:無
  83. **********************************************************/

  84. void write_string(uchar hang,uchar lie,uchar *p)
  85. {
  86.         addr_12864(hang,lie);          //地址轉(zhuǎn)換
  87.         while(*p != '\0')
  88.         {
  89.                 write_data(*p);
  90.                 p++;
  91.                 delay_uint(50);
  92.         }
  93. }

  94. /********************************************************************
  95. * 名稱 : init_12864()
  96. * 功能 : 初始化函數(shù)
  97. * 輸入 : cmdcode
  98. * 輸出 : 無
  99. ***********************************************************************/
  100. void init_12864()
  101. {  
  102.     write_com(0x30);
  103.     write_com(0x0c);
  104.     write_com(0x01);
  105.     delay_uint(5000);
  106.         write_string(1,0,"               ");
  107.         write_string(2,0," 心率:000/min  ");
  108.         write_string(3,0,"               ");
  109.         write_string(4,0,"               ");
  110. }

  111. /*************定時器0初始化程序***************/
  112. void time_init()         
  113. {
  114.         EA   = 1;                   //開總中斷
  115.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  116.         ET0  = 1;                  //開定時器0中斷
  117.         TR0  = 1;                  //允許定時器0定時
  118. }


  119. /***********外部中斷0初始化程序****************/
  120. void init_int0()          //外部中斷0初始化程序
  121. {
  122.         EX0=1;                          //允許外部中斷0中斷
  123.         EA=1;                           //開總中斷
  124.         IT0 = 1;                   //外部中斷0負(fù)跳變中斷
  125. }

  126. /****************主函數(shù)***************/
  127. void main()
  128. {        
  129.         init_12864();     //12864初始化        
  130.         time_init();      //初始化定時器
  131.         init_int0();          //外部中斷0初始化程序
  132.         while(1)
  133.         {                        
  134.                 if(displayOK==0)//如果顯示關(guān)
  135.                 {
  136.                          rate = 0;
  137.                 }
  138.                 else//如果顯示開
  139.                 {
  140.                         rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
  141.                 }
  142.                 write_sfm3(2,5,rate);

  143.                 delay_1ms(300);
  144.         }
  145. }

  146. void int0() interrupt 0
  147. {
  148.         if(timecount<8)   //當(dāng)連續(xù)兩次檢測時間間隔小于8*50ms=400ms不處理
  149.         {
  150.                         TR0=1;//開定時器
  151.         }
  152.         else
  153.         {
  154.                 time[i]=timecount*50+TH0+TL0;//算出間隔時間
  155.                 TH0 = 0x3c;
  156.                 TL0 = 0xb0;     // 50ms         12M
  157.                 timecount=0;//50ms計數(shù)清零
  158.                 i++;
  159.                 if(i==6)//記錄到超過等于6次時間
  160.                 {
  161.                         i=1;//計數(shù)從1開始
  162.                         displayOK=1;    //測得5次開始顯示?
  163.                 }                                                               
  164.         }
  165. }

  166. /*************定時器0中斷服務(wù)程序***************/
  167. void time0_int() interrupt 1
  168. {        
  169.         TH0 = 0x3c;
  170.         TL0 = 0xb0;     // 50ms         12M
  171.         timecount++;//每50ms一次計數(shù)
  172.         if(timecount>25)     //當(dāng)超過25*50ms=1.5s沒有檢測到信號停止顯示
  173.         {
  174.                         i=0;//數(shù)據(jù)個數(shù)清零
  175.                         timecount=0;//50ms計數(shù)清零
  176.                         displayOK=0;//顯示關(guān)
  177.                         TR0=0;//定時器關(guān)
  178.                         TH0 = 0x3c;
  179.                         TL0 = 0xb0;     // 50ms         12M
  180.         }
  181. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:342822 發(fā)表于 2020-12-27 14:38 | 只看該作者
本帖最后由 taotie 于 2020-12-27 14:49 編輯

附上單片機(jī)的程序,希望大家?guī)蛶臀襬rz指出錯誤和改正方法

#include <reg52.h>                 //調(diào)用單片機(jī)頭文
#define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535
#define uchar unsigned char



cd按程序里設(shè)置接線


sbit rs=P2^5;        
sbit rw=P2^6;         
sbit e =P2^7;  

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:342822 發(fā)表于 2020-12-27 14:56 | 只看該作者
這個  time是變量?為什么程序中沒有定義,是否寫錯!應(yīng)該是 timecount
    time=timecount*50+TH0+TL0;//算出間隔時間
                TH0 = 0x3c;
                TL0 = 0xb0;     // 50ms         12M

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表