當前位置:編程學習大全網 - 編程語言 - 用8051單片機做溫度采集與顯示(LED數碼管)請問用C語言怎麽寫。給個例程

用8051單片機做溫度采集與顯示(LED數碼管)請問用C語言怎麽寫。給個例程

#include<reg52.h> //包含頭文件,壹般情況不需要改動,頭文件包含特殊功能寄存器的定義

#include<stdio.h>

#include "18b20.h"

#include "1602.h"

#include "delay.h"

bit ReadTempFlag;//定義讀時間標誌

void Init_Timer0(void);//定時器初始化

/*------------------------------------------------

串口通訊初始化

------------------------------------------------*/

void UART_Init(void)

{

SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收

TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝

TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz

TR1 = 1; // TR1: timer 1 打開

//EA = 1; //打開總中斷

//ES = 1; //打開串口中斷

TI=1;

}

/*------------------------------------------------

主函數

------------------------------------------------*/

void main (void)

{

int temp;

float temperature;

char displaytemp[16];//定義顯示區域臨時存儲數組

LCD_Init(); //初始化液晶

DelayMs(20); //延時有助於穩定

LCD_Clear(); //清屏

Init_Timer0();

UART_Init();

Lcd_User_Chr(); //寫入自定義字符

LCD_Write_String(0,0," www.doflye.net ");

LCD_Write_Char(13,1,0x01);//寫入溫度右上角點

LCD_Write_Char(14,1,'C'); //寫入字符C

while (1) //主循環

{

if(ReadTempFlag==1)

{

ReadTempFlag=0;

temp=ReadTemperature();

temperature=(float)temp*0.0625;

sprintf(displaytemp,"Temp % 7.3f",temperature);//打印溫度值

LCD_Write_String(0,1,displaytemp);//顯示第二行

}

}

}

/*------------------------------------------------

定時器初始化子程序

------------------------------------------------*/

void Init_Timer0(void)

{

TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響

//TH0=0x00; //給定初值

//TL0=0x00;

EA=1; //總中斷打開

ET0=1; //定時器中斷打開

TR0=1; //定時器開關打開

}

/*------------------------------------------------

定時器中斷子程序

------------------------------------------------*/

void Timer0_isr(void) interrupt 1

{

static unsigned int num;

TH0=(65536-2000)/256; //重新賦值 2ms

TL0=(65536-2000)%256;

num++;

if(num==300) //

{

num=0;

ReadTempFlag=1; //讀標誌位置1

}

}

/*-----------------------------------------------

名稱:LCD1602

論壇:www.doflye.net

編寫:shifang

日期:2009.5

修改:無

內容:

引腳定義如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK

------------------------------------------------*/

#include "1602.h"

#include "delay.h"

sbit RS = P2^4; //定義端口

sbit RW = P2^5;

sbit EN = P2^6;

#define RS_CLR RS=0

#define RS_SET RS=1

#define RW_CLR RW=0

#define RW_SET RW=1

#define EN_CLR EN=0

#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------

判忙函數

------------------------------------------------*/

bit LCD_Check_Busy(void)

{

DataPort= 0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return (bit)(DataPort & 0x80);

}

/*------------------------------------------------

寫入命令函數

------------------------------------------------*/

void LCD_Write_Com(unsigned char com)

{

// while(LCD_Check_Busy()); //忙則等待

DelayMs(5);

RS_CLR;

RW_CLR;

EN_SET;

DataPort= com;

_nop_();

EN_CLR;

}

/*------------------------------------------------

寫入數據函數

------------------------------------------------*/

void LCD_Write_Data(unsigned char Data)

{

//while(LCD_Check_Busy()); //忙則等待

DelayMs(5);

RS_SET;

RW_CLR;

EN_SET;

DataPort= Data;

_nop_();

EN_CLR;

}

/*------------------------------------------------

清屏函數

------------------------------------------------*/

void LCD_Clear(void)

{

LCD_Write_Com(0x01);

DelayMs(5);

}

/*------------------------------------------------

寫入字符串函數

------------------------------------------------*/

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x); //表示第壹行

}

else

{

LCD_Write_Com(0xC0 + x); //表示第二行

}

while (*s)

{

LCD_Write_Data( *s);

s ++;

}

}

/*------------------------------------------------

寫入字符函數

------------------------------------------------*/

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x);

}

else

{

LCD_Write_Com(0xC0 + x);

}

LCD_Write_Data( Data);

}

/*------------------------------------------------

初始化函數

------------------------------------------------*/

void LCD_Init(void)

{

LCD_Write_Com(0x38); /*顯示模式設置*/

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

LCD_Write_Com(0x08); /*顯示關閉*/

LCD_Write_Com(0x01); /*顯示清屏*/

LCD_Write_Com(0x06); /*顯示光標移動設置*/

DelayMs(5);

LCD_Write_Com(0x0C); /*顯示開及光標設置*/

}

