国产免费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.gif
(77.58 KB)
下載附件
2021-7-6 17:26 上傳
單片機部分源程序如下:(完整源碼請下載附件)
****************************************************
字符為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幣)
2021-7-6 17:28 上傳
點擊文件名下載附件
售價: 3 E幣
[記錄]
[
購買
]
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0