久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
1602液晶顯示用于產(chǎn)品的LM75A溫控制器STC15F104E MCU源碼
[打印本頁]
作者:
冰冰潔潔
時(shí)間:
2018-11-24 03:03
標(biāo)題:
1602液晶顯示用于產(chǎn)品的LM75A溫控制器STC15F104E MCU源碼
微型貼片單片機(jī)STC15F104E單片機(jī)做的LM75A溫控制器,帶1602液晶顯示器,有溫度設(shè)置。用最小的單片機(jī)做最多的功能
制作出來的實(shí)物圖如下:
20181124_022450.jpg
(295.33 KB, 下載次數(shù): 54)
下載附件
2018-11-24 02:59 上傳
單片機(jī)源碼:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P3^1;
sbit scl=P3^0;
void delay() //@11.0592MHz stc12(100us)
{
unsigned char i, j;
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void delay1(uint x)//@11.0592MHz stc12(1ms)
{
unsigned char i, j;
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
/* ***************************************************** */
// 起別名定義
/* ***************************************************** */
typedef unsigned char uChar8;
typedef unsigned int uInt16;
typedef enum{FALSE,TRUE} BOOL;
/* ***************************************************** */
// 宏定義
/* ***************************************************** */
#define LM75ADevIDAddr 0x90
#define IIC_WRITE 0x00
#define IIC_READ 0x01
/* ***************************************************** */
// 位定義
/* ***************************************************** */
sbit SCL = P3^2;//綠色線
sbit SDA = P3^3;//白色線
long int LM75WD;
long int SET=28000; //28.000度
//sbit led1=P3^0;//溫度燈報(bào)警
//sbit led2=P3^1;//壓力燈報(bào)警
sbit OUT=P3^5;//控制器輸出
sbit IN=P3^4;//開關(guān)輸入設(shè)置溫度
/* ***************************************************** */
// 全局變量定義
/* ***************************************************** */
bit p_bH0L_Flag; // 溫度"0"上、下標(biāo)志位
float p_fLM75ATemp; // 溫度值
/* ***************************************************** */
// 函數(shù)名稱:Delay5US()
// 函數(shù)功能:微秒延時(shí)
// 入口參數(shù):延時(shí)微秒數(shù)(ValUS)
// 出口參數(shù):無
/* ***************************************************** */
void Delay5US(void)
{
unsigned char i;
_nop_();
i = 11;
while (--i);
}
/* ***************************************************** */
// 函數(shù)名稱:DelayMS()
// 函數(shù)功能:毫秒延時(shí)
// 入口參數(shù):延時(shí)毫秒數(shù)(ValMS)
// 出口參數(shù):無
/* ***************************************************** */
void DelayMS(uInt16 ValMS)
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
/* ***************************************************** */
// 函數(shù)名稱:IIC_Start()
// 函數(shù)功能:IIC起動(dòng)
// 入口參數(shù):無
// 出口參數(shù):無
/* ***************************************************** */
void IIC_Start(void)
{
SDA = 1;
Delay5US();
SCL = 1;
Delay5US();
SDA = 0;
Delay5US();
}
/* ***************************************************** */
// 函數(shù)名稱:IIC_Stop()
// 函數(shù)功能:IIC停止
// 入口參數(shù):無
// 出口參數(shù):無
/* ***************************************************** */
void IIC_Stop(void)
{
SDA = 0;
Delay5US();
SCL = 1;
Delay5US();
SDA =1;
}
/* ***************************************************** */
// 函數(shù)名稱:IIC_Ack()
// 函數(shù)功能:IIC應(yīng)答
// 入口參數(shù):無
// 出口參數(shù):無
/* ***************************************************** */
void IIC_Ack(void)
{
SCL = 0; // 為產(chǎn)生脈沖準(zhǔn)備
SDA = 0; // 產(chǎn)生應(yīng)答信號(hào)
Delay5US(); // 延時(shí)你懂得
SCL = 1;Delay5US();
SCL = 0;Delay5US(); // 產(chǎn)生高脈沖
SDA = 1; // 釋放總線
}
/* ***************************************************** */
// 函數(shù)名稱:IIC_RdAck()
// 函數(shù)功能:讀IIC應(yīng)答
// 入口參數(shù):無
// 出口參數(shù):是否應(yīng)答真值
/* ***************************************************** */
BOOL IIC_RdAck(void)
{
BOOL AckFlag;
uChar8 uiVal = 0;
SCL = 0;Delay5US();
SDA = 1;
SCL = 1;Delay5US();
while((1 == SDA) && (uiVal < 255))
{
uiVal ++;
AckFlag = SDA;
}
SCL = 0;
return AckFlag; // 應(yīng)答返回:0;不應(yīng)答返回:1
}
/* ***************************************************** */
// 函數(shù)名稱:IIC_Nack()
// 函數(shù)功能:IIC不應(yīng)答
// 入口參數(shù):無
// 出口參數(shù):無
/* ***************************************************** */
void IIC_Nack(void)
{
SDA = 1;
SCL = 0;Delay5US();
SCL = 1;Delay5US();
SCL = 0;
}
/* ***************************************************** */
// 函數(shù)名稱:OutputOneByte()
// 函數(shù)功能:從IIC器件中讀出一個(gè)字節(jié)
// 入口參數(shù):無
// 出口參數(shù):讀出的一個(gè)字節(jié)(uByteVal)
/* ***************************************************** */
uChar8 OutputOneByte(void)
{
uChar8 uByteVal = 0;
uChar8 iCount;
SDA = 1;
for (iCount = 0;iCount < 8;iCount++)
{
SCL = 0;
Delay5US();
SCL = 1;
Delay5US();
uByteVal <<= 1;
if(SDA)
uByteVal |= 0x01;
}
SCL = 0;
return(uByteVal);
}
/* ***************************************************** */
// 函數(shù)名稱:InputOneByte()
// 函數(shù)功能:向IIC器件寫入一個(gè)字節(jié)
// 入口參數(shù):待寫入的一個(gè)字節(jié)(uByteVal)
// 出口參數(shù):無
/* ***************************************************** */
void InputOneByte(uChar8 uByteVal)
{
uChar8 iCount;
for(iCount = 0;iCount < 8;iCount++)
{
SCL = 0;
Delay5US();
SDA = (uByteVal & 0x80) >> 7;
Delay5US();
SCL = 1;
Delay5US();
uByteVal <<= 1;
}
SCL = 0;
}
/* ***************************************************** */
// 函數(shù)名稱:IIC_WrDevAddAndDatAdd()
// 函數(shù)功能:向IIC器件寫入器件和數(shù)據(jù)地址
// 入口參數(shù):器件地址(uDevAdd),數(shù)據(jù)地址(uDatAdd)
// 出口參數(shù):寫入是否成功真值
/* ***************************************************** */
BOOL IIC_WrDevAddAndDatAdd(uChar8 uDevAdd,uChar8 uDatAdd)
{
IIC_Start(); // 發(fā)送開始信號(hào)
InputOneByte(uDevAdd); // 輸入器件地址
IIC_RdAck(); // 讀應(yīng)答信號(hào)
InputOneByte(uDatAdd); // 輸入數(shù)據(jù)地址
IIC_RdAck(); // 讀應(yīng)答信號(hào)
return TRUE;
}
/* ***************************************************** */
// 函數(shù)名稱:IIC_RdDatFromAdd()
// 函數(shù)功能:向IIC器件讀數(shù)據(jù)
// 入口參數(shù):器件ID(uDevID)、數(shù)據(jù)存儲(chǔ)地址(uStaAddVal)
// 待存數(shù)據(jù)(*p)、連續(xù)存儲(chǔ)數(shù)據(jù)的個(gè)數(shù)(uiLenVal)
// 出口參數(shù):無
/* ***************************************************** */
void IIC_RdDatFromAdd(uChar8 uDevID, uChar8 uStaAddVal, uChar8 *p, uChar8 uiLenVal)
{
uChar8 iCount;
IIC_WrDevAddAndDatAdd(uDevID | IIC_WRITE,uStaAddVal);
IIC_Start();
InputOneByte(uDevID | IIC_READ);
// IIC_READ 為寫命令后綴符
IIC_RdAck();
for(iCount = 0;iCount < uiLenVal;iCount++)
{
*p++ = OutputOneByte();
if(iCount != (uiLenVal - 1))
IIC_Ack();
}
IIC_Nack();
IIC_Stop();
}
/* ***************************************************** */
// 函數(shù)名稱:LM75A_ReadReg()
// 函數(shù)功能:讀LM75A任意寄存器值
// 入口參數(shù):寄存器地址(addr),uLenVal,讀出字節(jié)的長(zhǎng)度
// 出口參數(shù):寄存器內(nèi)容(*val)
/* ***************************************************** */
void LM75A_ReadReg(uChar8 addr, uChar8 *val, uChar8 uLenVal)
{
IIC_RdDatFromAdd(LM75ADevIDAddr, addr, val, uLenVal);
}
/* ***************************************************** */
// 函數(shù)名稱:LM75A_TempConv()
// 函數(shù)功能:溫度轉(zhuǎn)換
// 入口參數(shù):無
// 出口參數(shù):無
/* ***************************************************** */
void LM75A_TempConv(void)
{
uChar8 TempML[2]={0}; // 臨時(shí)數(shù)值,用于存放Temp的高低字節(jié)
uInt16 uiTemp; // 用于存放Temp的11位字節(jié)數(shù)據(jù)
LM75A_ReadReg(0x00,TempML,2); // 讀出溫度,并存于數(shù)組TempHL中
uiTemp = (uInt16)TempML[0]; // 將高字節(jié)存入變量uiTemp中
uiTemp = (uiTemp << 8 | TempML[1]) >> 5; // 接著并入后3位,最后右移5位就是11位補(bǔ)碼數(shù)(8+3共11位)
/* ***** 首先判斷溫度是“0上”還是是“0下” ***** */
if(!(TempML[0] & 0x80)) // 最高位為“0”則為“0上”
{
p_bH0L_Flag = 0;
p_fLM75ATemp = uiTemp * 0.125;
}
else // 這時(shí)為“0下”(p_fLM75ATemp)℃
{
p_bH0L_Flag = 1;
p_fLM75ATemp = (0x800 - uiTemp) * 0.125;// 由于計(jì)算機(jī)中負(fù)數(shù)是以補(bǔ)碼形式存的,所以有這樣的算法。
}
}
/********************************1602**************************************/
void start() //開始信號(hào)
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //停止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //應(yīng)答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void init()
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
void write_add(uchar date1)
{
start();
write_byte(0x4e); //8574A 地址+寫入 (8574 地址+寫入0x4e)//0x27+0x27=0x4e//全部空0x3f+0x3f=0x7e
respons();
write_byte(date1);
respons();
stop();
}
void write_com(uchar com) //寫命令函數(shù)
{ uchar com1,com2;
com1=com|0x0f;
write_add(com1&0xfc);
delay1(2);
write_add(com1&0xf8);
com2=com<<4;
com2=com2|0x0f;
write_add(com2&0xfc);
delay1(2);
write_add(com2&0xf8);
}
void write_date(uchar date) //寫數(shù)據(jù)函數(shù)
{
uchar date1,date2;
date1=date|0x0f;
write_add(date1&0xfd);
delay1(2);
write_add(date1&0xf9);
date2=date<<4;
date2=date2|0x0f;
write_add(date2&0xfd);
delay1(2);
write_add(date2&0xf9);
}
void write_zfc(uchar *p)//定義一個(gè)帶指針的函數(shù)?(字符串)
{
while(*p!=0)//不能用";"
write_date(*p++);
}
void init_lcd() //初始化函數(shù)
{
write_add(0x08); //默認(rèn)開始狀態(tài)為關(guān)使能端,見時(shí)序圖 選擇狀態(tài)為 寫
write_com(0x0f);
write_com(0x28); //顯示模式設(shè)置 0x28中高位2,設(shè)置4線。
write_add(0x0c);
write_add(0x08); //使能4線
write_com(0x28); //顯示模式設(shè)置,為0x28。
write_com(0x01); //顯示清屏,將上次的內(nèi)容清除,默認(rèn)為0x01.
write_com(0x0c); //顯示功能設(shè)置0x0f為開顯示,顯示光標(biāo),光標(biāo)閃爍;0x0c為開顯示,不顯光標(biāo),光標(biāo)不閃
write_com(0x06); //設(shè)置光標(biāo)狀態(tài)默認(rèn)0x06,為讀一個(gè)字符光標(biāo)加1.
}
void display(long temp) //顯示函數(shù)
{
uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
//temp=12345678;
dt1 = temp%10;//1位
dt2 = temp%100/10;//2位
dt3 = temp%1000/100;//3位
dt4 = temp%10000/1000;//4位
dt5 = temp%100000/10000;//5位
dt6 = temp%1000000/100000;//6位
dt7 = temp%10000000/1000000;//7位
dt8 = temp/10000000;//8位 最高位
write_com(0xC0); //第1行
write_zfc("WD:");
//write_date(dt8+0x30);
//write_date(dt7+0x30);
//write_date(dt6+0x30);
write_date(dt5+0x30);
write_date(dt4+0x30);
write_zfc(".");
write_date(dt3+0x30);
write_date(dt2+0x30);
//write_date(dt1+0x30);
write_zfc("C");
}
void display2(long temp) //顯示函數(shù)
{
uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
//temp=12345678;
dt1 = temp%10;//1位
dt2 = temp%100/10;//2位
dt3 = temp%1000/100;//3位
dt4 = temp%10000/1000;//4位
dt5 = temp%100000/10000;//5位
dt6 = temp%1000000/100000;//6位
dt7 = temp%10000000/1000000;//7位
dt8 = temp/10000000;//8位 最高位
write_com(0xc0+10); //第1行
write_zfc("SET:");
//write_date(dt8+0x30);
//write_date(dt7+0x30);
//write_date(dt6+0x30);
write_date(dt5+0x30);
write_date(dt4+0x30);
//rite_zfc(".");
//write_date(dt3+0x30);
//write_date(dt2+0x30);
//write_date(dt1+0x30);
write_zfc("C");
}
void main()
{
init_lcd();
OUT=1;//啟動(dòng)時(shí)關(guān)一下
while(1)
{
LM75A_TempConv();//讀取溫度LM75A
DelayMS(200);
LM75WD = p_fLM75ATemp * 1000;// 將溫度全部轉(zhuǎn)換成整數(shù),以便數(shù)碼管顯示
init(); //通訊1602
display(LM75WD); // 顯示1602
display2(SET); // 顯示1602
if(IN==0)//設(shè)置溫度
{
SET=SET+1000;
if(SET>99999)//設(shè)置溫度
SET=28000;
}
if(LM75WD>=SET)// 溫度30
{
OUT=0;
write_com(0x80); //第1行
write_zfc("OUT:OFF");//220V電源關(guān)閉
}
else{
if(LM75WD<=SET-1000)// 溫度回落1.000度后再執(zhí)行,防閃爍
{
OUT=1;
write_com(0x80); //第1行
write_zfc("OUT: ON");//220V電源輸出
}
else
{
OUT=0;
write_com(0x80); //第1行
write_zfc("OUT:OFF");//220V電源關(guān)閉
}
}
}
}
復(fù)制代碼
全部資料51hei下載地址:
1602顯串STC15F104E LM75A溫度OK3(0x4e).zip
(67.22 KB, 下載次數(shù): 53)
2018-11-24 03:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
JackeyM
時(shí)間:
2023-7-16 09:39
如果需要將收集的數(shù)據(jù)傳輸?shù)诫娔X上,該如何操作
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久久国产一区
|
99亚洲精品视频
|
亚洲精品免费在线
|
国产视频一区二区三区四区五区
|
国产又色又爽又黄又免费
|
久久剧场
|
成人精品一区二区三区中文字幕
|
国产成人免费视频网站高清观看视频
|
亚洲国产精品久久久久婷婷老年
|
日本人爽p大片免费看
|
99精品99
|
欧美日韩在线一区二区
|
欧美日韩精品中文字幕
|
91在线观看免费视频
|
色婷婷一区二区三区四区
|
欧美在线视频一区
|
久久久精彩视频
|
先锋av资源网
|
久久久久久久久久久久久9999
|
国产免费一二三区
|
国产一区二区免费电影
|
夜夜精品浪潮av一区二区三区
|
野狼在线社区2017入口
|
成人精品鲁一区一区二区
|
亚洲精品视
|
国产精品视频偷伦精品视频
|
www日韩
|
在线免费观看日本视频
|
日韩另类
|
久久福利电影
|
91麻豆精品一区二区三区
|
久久久噜噜噜www成人网
|
天堂一区在线观看
|
91观看
|
欧美日韩综合视频
|
欧美日韩亚洲视频
|
在线观看国产www
|
久久久久成人精品
|
国产真实乱对白精彩久久小说
|
五月综合激情在线
|
亚洲一区久久
|