亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
DS1621+MAX1241(12位串行ADC)電壓溫度采樣程序Proteus仿真 LCD12864顯示
[打印本頁]
作者:
512-DZ
時間:
2021-7-1 12:44
標題:
DS1621+MAX1241(12位串行ADC)電壓溫度采樣程序Proteus仿真 LCD12864顯示
分享學習,有問題交流哈
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(77.58 KB, 下載次數: 37)
下載附件
2021-7-1 16:15 上傳
單片機源程序如下:
//EDM12864B DRIVE//
/**************************************
PAGEADD為頁地址起使
TIERADD為行地址起使
DIS_STARTADD為開始命令
CTABLE為漢字字庫數組
ETABLE為英文字庫數組
***************************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define High 1
#define Low 0
#define _nop {}
#define PAGEADD 0xb8
#define TIERADD 0x40
#define DIS_STARADD 0xc0
uint key_value;
sbit DI=P1^4;
sbit E=P1^2;
sbit CS1=P1^1;
sbit CS2=P1^0;
sbit RW=P1^3;
sbit cs=P1^7;
sbit sclk=P1^6;
sbit dout=P1^5;
sbit I2C_SCL = P3^7;
sbit I2C_SDA = P3^6;
//uchar ntable[]={61,49,57,60,19,49,62,49,60,63,55,2,0,0,6,22,56,
//63,68,61,49,57,60,17,51,63,61};//email:analog2006@hotmail.com
uchar data voltage_display[8];
/*****************************
字符表
顯示"Welcome Use"
******************************/
uchar code table1[]={
0x00,0x3e,0x51,0x49,0x45,0x3e,0x00,0x00,//0(0)
...............余下內容詳見附件..................
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,
0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,//量(13)
};
/********************************
顯示用的延時函數
延時長度有參數 n 決定
*********************************/
Delay_nms(uchar n)
{ uchar a;
for(;n>0;n--)
{
for(a=0;a<100;a++)
{
_nop;
_nop;
_nop;
_nop;
};
};
}
/*****************************************
DEM12864B狀態檢測,從EDM12864B讀出數
據檢測標志位BF
******************************************/
void LCD_Busy()
{
uchar busy;
E=Low;
DI=Low;
RW=High;
while(1)
{
E=High;
_nop;
_nop;
busy=P2;//讀狀態標志寄存器
_nop;
E=Low;
if((busy&0x90)==0)//檢測BF和RES位,兩者都為零時表示可進行寫入
break;
};
}
/*********************************
寫指令
**********************************/
void WRCommand_L(uchar command)
{
CS1=High;
CS2=Low;
LCD_Busy();
DI=Low;
_nop;
RW=Low;
_nop;
E=High;
_nop;
P2=command;
_nop;
E=Low;
_nop;
}
void WRCommand_R(uchar command)
{
CS1=Low;
CS2=High;
LCD_Busy();
DI=Low;
_nop;
RW=Low;
_nop;
E=High;
_nop;
P2=command;
_nop;
E=Low;
_nop;
}
/***********************************
寫一個字節的顯示數據
************************************/
void WRdata_L(uchar ucdata)
{
CS1=High;
CS2=Low;
LCD_Busy();
DI=High;
_nop;
RW=Low;
_nop;
E=High;
_nop;
P2=ucdata;
_nop;
E=Low;
_nop;
}
void WRdata_R(uchar ucdata)
{
CS1=Low;
CS2=High;
LCD_Busy();
DI=High;
_nop;
RW=Low;
_nop;
E=High;
_nop;
P2=ucdata;
_nop;
E=Low;
_nop;
}
/************************************
讀顯示數據
*************************************/
/********************************************
RDdata_L()
{
uchar receiver;
CS1=High;
CS2=Low;
LCD_Busy();
DI=High;
_nop;
WR=High;
_nop;
E=High;
_nop;
receiver=P0;
E=Low;
return(receiver);
}
RDdata_R()
{
uchar receiver;
CS1=Low;
CS2=High;
LCD_Busy();
DI=High;
_nop;
WR=High;
_nop;
E=High;
_nop;
receiver=P0;
E=Low;
return(receiver);
}
/*****************************************
/**************************************
I2C時鐘時序要求的數據建立時間,
nop_可以用其它短延時替代,比如喂狗
***************************************/
I2C_delay()
{
uchar n=5;
while(n--)
{
_nop;
_nop;
}
}
/*********************************************
I2C的時鐘信號可發送和接收.
接收時通過判斷sample對寄存器的值加.
發送的時候只調用程序產生時序.
**********************************************/
bit I2C_clock(void)
{
bit sample;
I2C_delay();
I2C_SCL=High;
I2C_delay();
sample=I2C_SDA;
I2C_SCL=Low;
I2C_delay();
return(sample);
}
/********************************************
I2C確定接收有效的應答信號Acknowledge
*********************************************/
I2C_ACK()
{
I2C_SDA=Low;
I2C_clock();
I2C_SDA=High;
}
/*****************************************
I2C的非應答信號
******************************************/
I2C_NACK()
{
I2C_SDA=High;
I2C_clock();
I2C_SDA=High;
}
/*************************************************
I2C的開始信號.發送和接受數據時,必須先調用.
*************************************************/
I2C_start()
{
I2C_SDA=High;
I2C_delay();
I2C_SCL=High;
I2C_delay();
I2C_SDA=Low;
I2C_delay();
I2C_SCL=Low;
I2C_delay();
}
/***************************************************
I2C停止信號.發送和接受數據時結束時,需要調用.
****************************************************/
I2C_stop()
{
I2C_SDA=Low;
I2C_delay();
I2C_SCL=High;
I2C_delay();
I2C_SDA=High;//產生停止控制信號,并且釋放數據線
I2C_delay();
}
/*****************************************
I2C初始化.在main函數中必須先調用它.
進行初始化后才能調用其他函數.
******************************************/
void I2C_init(void)
{
I2C_SDA=High;
I2C_SCL=High;
I2C_delay();
I2C_stop();
}
/*****************************************
I2C總線寫一個字節,即發送一個字節
發送結束后,需要返回一個檢測應答位
******************************************/
bit I2C_send(uchar I2C_data)
{
uchar a;
for(a=0;a<8;a++)
{
I2C_SDA=(bit)(I2C_data&0x80);
I2C_data=I2C_data<<1;
I2C_clock();
};
I2C_SDA=High;
I2C_delay();
return(I2C_clock()); //返回應答信號
}
/***********************************************
I2C總線讀一個字節,即接收一個字節數據
接收結束后需要發送一個應答位acknowledge
***********************************************/
uchar I2C_receive()
{
uchar a,receive_data;
for(a=0;a<8;a++)
{
receive_data=receive_data<<1;
if(I2C_clock())
{
receive_data++;
};
};
//I2C_ACK();
return(receive_data);
}
DS1621_start()
{
do
{
I2C_start();
}
while(I2C_send(0x90));//發送數據完地址字節的數據時,檢測從機的應答位
if(I2C_send(0xee)==0)
{
I2C_stop();
return 1;
}
else
return 0;
}
DS1621_stop()
{
do
{
I2C_start();
//I2C_send(0x90);
}
while(I2C_send(0x90));
if(I2C_send(0x22)==0)
{
I2C_stop();
return 1;
}
else
return 0;
}
char read_count_remain()
{
char temp_remain=0;
do
{
I2C_start();
}
while(I2C_send(0x90));//是否應答
if(I2C_send(0xa8)==0)
{
I2C_start();
if(I2C_send(0x91)==0)
{
temp_remain=I2C_receive();
I2C_NACK();
I2C_stop();
return temp_remain;
}
else
return 0;
}
else
return 0;
}
char read_count_c()
{
char temp_c=0;
do
{
I2C_start();
}
while(I2C_send(0x90));//是否應答
if(I2C_send(0xa9)==0)
{
I2C_start();
if(I2C_send(0x91)==0)
{
temp_c=I2C_receive();
I2C_NACK();
I2C_stop();
return temp_c;
}
else
return 0;
}
else
return 0;
}
bit read_temperature(char *point1)
{
do
{
I2C_start();
}
while(I2C_send(0x90));
if(I2C_send(0xaa)==0)
{
do{
I2C_start();
}
while(I2C_send(0x91));
(*point1)=I2C_receive();
I2C_ACK();
(*(point1+1))=I2C_receive();
I2C_NACK();
I2C_stop();
return 1;
}
else
return 0;
}
DS1621_state()
{
do
{
I2C_start();
}
while(I2C_send(0x90));
if(I2C_send(0xac)==0)
{
do
{
I2C_start();
}
while(I2C_send(0x90));
if(I2C_send(0x00)==0)
//if(I2C_send(0x01)==0)
{
I2C_stop();
return 1;
}
else
return 0;
}
else
return 0;
}
DS1621_th()
{
}
DS1621_tl()
{
}
DS1621_init()
{
while(DS1621_stop()==0)
{};
while(DS1621_state()==0)
{};
DS1621_th();
DS1621_tl();
}
/****************************************************
字符為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();//讀完數據后,重新開始一次溫度轉化
temperature_display[0]=19;
if(temp_buffer<0)
{
temperature_display[1]=16;//顯示負號
temperature_display[2]=(-temp_buffer)/10;//十位
temperature_display[3]=((uchar)(-temp_buffer))%10;
temperature_display[4]=17;//小數點
temperature_display[5]=(int)((-temp_buffer)*10)%10;
temperature_display[6]=(int)((-temp_buffer)*100)%10;//小數點后兩位
}
else
{
temperature_display[1]=temp_buffer/100;//百位
temperature_display[2]=((uchar)temp_buffer)/10%10;
temperature_display[3]=((uchar)temp_buffer)%10;
temperature_display[4]=17;
temperature_display[5]=((int)(temp_buffer*10))%10;
temperature_display[6]=((int)(temp_buffer*100))%10;//小數點后兩位
}
// 測試從max1241讀出的原始數據
/***************************
//pagenum=3;
voltage=read_max1241();
voltage_display[0]=19;
voltage_display[1]= voltage/1000;
voltage_display[2]=(voltage/100)%10;
voltage_display[3]=(voltage/10)%10;
voltage_display[4]= voltage%10;
//*******************************/
//LCD顯示第二部分
for(b=0;b<40;b++)
{
//*************************
//更新max1241顯示值
voltage=(double)read_max1241();
voltage=5000*voltage/4095;
voltage_display[0]=19;
voltage_display[5]=(uint)voltage %10;//個位
voltage_display[2]=17;
voltage_display[4]=(uint)(voltage/10)%10;//小數點后1位
voltage_display[3]=(uchar)(voltage/100)%10;//小數點后2位
voltage_display[1]=(uchar)(voltage/1000)%10;//小數點后3位
//***********************************/
//顯示文字:電壓測量
pagenum=2;
for(a=0;a<2;a++)
C_display_L(pagenum,a*16,a+8);
for(a=0;a<2;a++)
C_display_L(pagenum,(a+2)*16,a+12);
//顯示文字:溫度測量
pagenum=5;
for(a=0;a<2;a++)
C_display_L(pagenum,a*16,a+10);
for(a=0;a<2;a++)
C_display_L(pagenum,(a+2)*16,a+12);
//顯示1241采樣值
pagenum=3;
for(a=0;a<6;a++)
{
E_Display_R(pagenum,a*8,voltage_display[a]);
}
//顯示ds1621采樣值
pagenum=6;
for(a=0;a<7;a++)
{
E_Display_R(pagenum,a*8,temperature_display[a]);
}
};
};
}
復制代碼
全部資料51hei下載地址:
12位1621與12864.7z
(62.21 KB, 下載次數: 53)
2021-7-1 16:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1