久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
利用AVR單片機設計的DS18B20測溫程序
[打印本頁]
作者:
xiaos
時間:
2015-4-3 00:57
標題:
利用AVR單片機設計的DS18B20測溫程序
/********************************
DS18B20測溫程序
文件名:main.c
編譯:WinAVR-20070122
硬件環境:CA-M8X 打開的開關如下
S6(1,2,5,6,7) - 外部4MHz晶振和595接口
J8(EN-SEG) - 數碼管顯示允許
S7(4) - 連接PC1 與DS18B20數據口
(在CA-M8X 上DS18B20為非總線供電)
芯藝設計室 2004-2007 版權所有
轉載請保留本注釋在內的全部內容
Email: changfutong@sina.com
*******************************/
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include "seg.h" //聲明數碼管顯示接口函數
#define CLR_1WIRE_BUS DDRC|=_BV(PC1) //設置為輸出,此時由于PORTC1是低所以輸出低
#define SET_1WIRE_BUS DDRC&=~_BV(PC1)//設置為輸入,此時由于PORTC1是低所以程高阻,又因為外部有上拉電阻所以相當于設置總線為高
#define GET_1WIRE_BUS PINC&_BV(PC1)
#define DS18B20_READ_ROM 0x33
#define DS18B20_MATCH_ROM 0X55
#define DS18B20_SKIP_ROM 0XCC
#define DS18B20_SEARCH_ROM 0XF0
#define DS18B20_ALARM_SEARCH_ROM 0XEC
#define DS18B20_WRITE_RAM 0X40
#define DS18B20_READ_RAM 0XBE
#define DS18B20_COPY_RAM 0X48
#define DS18B20_CONVERT_TEM 0X44
#define DS18B20_EECALL_EEPROM 0XB8
#define DS18B20_READ_POWER_SUPPLY 0XB4
//總線端口初始化
void BusInit(void)
{
PORTC&=~_BV(PC1);//此口總保持低
DDRC&=~_BV(PC1); //初始化為輸入,用外部上拉電阻保持總線的高電平
}
//由于系統時鐘為4MHz,一個_delay_loop_2正好延時一us
#define DelayUs(x) _delay_loop_2(x)
void DelayMs(uint16_t t)
{
uint16_t i;
for(i=0;i<t;i++)
_delay_loop_2(250 * 4);
}
//單總線復位
uint8_t ds18b20_reset(void)
{
uint8_t ret=0;
CLR_1WIRE_BUS;
DelayUs(500); //拉低總線至少480us
SET_1WIRE_BUS;
DelayUs(100);//釋放總線后等待15-60us
if((GET_1WIRE_BUS)==0)//檢測到DS18B20把總線拉低
ret=1; //復位成功
DelayUs(1000);//等待器件釋放總線
return ret;
}
//單總線讀一字節
uint8_t ds18b20_read(void)
{
uint8_t data=0;
uint8_t i=0;
for(i=0;i<8;i++)
{
data>>=1;
CLR_1WIRE_BUS;
DelayUs(2);//此時>1us
SET_1WIRE_BUS;
DelayUs(4);//此時<15us
if(GET_1WIRE_BUS)
data|=0x80;
DelayUs(60);//此時>60us
}
return(data);
}
//單總線寫一字節
void ds18b20_write(uint8_t data)
{
uint8_t i=0;
for(i=0;i<8;i++)
{
if(data&0x01)
{
CLR_1WIRE_BUS;
DelayUs(8);//8us
SET_1WIRE_BUS;
DelayUs(55);//55us
}
else
{
CLR_1WIRE_BUS;
DelayUs(55);//55us
SET_1WIRE_BUS;
DelayUs(20);//8us
}
data>>=1;
}
}
//執行轉換
uint8_t Ds18b20Convert(uint8_t *t)
{
//發送轉換命令
if(ds18b20_reset()==0)
return 0;
ds18b20_write(DS18B20_SKIP_ROM); //忽略地址匹配,總線上只有一個器件時,或對總線所有器件操作
ds18b20_write(DS18B20_CONVERT_TEM);//開始轉換命令
//等待轉換完成,ds18b20默認轉換精度為12位,此時最大轉換時間為750ms
DelayMs(1000);
//讀溫度字節
if(ds18b20_reset()==0)
return 0;
ds18b20_write(DS18B20_SKIP_ROM); //忽略地址匹配
ds18b20_write(DS18B20_READ_RAM); //讀RAM命令
t[0]=ds18b20_read();
t[1]=ds18b20_read();
return 1;
}
//根據DS18B20中讀的溫度字節,計算實際溫度值
int8_t GetTemperature(uint8_t *t)
{
int8_t ret;
uint32_t val;
uint16_t tmp=(t[1]*256)+t[0];
uint8_t sflag=0;
if((t[1]&0xf8)==0xf8) //若負溫度,從補碼轉換(取反加一)
{
sflag=1;
tmp=~tmp;
tmp++;
}
tmp&=0x07ff; //確保前5位為0
//乘0.0625操作,為此本函數只適用于DS18B20 12位轉換(默認)時
val=((uint32_t)tmp)*625;
val/=10000;
ret=(int8_t)val;
if(sflag)
ret|=0x80;//變負數
return ret;
}
//測試主函數
int main(void)
{
uint8_t tmp[2];//保存溫度字節
int8_t tval; //保存溫度值
SegInit();//數碼管初始化
SegNumberOut(0,0);//顯示 0
BusInit(); //單總線I/O口初始化
while(1)
{
if(Ds18b20Convert(tmp))//如果轉換成功
{
tval=GetTemperature(tmp);//計算實際溫度值
if(tval>=0)
SegNumberOut(tval,0);//十進制顯示溫度值
else
SegNumberOut(0,0);//數碼管無法顯示負數,只能顯示0
}
}
return 0;
}
seg.c文件:
/********************************
74HC95驅動的數碼管顯示模塊
文件名:seg.c
編譯:WinAVR-20070122
硬件環境:CA-M8X 打開的開關如下
S6(1,2,5,6,7) - 外部4MHz晶振和595接口
J8(EN-SEG) - 數碼管顯示允許
芯藝設計室 2004-2007 版權所有
轉載請保留本注釋在內的全部內容
WEB: http://www.chipart.cn
Email: changfutong@sina.com
*******************************/
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include "seg.h"
#define SER_PORT PORTD
#define SER_DAT PD4
#define SER_RCK PD5
#define SER_SCK PD6
//顯示碼(可從chipart.cn下載生成工具)
static uint8_t g_aDisplayBuf[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//向595 寫一字節
static void ser_out(uint8_t dat)
{
uint8_t i;
for(i=0;i<8;i++)
{
if(dat&0x80)
SER_PORT|=_BV(SER_DAT);
else
SER_PORT&=~_BV(SER_DAT);
//產生移位脈沖
SER_PORT|=_BV(SER_SCK);
SER_PORT&=~_BV(SER_SCK);
dat<<=1;
}
}
//數碼管顯示數(0~255)
//num :顯示的數 hex:是否用十六進制顯示
void SegNumberOut(uint8_t num,uint8_t hex)
{
uint8_t buf[2];//發送顯示碼緩沖區
uint8_t temp;
if(hex) //十六進制
{
buf[0]=g_aDisplayBuf[num>>4];//高位
buf[1]=g_aDisplayBuf[num&0x0f];//低位
}
else//十進制
{
buf[1]=g_aDisplayBuf[num%10];
temp=num%100;
buf[0]=g_aDisplayBuf[temp/10];
temp=num/100;
if(temp>0)
buf[1]|=0x80; //第一個數碼管小數點表示百位1
if(temp>1)
buf[0]|=0x80;//兩個數碼管小數點表示百位2
}
//串行發送數據
ser_out(buf[0]);
ser_out(buf[1]);
//產生鎖存脈沖
SER_PORT|=_BV(SER_RCK);
SER_PORT&=~_BV(SER_RCK);
}
void SegInit(void)
{
//595控制I/O初始化
DDRD=_BV(SER_DAT)|_BV(SER_SCK)|_BV(SER_RCK);
SER_PORT&=~_BV(SER_SCK);
SER_PORT&=~_BV(SER_RCK);
}
復制代碼
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
91亚洲国产成人精品性色
|
银杏av
|
可以看毛片的网站
|
日韩成人精品
|
日韩中文视频
|
国产高清一区二区三区
|
又色又爽又黄18网站
|
国产理论在线观看
|
九九热在线播放
|
四虎av在线
|
99视频
|
激情视频小说
|
成年人网站在线免费观看
|
五月开心婷婷
|
日本黄色a级片
|
亚洲第一区视频
|
日韩精品无
|
国产精品福利在线观看
|
国产一区久久
|
一区二区三区视频
|
国产精品777
|
午夜免费剧场
|
欧美激情三区
|
亚洲看片
|
国产精品成人一区二区网站软件
|
欧美伦理一区二区
|
日韩视频免费观看
|
中文字幕日韩在线观看
|
超碰在线99
|
精品一区二区三区四区五区
|
日日夜夜艹
|
2017天天干
|
久久久精品在线观看
|
免费毛片在线播放
|
国产欧美日韩综合
|
91导航
|
播播激情网
|
午夜影院在线
|
波多野结衣一区二区三区在线观看
|
黄色在线视频播放
|
一级理论片
|