找回密码
 注册

QQ登录

只需一步,快速开始

搜索

51单片机DS1621+MAX1241电压温度采样程序Proteus仿真和源程序

[复制链接]
eng 发表于 2021-7-6 17:29:03 | 显示全部楼层 |阅读模式
DS1621+MAX1241(12位串行ADC)电压温度采样程序Proteus仿真 LCD12864显示
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.gif

单片机部分源程序如下:(完整源码请下载附件)
  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币)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-22 04:10

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表