国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: 51單片機DS1621+MAX1241電壓溫度采樣程序Proteus仿真和源程序 [打印本頁]

作者: eng    時間: 2021-7-6 17:29
標題: 51單片機DS1621+MAX1241電壓溫度采樣程序Proteus仿真和源程序
DS1621+MAX1241(12位串行ADC)電壓溫度采樣程序Proteus仿真 LCD12864顯示
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機部分源程序如下:(完整源碼請下載附件)
  1. ****************************************************
  2.        字符為16*16顯示,分為兩個部分寫入32個字節
  3.        前16個字節寫入第一頁(16*8),后16個字節寫入
  4.            第二頁(16*8)
  5.            左側寫入"歡迎",右側寫入"使用"
  6. *****************************************************/
  7. C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
  8.   {
  9.    uchar k;
  10.    C_Pagenum=PAGEADD|C_Pagenum;
  11.    C_Tiernum=TIERADD|C_Tiernum;
  12.    WRCommand_L(C_Pagenum);
  13.    WRCommand_L(C_Tiernum);
  14.    for(k=0;k<16;k++)
  15.       {
  16.        WRdata_L(table2[C_Temp*32+k]);
  17.              };
  18.    C_Pagenum=C_Pagenum+1;
  19.    WRCommand_L(C_Pagenum);
  20.    WRCommand_L(C_Tiernum);
  21.    for(k=0;k<16;k++)
  22.       {
  23.        WRdata_L(table2[C_Temp*32+k+16]);
  24.            };
  25.    }

  26. C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
  27.   {
  28.    uchar k;
  29.    C_Pagenum=PAGEADD|C_Pagenum;
  30.    C_Tiernum=TIERADD|C_Tiernum;
  31.    WRCommand_R(C_Pagenum);
  32.    WRCommand_R(C_Tiernum);
  33.    for(k=0;k<16;k++)
  34.       {
  35.        WRdata_R(table2[C_Temp*32+k]);
  36.              };
  37.    C_Pagenum=C_Pagenum+1;
  38.    WRCommand_R(C_Pagenum);
  39.    WRCommand_R(C_Tiernum);
  40.    for(k=0;k<16;k++)
  41.       {
  42.        WRdata_R(table2[C_Temp*32+k+16]);
  43.              };
  44.   }

  45. /****************************************
  46.    寫入西文字符,共11個字符,左側寫入6個
  47.    右側寫入5個,左側起始從16開始,右側從
  48.    0開始
  49. *****************************************/

  50. E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
  51.   {
  52.    uchar k;
  53.    WRCommand_L(PAGEADD|E_Pagenum);
  54.    WRCommand_L(TIERADD|E_Tiernum);
  55.    for(k=0;k<8;k++)
  56.           {
  57.            WRdata_L(table1[E_Temp*8+k]);
  58.            };
  59.    }   
  60. E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
  61.    {
  62.    uchar k;
  63.    WRCommand_R(PAGEADD|E_Pagenum);
  64.    WRCommand_R(TIERADD|E_Tiernum);
  65.    for(k=0;k<8;k++)
  66.           {
  67.            WRdata_R(table1[E_Temp*8+k]);
  68.            };
  69.            }

  70. /*********************************
  71.            清除所有顯示RAM內容
  72. **********************************/

  73. CLR_DisplayRAM()
  74.    {
  75.     uchar C_page,i,k;
  76.     for(i=0;i<8;i++)
  77.            {
  78.             C_page=PAGEADD|i;//清除起始頁為0
  79.             WRCommand_L(C_page);//清除起始頁寫入
  80.                 WRCommand_L(TIERADD);//清除起始行地址寫入
  81.                 WRCommand_R(C_page);
  82.                 WRCommand_R(TIERADD);
  83.                 for(k=0;k<64;k++)
  84.                    {                          
  85.                         WRdata_L(0x00);
  86.                         WRdata_R(0x00);//lcm的ram自動加一,只許循環64次即可   
  87.                          };
  88.                  };
  89.     }

  90. /*********************************
  91.        初始化 設置啟使行
  92. **********************************/
  93. void Init_LCD(void)
  94.    {
  95.         CLR_DisplayRAM();//清除所有顯示寄存器
  96.         WRCommand_L(DIS_STARADD);
  97.         WRCommand_R(DIS_STARADD);//設置顯示起始行地址
  98.         WRCommand_L(0x3f);
  99.         WRCommand_R(0x3f);//開顯示
  100.     }
  101. /***************************************
  102.     max1241讀轉換結果
  103. ****************************************/
  104. uint read_max1241()
  105.          {
  106.           uint voltage_temp=0;
  107.           uchar ucloop=12;
  108.           cs=High;
  109.           //dout=low;
  110.           sclk=Low;
  111.           cs=Low;
  112.       while(dout==0);//EOC信號為高表示轉換結束
  113.           sclk=High;
  114.           sclk=Low;
  115.       while(ucloop--)
  116.            {
  117.                 sclk=High;//上升沿數據穩定并讀出
  118.                 voltage_temp<<=1;
  119.             if(dout==1)
  120.             voltage_temp+=1;
  121.             sclk=Low;
  122.                 };         
  123.           //sclk=low;
  124.           cs=High;
  125.           return voltage_temp;
  126.           }

  127. main()
  128.   {
  129.    uchar a=0,temp=0,b=0,number=0,pagenum=0;
  130.    uchar etable[]={0,0,0,0,0,45,53,60,51,63,61,53,10,69,67,53};//Welcome use
  131.    uchar ttable[]={42,57,61,53,19,10,2,0,0,6,18,1,1,18,0,7};//Time:2006/11/07
  132.    char count_remain=0,count_c=0;
  133.    bit flag=1;
  134.    char temperature_buf[2]={0};
  135.    uchar temperature_display[8]={0};
  136.    //uchar voltage=0; //測試0831時使用
  137.    double voltage=0;
  138.    double temp_buffer=0;
  139.    cs=High;
  140.    sclk=High;
  141.    Init_LCD();
  142.    I2C_init();
  143.    DS1621_init();//初始化
  144.    DS1621_start();//開始溫度采集

  145.    /***************************************
  146.    利用開機顯示時間(大概三秒)空讀一次DS1621
  147.    ***************************************/
  148.    for(b=0;b<2;b++)
  149.       {
  150.       for(number=0;number<20;number++)
  151.              {
  152.               //中文顯示:歡迎使用液晶模塊
  153.                pagenum=1;//在第二行開始顯示
  154.               for(a=0;a<4;a++)
  155.                 {
  156.                  C_display_L(pagenum,a*16,a);
  157.                  C_display_R(pagenum,a*16,a+4);
  158.                  };
  159.         
  160.                   //英文顯示:Welcome use                  
  161.           pagenum=5;//在第六行顯示
  162.           for(a=0;a<3;a++)
  163.              {
  164.               E_Display_L(pagenum,(a+5)*8,etable[a+5]);
  165.               };
  166.           for(a=0;a<8;a++)
  167.              {
  168.               E_Display_R(pagenum,a*8,etable[a+8]);
  169.               };
  170.         
  171.                   //顯示制作時間:Time:2006/11/07                              
  172.           pagenum=7;//在第八行顯示
  173.           for(a=0;a<8;a++)
  174.              {
  175.               E_Display_L(pagenum,a*8,ttable[a]);
  176.               E_Display_R(pagenum,a*8,ttable[a+8]);
  177.               }         
  178.               Delay_nms(100);
  179.                   };
  180.                   if(flag)
  181.                           {
  182.               read_temperature(temperature_buf);//在轉到下一個顯示界面之前空讀一次
  183.                           read_count_remain();
  184.                           read_count_c();
  185.                           DS1621_start();
  186.               flag=0;
  187.                      };
  188.              };  

  189.         WRCommand_L(0x3e);
  190.         WRCommand_R(0x3e);
  191.         CLR_DisplayRAM();  //清除顯示ram
  192.         WRCommand_L(0x3f);
  193.         WRCommand_R(0x3f);   
  194.                        
  195.     while(1)
  196.            {
  197.             while(read_temperature(temperature_buf)==0);//讀溫度值(兩字節有符數),并檢測應答位,只使用第一字節
  198.             count_remain=read_count_remain();//讀斜率
  199.                 count_c=read_count_c();//讀計數器
  200.                 temp_buffer = temperature_buf[0] -0.75 + (count_c-count_remain) / (double)count_c;
  201.                 DS1621_start();//讀完數據后,重新開始一次溫度轉化
復制代碼
完整單片機程序源碼和仿真文件.zip (118.1 KB, 售價: 3 E幣)





歡迎光臨 ELEOK (http://m.afoofa.cn/) Powered by Discuz! X5.0