/*------------------------------------------------

設定二個自定義字符,LCD1602中自定義字符的地址為0x00--0x07,

即可定義8個字符

這裏我們設定把壹個自定義字符放在0x00位置(000),

另壹個放在0x01位子(001)

------------------------------------------------*/

void Lcd_User_Chr(void)

{ //第壹個自定義字符

LCD_Write_Com(0x40); //"01 000 000" 第1行地址 (D7D6為地址設定命令形式?D5D4D3為字符存放位置(0--7),D2D1D0為字符行地址(0--7))

LCD_Write_Data(0x00); //"XXX 11111" 第1行數據(D7D6D5為XXX,表示為任意數(壹般用000),D4D3D2D1D0為字符行數據(1-點亮,0-熄滅)

LCD_Write_Com(0x41); //"01 000 001" 第2行地址

LCD_Write_Data(0x04); //"XXX 10001" 第2行數據

LCD_Write_Com(0x42); //"01 000 010" 第3行地址

LCD_Write_Data(0x0e); //"XXX 10101" 第3行數據

LCD_Write_Com(0x43); //"01 000 011" 第4行地址

LCD_Write_Data(0x0e); //"XXX 10001" 第4行數據

LCD_Write_Com(0x44); //"01 000 100" 第5行地址

LCD_Write_Data(0x0e); //"XXX 11111" 第5行數據

LCD_Write_Com(0x45); //"01 000 101" 第6行地址

LCD_Write_Data(0x1f); //"XXX 01010" 第6行數據

LCD_Write_Com(0x46); //"01 000 110" 第7行地址

LCD_Write_Data(0x04); //"XXX 11111" 第7行數據

LCD_Write_Com(0x47); //"01 000 111" 第8行地址

LCD_Write_Data(0x00); //"XXX 00000" 第8行數據

//第二個自定義字符

LCD_Write_Com(0x48); //"01 001 000" 第1行地址

LCD_Write_Data(0x03); //"XXX 00001" 第1行數據

LCD_Write_Com(0x49); //"01 001 001" 第2行地址

LCD_Write_Data(0x03); //"XXX 11011" 第2行數據

LCD_Write_Com(0x4a); //"01 001 010" 第3行地址

LCD_Write_Data(0x00); //"XXX 11101" 第3行數據

LCD_Write_Com(0x4b); //"01 001 011" 第4行地址

LCD_Write_Data(0x00); //"XXX 11001" 第4行數據

LCD_Write_Com(0x4c); //"01 001 100" 第5行地址

LCD_Write_Data(0x00); //"XXX 11101" 第5行數據

LCD_Write_Com(0x4d); //"01 001 101" 第6行地址

LCD_Write_Data(0x00); //"XXX 11011" 第6行數據

LCD_Write_Com(0x4e); //"01 001 110" 第7行地址

LCD_Write_Data(0x00); //"XXX 00001" 第7行數據

LCD_Write_Com(0x4f); //"01 001 111" 第8行地址

LCD_Write_Data(0x00); //"XXX 00000" 第8行數據

}

#include"delay.h"

#include"18b20.h"

/*------------------------------------------------

18b20初始化

------------------------------------------------*/

bit Init_DS18B20(void)

{

bit dat=0;

DQ = 1; //DQ復位

DelayUs2x(5); //稍做延時

DQ = 0; //單片機將DQ拉低

DelayUs2x(200); //精確延時 大於 480us 小於960us

DelayUs2x(200);

DQ = 1; //拉高總線

DelayUs2x(50); //15~60us 後 接收60-240us的存在脈沖

dat=DQ; //如果x=0則初始化成功, x=1則初始化失敗

DelayUs2x(25); //稍作延時返回

return dat;

}

/*------------------------------------------------

讀取壹個字節

------------------------------------------------*/

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 給脈沖信號

dat>>=1;

DQ = 1; // 給脈沖信號

if(DQ)

dat|=0x80;

DelayUs2x(25);

}

return(dat);

}

/*------------------------------------------------

寫入壹個字節

------------------------------------------------*/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

DelayUs2x(25);

DQ = 1;

dat>>=1;

}

DelayUs2x(25);

}

/*------------------------------------------------

讀取溫度

------------------------------------------------*/

unsigned int ReadTemperature(void)

{

unsigned char a=0;

unsigned int b=0;

unsigned int t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳過讀序號列號的操作

WriteOneChar(0x44); // 啟動溫度轉換

DelayMs(10);

Init_DS18B20();

WriteOneChar(0xCC); //跳過讀序號列號的操作

WriteOneChar(0xBE); //讀取溫度寄存器等(***可讀9個寄存器) 前兩個就是溫度

a=ReadOneChar(); //低位

b=ReadOneChar(); //高位

b<<=8;

t=a+b;

return(t);

}

  • 上一篇:如何寫壹篇關於山梅的作文
  • 下一篇:怎樣運作壹個科技公司
  • copyright 2024編程學習大全網