DS1621+MAX1241(12位串行ADC)电压温度采样程序Proteus仿真 LCD12864显示
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机部分源程序如下:(完整源码请下载附件)
- ****************************************************
- 字符为16*16显示,分为两个部分写入32个字节
- 前16个字节写入第一页(16*8),后16个字节写入
- 第二页(16*8)
- 左侧写入"欢迎",右侧写入"使用"
- *****************************************************/
- C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
- {
- uchar k;
- C_Pagenum=PAGEADD|C_Pagenum;
- C_Tiernum=TIERADD|C_Tiernum;
- WRCommand_L(C_Pagenum);
- WRCommand_L(C_Tiernum);
- for(k=0;k<16;k++)
- {
- WRdata_L(table2[C_Temp*32+k]);
- };
- C_Pagenum=C_Pagenum+1;
- WRCommand_L(C_Pagenum);
- WRCommand_L(C_Tiernum);
- for(k=0;k<16;k++)
- {
- WRdata_L(table2[C_Temp*32+k+16]);
- };
- }
- C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
- {
- uchar k;
- C_Pagenum=PAGEADD|C_Pagenum;
- C_Tiernum=TIERADD|C_Tiernum;
- WRCommand_R(C_Pagenum);
- WRCommand_R(C_Tiernum);
- for(k=0;k<16;k++)
- {
- WRdata_R(table2[C_Temp*32+k]);
- };
- C_Pagenum=C_Pagenum+1;
- WRCommand_R(C_Pagenum);
- WRCommand_R(C_Tiernum);
- for(k=0;k<16;k++)
- {
- WRdata_R(table2[C_Temp*32+k+16]);
- };
- }
- /****************************************
- 写入西文字符,共11个字符,左侧写入6个
- 右侧写入5个,左侧起始从16开始,右侧从
- 0开始
- *****************************************/
- E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
- {
- uchar k;
- WRCommand_L(PAGEADD|E_Pagenum);
- WRCommand_L(TIERADD|E_Tiernum);
- for(k=0;k<8;k++)
- {
- WRdata_L(table1[E_Temp*8+k]);
- };
- }
- E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
- {
- uchar k;
- WRCommand_R(PAGEADD|E_Pagenum);
- WRCommand_R(TIERADD|E_Tiernum);
- for(k=0;k<8;k++)
- {
- WRdata_R(table1[E_Temp*8+k]);
- };
- }
- /*********************************
- 清除所有显示RAM内容
- **********************************/
- CLR_DisplayRAM()
- {
- uchar C_page,i,k;
- for(i=0;i<8;i++)
- {
- C_page=PAGEADD|i;//清除起始页为0
- WRCommand_L(C_page);//清除起始页写入
- WRCommand_L(TIERADD);//清除起始行地址写入
- WRCommand_R(C_page);
- WRCommand_R(TIERADD);
- for(k=0;k<64;k++)
- {
- WRdata_L(0x00);
- WRdata_R(0x00);//lcm的ram自动加一,只许循环64次即可
- };
- };
- }
- /*********************************
- 初始化 设置启使行
- **********************************/
- void Init_LCD(void)
- {
- CLR_DisplayRAM();//清除所有显示寄存器
- WRCommand_L(DIS_STARADD);
- WRCommand_R(DIS_STARADD);//设置显示起始行地址
- WRCommand_L(0x3f);
- WRCommand_R(0x3f);//开显示
- }
- /***************************************
- max1241读转换结果
- ****************************************/
- uint read_max1241()
- {
- uint voltage_temp=0;
- uchar ucloop=12;
- cs=High;
- //dout=low;
- sclk=Low;
- cs=Low;
- while(dout==0);//EOC信号为高表示转换结束
- sclk=High;
- sclk=Low;
- while(ucloop--)
- {
- sclk=High;//上升沿数据稳定并读出
- voltage_temp<<=1;
- if(dout==1)
- voltage_temp+=1;
- sclk=Low;
- };
- //sclk=low;
- cs=High;
- return voltage_temp;
- }
- main()
- {
- uchar a=0,temp=0,b=0,number=0,pagenum=0;
- uchar etable[]={0,0,0,0,0,45,53,60,51,63,61,53,10,69,67,53};//Welcome use
- uchar ttable[]={42,57,61,53,19,10,2,0,0,6,18,1,1,18,0,7};//Time:2006/11/07
- char count_remain=0,count_c=0;
- bit flag=1;
- char temperature_buf[2]={0};
- uchar temperature_display[8]={0};
- //uchar voltage=0; //测试0831时使用
- double voltage=0;
- double temp_buffer=0;
- cs=High;
- sclk=High;
- Init_LCD();
- I2C_init();
- DS1621_init();//初始化
- DS1621_start();//开始温度采集
- /***************************************
- 利用开机显示时间(大概三秒)空读一次DS1621
- ***************************************/
- for(b=0;b<2;b++)
- {
- for(number=0;number<20;number++)
- {
- //中文显示:欢迎使用液晶模块
- pagenum=1;//在第二行开始显示
- for(a=0;a<4;a++)
- {
- C_display_L(pagenum,a*16,a);
- C_display_R(pagenum,a*16,a+4);
- };
-
- //英文显示:Welcome use
- pagenum=5;//在第六行显示
- for(a=0;a<3;a++)
- {
- E_Display_L(pagenum,(a+5)*8,etable[a+5]);
- };
- for(a=0;a<8;a++)
- {
- E_Display_R(pagenum,a*8,etable[a+8]);
- };
-
- //显示制作时间:Time:2006/11/07
- pagenum=7;//在第八行显示
- for(a=0;a<8;a++)
- {
- E_Display_L(pagenum,a*8,ttable[a]);
- E_Display_R(pagenum,a*8,ttable[a+8]);
- }
- Delay_nms(100);
- };
- if(flag)
- {
- read_temperature(temperature_buf);//在转到下一个显示界面之前空读一次
- read_count_remain();
- read_count_c();
- DS1621_start();
- flag=0;
- };
- };
- WRCommand_L(0x3e);
- WRCommand_R(0x3e);
- CLR_DisplayRAM(); //清除显示ram
- WRCommand_L(0x3f);
- WRCommand_R(0x3f);
-
- while(1)
- {
- while(read_temperature(temperature_buf)==0);//读温度值(两字节有符数),并检测应答位,只使用第一字节
- count_remain=read_count_remain();//读斜率
- count_c=read_count_c();//读计数器
- temp_buffer = temperature_buf[0] -0.75 + (count_c-count_remain) / (double)count_c;
- DS1621_start();//读完数据后,重新开始一次温度转化
复制代码
完整单片机程序源码和仿真文件.zip
(118.1 KB, 售价: 3 E币)
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|