?前幾天畫了一塊STC12C5A60S2的最小系統板子(自制STC12C5A60S2最小系統板),經過三天的生產制造,今天板子終于拿到手了。
然后開始元器件的手工焊接,元器件比較少:貼片元器件只有一個單片機芯片和四個電容、兩個電阻、一個貼片晶振,10分鐘搞定。
下面測試一下板子,利用手頭的紅外測溫傳感器,做一個紅外測溫的實驗吧。紅外傳感器使用的是mlx90614,MLX90614 系列模塊是一組通用的紅外測溫模塊。在出廠前該模塊已進行校驗及線 性化,具有非接觸、體積小、精度高,成本低等優點。被測目標溫度和環境溫度能通過單通 道輸出,并有兩種輸出接口,適合于汽車空調、室內暖氣、家用電器、手持設備以及醫療設 備應用等。
本是實驗通過MLX90614測量溫度并顯示在OLED,系統電氣連接如下:MLX90614的SCL接單片機的P0.6引腳,SDA接單片機的P0.7引腳。OLED的SCL接單片機的P0.4引腳,SDA接單片機的P0.5引腳。
附MLX90614的驅動程序
//mlx90614 端口定義
sbit SCL=P0^6;//時鐘線線
sbit SDA=P0^7;//數據線
//************數據定義****************
bdata uchar flag;//可位尋址數據
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg;
//************函數聲明*****************************************
void start_bit(); //MLX90614 發起始位子程序
void stop_bit(); //MLX90614 發結束位子程序
uchar rx_byte(void); //MLX90614 接收字節子程序
void send_bit(void); //MLX90614 發送位子程序
void tx_byte(uchar dat_byte); //MLX90614 接收字節子程序
void receive_bit(void); //MLX90614 接收位子程序
void delay(uint N); //延時程序
uint memread(void); //讀溫度數據
/*********輸入轉換并顯示*********/
void display(uint Tem)
{
?uint T,a,b;
?T=Tem*2;
?if(T>=27315)
?{
?? ? T=T-27315;
?? ? a=T/100+3;
?? ??? ?b=T%100;
?? ??? ?OLED_ShowNum(50,3,a,2,16);
?? ??? ?if(b>=10)
?? ??? ??? ? OLED_ShowNum(70,3,b,2,16);
?? ??? ?else
?? ??? ??? ? OLED_ShowNum(70,3,b,1,16);
?? ? //OLED_ShowNum(50,3,T,4,16);
?}
//?? ? a=T/100;
//?? ? b=T-a*100;
////---------------------------
//?? ? if(a>=100)
//?? ? {
//?? ? dis_dat_wrt(0x30+a/100);
//?? ? a=a%100;
//?? ? dis_dat_wrt(0x30+a/10);
//?? ? a=a%10;
//?? ? dis_dat_wrt(0x30+a);
//?? ? }
//?? ? else if(a>=10)
//?? ? {
//?? ? dis_dat_wrt(0x30+a/10);
//?? ? a=a%10;
//?? ? dis_dat_wrt(0x30+a);
//?? ? }
//?? ? else
//?? ? {
//?? ? dis_dat_wrt(0x30+a);
//?? ? }
//?? ? dis_dat_wrt(0x2e);//顯示點
////---------------------------
// if(b>=10)
// {
// dis_dat_wrt(0x30+b/10);
//// b=b%10;
//// dis_dat_wrt(0x30+b);
// }
// else
// {
// dis_dat_wrt(0x30);
//// dis_dat_wrt(0x30+b);
// }
// }
//===========================
}
//*************主函數*******************************************
void main()
{
?uint Tem;
?//函數部分
?SCL=1;SDA=1;_nop_();
?_nop_();_nop_();_nop_();
?SCL=0;
?delay(1000);
?SCL=1;
??? OLED_Init();?? ??? ??? ?//???OLED ?
?? ?? OLED_Clear();
?? ??? ?
?? ??? ?OLED_ShowString(6,3,"Tem :??? ",16);
?? ??? ?OLED_ShowCHinese(90,3,6);//?
?? ?? OLED_ShowString(65,3,".",16);
?? ?
?? ?? //OLED_ShowNum(50,3,0,4,16);
?while(1)
?{
?Tem=memread();
?display(Tem);
?? ? //OLED_ShowNum(50,3,Tem,4,16);
?delay(20);
?}
}
//************************************
void start_bit(void)
{
?SDA=1;
?_nop_();_nop_();_nop_();_nop_();_nop_();
?SCL=1;
?_nop_();_nop_();_nop_();_nop_();_nop_();
?SDA=0;
?_nop_();_nop_();_nop_();_nop_();_nop_();
?SCL=0;
?_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
?SCL=0;
?_nop_();_nop_();_nop_();_nop_();_nop_();
?SDA=0;
?_nop_();_nop_();_nop_();_nop_();_nop_();
?SCL=1;
?_nop_();_nop_();_nop_();_nop_();_nop_();
?SDA=1;
}
//---------發送一個字節---------
void tx_byte(uchar dat_byte)
{
?char i,n,dat;
?n=Nack_counter;
TX_again:
?dat=dat_byte;
?for(i=0;i<8;i++)
?{
?if(dat&0x80)
?bit_out=1;
?else
?bit_out=0;
?send_bit();
?dat=dat<<1;
?}
?receive_bit();
?if(bit_in==1)
?{
?stop_bit();
?if(n!=0)
?{n--;goto Repeat;}
?else
?goto exit;
?}
?else
?goto exit;
Repeat:
?start_bit();
?goto TX_again;
exit: ;
}
//-----------發送一個位---------
void send_bit(void)
{
?if(bit_out==0)
?SDA=0;
?else
?SDA=1;
?_nop_();
?SCL=1;
?_nop_();_nop_();_nop_();_nop_();
?_nop_();_nop_();_nop_();_nop_();
?SCL=0;
?_nop_();_nop_();_nop_();_nop_();
?_nop_();_nop_();_nop_();_nop_();
}
//----------接收一個字節--------
uchar rx_byte(void)
{
?uchar i,dat;
?dat=0;
?for(i=0;i<8;i++)
?{
?dat=dat<<1;
?receive_bit();
?if(bit_in==1)
?dat=dat+1;
?}
?send_bit();
?return dat;
}
//----------接收一個位----------
void receive_bit(void)
{
?SDA=1;bit_in=1;
?SCL=1;
?_nop_();_nop_();_nop_();_nop_();
?_nop_();_nop_();_nop_();_nop_();
?bit_in=SDA;
?_nop_();
?SCL=0;
?_nop_();_nop_();_nop_();_nop_();
?_nop_();_nop_();_nop_();_nop_();
}
//------------延時--------------
void delay(uint N)
{
?uint i;
?for(i=0;i
審核編輯:劉清
評論
查看更多