?? zpfinalok.c
字號:
/******************************************************************************/
/**
/** 功能描述:
/**
/** 創 建 人: chiusir 日期:2008-04-03 */
/** 修 改 人: 日期:2008-04-03 */
/** 其他說明:
/******************************************************************************/
#include<regx51.h>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
sbit SIO = P2^0;
sbit redled =P3^0;
sbit greenled =P3^1;
sbit blueled =P3^2;
sbit BZ =P3^3;
//0,1,2,3,4,5,6,7,8,9,-
U8 code LED_IMG[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
/*******************************************************************************
*** 函 數 名: void DLY_us(U8 x)
*** 功能描述: 微秒級延時;
*** 全局變量: NO !
*** 輸 入: x !
*** 輸 出: NO !
*** 修 改 人: 日期:2006-11-28
*** 函數說明:
*** //1-5,2-7,3-9 ,5--16.5us,10-30.4,22-52,25-58,35-78,61-125,125-250,250--500us
/******************************************************************************/
void DLY_us(U8 x) //x取值1~255;
{
while(--x);
}
/*******************************************************************************
*** 函 數 名: void DLY_ms(U16 x)
*** 功能描述: 毫秒級延時;
*** 全局變量: NO !
*** 輸 入: U16 x !
*** 輸 出: NO !
*** 修 改 人: 日期:2006-11-28
*** 函數說明:
/******************************************************************************/
void DLY_ms(U16 x) //x取值1~255;
{
U8 i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
/*******************************************************************************
*** 函 數 名: void Init1820()
*** 功能描述:
*** 全局變量: NO !
*** 輸 入: NO !
*** 輸 出: NO !
*** 修 改 人: 日期:2006-11-28
*** 函數說明:
/******************************************************************************/
void Init1820()
{
SIO = 1; _nop_();
SIO = 0; //拉低數據線,準備Reset OneWire Bus;
DLY_us(125); //延時510us,Reset One-Wire Bus.
DLY_us(125);
SIO = 1; //提升數據線;
DLY_us(15); //延時35us;
while(SIO) //等待Slave 器件Ack 信號;
{ _nop_(); }
DLY_us(60); //延時125us;
SIO = 1; //提升數據線,準備數據傳輸;
}
/*******************************************************************************
*** 函 數 名: static void DS18B20_WR(U8 cmd)
*** 功能描述: 寫一個字節;
*** 全局變量: NO !
*** 輸 入: cmd:8bit;
*** 輸 出: NO !
*** 函數說明: cmd主要有Rom操作指令和E2Ram操作指令兩種;
/******************************************************************************/
void WR1820(U8 cmd)
{
U8 i;
for(i=0;i<8;i++)
{if(cmd & 0x01) //低位在前;
{SIO = 0; //結束Recovery time;
_nop_();_nop_();_nop_();
SIO = 1; } //發送數據;
else
SIO = 0; //結束Rec time;
_nop_();_nop_();_nop_();
//SIO = 0; } //發送數據;
DLY_us(30); //等待Slave Device采樣;
SIO = 1; //Recovery;
_nop_(); //Recovery Time Start;
cmd >>= 1;
}
}
/*******************************************************************************
*** 函 數 名: U8 RD1820(void)
*** 功能描述: 讀取一個字節;
*** 全局變量: NO !
*** 輸 入: NO !
*** 輸 出: 8bit data;*
*** 函數說明: 讀之前必須首先寫1;
/******************************************************************************/
U8 RD1820(void)
{
U8 i;
U8 tmp=0;
SIO = 1; _nop_(); //準備讀;
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先發;
SIO = 0; //Read init;
_nop_(); //2ms;
SIO = 1; //必須寫1,否則讀出來的將是不預期的數據;
DLY_us(2); //延時9us;
_nop_();
if(SIO) //在12us處讀取數據;
tmp |= 0x80;
DLY_us(30); //延時55us;
SIO = 1; _nop_(); //恢復One Wire Bus;
}
return tmp;
}
U16 RD_T()
{
U16 tp;
U8 tmbuf[2];
Init1820();
WR1820(0xcc);
//delay_ms(2);
WR1820(0x44);
// _nop_();
// SIO=1;
// delay_ms(250); //多個1820時要延時,單個就不用,數據手冊里看
// delay_ms(250);
// delay_ms(250);
Init1820();
WR1820(0xcc);
WR1820(0xbe);
tmbuf[0]=RD1820();
tmbuf[1]=RD1820();
Init1820();
tp=tmbuf[1]*256+tmbuf[0];
//tp=tp>>4;
return(tp);
//tmbuf[0]=(U8)(tp/10);
//tmbuf[1]=(U8)(tp%10);
}
/*******************************************************************************
*** 函 數 名: void Show_LED(U16 dig)
*** 功能描述: 把數字轉化為5位LED顯示
*** 全局變量: NO !
*** 輸 入: 從DB18B20讀取的16位原始數據:低11位數據位,高5位為符號位!
//0,1,2,3,4,5,6,7,8,9,-
U8 code LED_IMG[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
P0.0--4依次為符號位,百位,十位,個位,十分為,百分位
P3接八段數碼管
*** 輸 出: NO !
*** 函數說明:
/******************************************************************************/
void Show_LED(int tmv)
{
U8 ge,shi,bai,shifen,baifen,neg=0;
if(tmv<0)
{
tmv=-tmv;
neg=1;
}
bai=tmv/10000;
shi=(tmv%10000)/1000;
ge =(tmv%1000)/100;
shifen=(tmv%100)/10;
baifen=tmv%10;
for(tmv=0;tmv<80;tmv++)
{
if(neg)
{
P0=0x01; //符號位
P1=LED_IMG[10];
DLY_ms(2);
}
P0=0x02;
P1=LED_IMG[bai]|0X80;
DLY_ms(2);
P0=0x04;
P1=LED_IMG[shi]|0X80;
DLY_ms(2);
P0=0x08;
P1=LED_IMG[ge]&0x7f; //tmbuf dot always.
DLY_ms(2);
P0=0x10;
P1=LED_IMG[shifen]|0X80;
DLY_ms(2);
P0=0x20;
P1=LED_IMG[baifen]|0X80;
DLY_ms(2);
P1=0xff;
}
}
/*******************************************************************************
*** 函 數 名: void Beep(U16 cnt)
*** 功能描述: 蜂鳴器鳴響
*** 全局變量: NO !
*** 輸 入: CNT-時間長短 !
*** 輸 出: NO !
*** 函數說明:
/******************************************************************************/
void Beep(U16 cnt)
{
while(cnt--)
{
BZ=1;
DLY_us(200); //
BZ=0;
DLY_us(50);
}
}
/*******************************************************************************
**** End Of File
*******************************************************************************/
void main(void)
{
U16 y;
float x;
U8 neg_flag=0;
P1=0xff;
while(1)
{
//Show_LED(-12345);
//DLY_ms(200);
/*
Show_LED(22222);
DLY_ms(200);
Show_LED(12345);
DLY_ms(200);
Show_LED(-12345);
DLY_ms(200);
Show_LED(-6789);
DLY_ms(200);
DLY_ms(200);
Show_LED(8888);
*/
DLY_ms(200);
P3|=0x07;
y=RD_T();
if(y<2001){
neg_flag=0;
y&=0x07ff;
}
else{
neg_flag=1;
y=~y+1;
}
if(neg_flag)
x=-(y*6.25);
else
x=y*6.25;
Show_LED((int)x);
if(y<480) //30
greenled=0;
else if(y<960)
blueled=0;
else if(y<2001){ //>60/0.0625=960,
redled=0;
Beep(1000);
}
else
greenled=0;
DLY_ms(250);
DLY_ms(250);
DLY_ms(250);
}
}
/*******************************************************************************
**** End Of File
*******************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -