專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

自制帶有開機(jī)音樂的可顯數(shù)字溫度計(jì)

作者:胡明麗   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2010年06月11日   【字體:

      因?yàn)橐粋(gè)朋友要過生日,而且已經(jīng)大三了,相聚的日子屈指可數(shù),所以就想盡自己的所能給她做一件禮物。

      說來也不順,知道她過生日的時(shí)候,已經(jīng)距她過生日還有僅僅4天的時(shí)間,時(shí)間很緊,也不知道送些啥,一想,自己這些天一直在做關(guān)于單片機(jī)的東西,索性利用身邊的材料,做一個(gè)東西給她,也挺有意義的。但因?yàn)槠綍r(shí)忙著復(fù)習(xí)考研,所以注定做得東西不能太復(fù)雜了,否則根本完成不了,后來也就決定做這個(gè)溫度計(jì)了。電路也不難,程序自己也見過,大概改改也就差不多了。后來感覺僅僅顯示溫度也太單調(diào)了,就加了音樂功能,一首《隱形的翅膀》也不錯(cuò)。

     從周三開始,每天晚上11:00開始做,到今天,總算研制成功吧!有點(diǎn)遺憾的是,身邊沒有2-4譯碼器,所以LED驅(qū)動(dòng)的不好,就算加了兩個(gè)上拉排阻,顯示的還是挺暗!





由于本文篇幅有限部分文件請從這里下載:
http://www.torrancerestoration.com/ziliao/file/SoundPlay.rar  這個(gè)是音樂播放文件

#include <REG52.H>
#include "SoundPlay.h"
#define  uchar  unsigned  char 
#define  uint   unsigned  int
sbit  DATA = P3^7; //DS18B20接入口
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
char  bai,shi,ge; //定義變量

/*延時(shí)子函數(shù)*/
void delay(uint num)
{
 while(num--) ;
}

void Delay1ms(unsigned int count)
{
 unsigned int i,j;
 for(i=0;i<count;i++)
 for(j=0;j<120;j++);
}


/*************DS18b20溫度傳感器函數(shù)*********************/
Init_DS18B20(void)     //傳感器初始化
{
  uchar x=0;
  DATA = 1;    //DQ復(fù)位
  delay(10);  //稍做延時(shí)
  DATA = 0;    //單片機(jī)將DQ拉低
  delay(80); //精確延時(shí) 大于 480us    //450
  DATA = 1;    //拉高總線
  delay(20);
  x=DATA;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  delay(30);
}

//讀一個(gè)字節(jié)
ReadOneChar(void)
{
 uchar i=0;
 uchar dat = 0;
 for (i=8;i>0;i--)
  {
    DATA = 0; // 給脈沖信號
    dat>>=1;
    DATA = 1; // 給脈沖信號
    if(DATA)
     dat|=0x80;
    delay(8);
  }
  return(dat);
}

//寫一個(gè)字節(jié)
WriteOneChar(unsigned char dat)
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
    DATA = 0;
    DATA = dat&0x01;
   delay(10);
   DATA = 1;
   dat>>=1;
  }
 delay(8);
}

//讀取溫度
int ReadTemperature(void)
{
 uchar a=0;
 uchar b=0;
 int t=0;
 float tt=0;
 Init_DS18B20();
 WriteOneChar(0xCC); // 跳過讀序號列號的操作
 WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
 Init_DS18B20();
 WriteOneChar(0xCC); //跳過讀序號列號的操作
 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
 a=ReadOneChar();//低位
 b=ReadOneChar();//高位
 t=b;
 t<<=8;
 t=t|a;
 tt=t*0.0625;
 t= tt*10+0.5; 
 return(t);
}

/*顯示子函數(shù)*/
void  display(int bai,int shi,int ge)
{

 P2=0XFB; //顯示小數(shù)點(diǎn)
 P0=0X80; //顯示小數(shù)點(diǎn)
 delay(50);//顯示小數(shù)點(diǎn)

 P2=0xf7;
 P0=table[bai];//顯示千位
 delay(50);//一小段延時(shí)動(dòng)態(tài)顯示
 P2=0xfb;
 P0=table[shi];//顯示百位
 delay(50);
 P2=0xfd;
 P0=table[ge];//顯示十位
 delay(100);
}


//*****************************Music******************************************************
//揮著翅膀的女孩
unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
                                  0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
                                  0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
                                  0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,
                                  0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,
                                  0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,
                                  0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,
                                  0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,
                                  0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,
                                  0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,
                                  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
                                  0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
                                  0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
                                  0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,
                                  0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,
                                  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
                                  0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
                                  0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
                                  0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,
                                  0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,
                                  0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,
                                  0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,
                                  0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
                                  0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,
                                  0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,
                                  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
                                  0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,
                                  0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,
                                  0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,
                                  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
                                  0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,
                                  0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,
                                  0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};
//***********************************************************************************

 

main()
{
    int  temp;
 InitialSound();
 Play(Music_Girl,0,3,360);
 Delay1ms(500);
 while(1)
 {  
     temp=ReadTemperature();//讀溫度
  bai=temp%1000/100;//顯示百位
  shi=temp%100/10;//顯示十位
  ge=temp%10;//顯示個(gè)位
  display(bai,shi,ge);//顯示函數(shù) 
 }
 
}

 

/**************************************************************************

 

 

關(guān)閉窗口

相關(guān)文章