亚洲春色中文字幕久久久-三上亚,91精品国产亚一区二区三区,久久久九色综合亚洲成色777,涩涩视频下载,国产午夜亚洲精品午夜鲁丝片,国产精品A一区二区三区腾讯导航,影音先锋色情AV在线看片,蜜臀国产在线视频,极品少妇高潮啪啪无码吴梦梦 ,精品人妻无码一区二区三区手机版
標題:
LM75溫度傳感器的單片機控制程序 帶掉電保護功能
[打印本頁]
作者:
metatron
時間:
2017-6-11 21:36
標題:
LM75溫度傳感器的單片機控制程序 帶掉電保護功能
基于STC12C5A60S2芯片,有掉電保護程序
單片機源程序如下:
//LM75溫度控制器//
//頭文件
#include<STC12C5A60S2.h>
#include<intrins.h>
//宏
#define uchar unsigned char
#define uint unsigned int
#define CONF 0X01 //配置寄存器
#define TEMP 0X00 //溫度寄存器只讀
#define ALARM 0X03 //超溫關閉極限寄存器默認5000H
#define DELAY 0X02 //滯后寄存器默認4B00H
#define WADDR 0X90 //寫地址
#define RADDR 0X91 //讀地址
//////////////
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰 段
//0, 1, 2 3 4 5 6 7 8 9
uchar out[]={0x01,0x02,0x04,0x08}; //位
uchar discount=0;
sbit sda=P3^5;
sbit scl=P3^4;
sbit os=P3^2;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^4;
sbit redled=P1^2;
uint disshu=0;
float tempchu;
uchar tempcount=0;
uint Tsettemp;
bit dp=0;
uchar dat;
//IAP
#define ENABLE_IAP 0X83
#define IAP_ADDRESS 0X0000//定義EEPROM 的起始地址
sfrIAP_DATA=0XC2;
sfrIAP_ADDRH=0XC3;
sfrIAP_ADDRL=0XC4;
sfrIAP_CMD=0XC5;
sfrIAP_TRIG=0XC6;
sfrIAP_CONTR=0XC7;
//*****************************************************//函數名
void init(void); //初始化
void start(void); //起始
void stop(void); //終止
void ack(void); //應答
void noack(void); //非應答
bit rack(void); //接受應答位
void send(uchar date); //發送數據 1字節
uchar read(void); //接受數據 1字節
uchar w_config(uchar cdata); //寫配置寄存器
uchar Twendu(uchar Twd,uchar wen_high,uchar wen_low); //高低溫
float read_16(uchar addr); //讀2字節
uchar read8(uchar adder); //讀1字節
void disseg(uint seg); //顯示
void delay(void); //5us
void delay10ms(void); //10us
void delay500ms(void); //500ms
void kaishi(void); //
//AIP //
void iapidle(); //AIP初始化函數
uchar iapreadbyte(uint addr); //讀EEPROM的一個字節地址的內容
void iapprogrambyte(uint addr,uchar dat); //寫一個字節的IAP/ISP/EEPROM空間
void iaperasesector(uint addr); //扇區擦除
//*****************************************************//
//初始化
void init(void)
{
scl=1;
delay();
sda=1;
delay();
}
//起始
void start(void)
{
scl=1;
sda=1;
delay();
sda=0;
delay();
scl=0;
}
//終止
void stop(void)
{
scl=0;
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
sda=0;
}
//應答
void ack(void)
{
uchar a;
sda=0;
scl=1;
delay();
while(sda==1&&(a<255))
{
a++;
}
scl=0;
delay();
}
//非應答
void noack(void)
{
sda=1;
scl=1;
delay();
scl=0;
sda=0;
}
//接受應答位
bit rack(void)
{
bit flag;
scl=1;
delay();
flag=sda;
scl=0;
delay();
return flag;
}
//發送數據 1字節
void send(uchar date)
{
uchar s,temp;
temp=date;
for(s=0;s<8;s++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
//接受數據 1字節
uchar read(void)
{
uchar s,temp;
scl=0;
delay();
sda=1;
for(s=0;s<8;s++)
{
scl=1;
delay();
temp=(temp<<1)|sda;
scl=0;
delay();
}
delay();
return temp;
}
//寫配置寄存器
uchar w_config(uchar cdata)
{
bit i=0;
start();
send(WADDR);
i=rack();
if(i)
{
stop();
return 0;
}
send(CONF);
i=rack();
if(i)
{
stop();
return 0;
}
send(cdata);
i=rack();
if(i)
{
stop();
return 0;
}
delay();
stop();
}
//寫2字節溫度
uchar Twendu(uchar Twd,uchar wen_high,uchar wen_low)
{
bit i=0;
start();
send(WADDR);
i=rack();
if(i)
{
return 0;
}
send(Twd);
i=rack();
if(i)
{
return 0;
}
send(wen_high);
i=rack();
if(i)
{
return 0;
}
send(wen_low);
i=rack();
if(i)
{
return 0;
}
delay();
stop();
}
//讀16位
float read_16(uchar addr)
{
bit i=0;
float cun16;
uchar cun1,cun2;
start();
send(WADDR);
i=rack();
if(i)
{
stop();
return 0;
}
send(addr);
i=rack();
if(i)
{
stop();
return 0;
}
start();
send(RADDR);
i=rack();
if(i)
{
stop();
return 0;
}
cun1=read();// cun16=read();
//cun16=cun16<<8;
ack();
cun2=read()>>7; //cun16|=read();
noack();
delay();
stop();
if(cun1&0x80)
{
dp=1;
cun16=((~(cun1<<1))>>1+1)+cun2*0.5;
}
else
{
dp=0;
cun16=cun1+cun2*0.5;
}
return cun16;
}
uchar read8(uchar adder)
{
uchar i,m;
start();
send(WADDR);
i=rack();
if(i)
{
return 0;
}
send(adder);
i=rack();
if(i)
{
return 0;
}
start();
send(RADDR);
i=rack();
if(i)
{
return 0;
}
m=read();
noack();
delay();
stop();
return m;
}
//************************************************IAP*************************************************************//
void iapidle() //****初始化函數
{
IAP_CONTR=0; //關閉IAP功能
IAP_CMD=0; //CMD寄存器初始化
IAP_TRIG=0; //清空觸發寄存器
IAP_ADDRH=0X80; //數據指針指向非EEPROM區
IAP_ADDRL=0; //CLEAR IAP address to preventmisuse
}
uchar iapreadbyte(uint addr) //讀EEPROM的一個字節地址的內容
{
IAP_CONTR=ENABLE_IAP; //設置IAP控制寄存器
IAP_CMD=1; //設置IAP的命令寄存器為讀狀態
IAP_ADDRL=addr; //設置EERPROM的低8位地址
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
_nop_();
dat=IAP_DATA;
iapidle();
return dat;
}
void iapprogrambyte(uint addr,uchar dat) //寫一個字節的IAP/ISP/EEPROM空間
{
IAP_CONTR=ENABLE_IAP; //打開IAP功能并設置等待時間
IAP_CMD=2; //設置寫命令
IAP_ADDRL=addr; //設置字節地址低8位
IAP_ADDRH=addr>>8; //設置字節地址的高8位
IAP_DATA=dat; //寫內容
IAP_TRIG=0X5A; //發送觸發命令1
IAP_TRIG=0XA5; //發送觸發命令2
_nop_(); //等待直到寫操作完成 60us
iapidle();
}
void iaperasesector(uint addr) //扇區擦除
{
IAP_CONTR=ENABLE_IAP; //開IAP功能并設置等待時間
IAP_CMD=3; //設置擦除命令
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0XA5;
_nop_(); // 21ms
iapidle();
}
//************************************************IAP*************************************************************//
void kaishi(void)
{
P2M0 = 0xff;
P2M1 = 0x00;
P0M0 = 0xff;
P0M1 = 0x00;
TMOD = 0x11;
ET0 = 1; //定時器中斷允許
TR0 = 1; //定時器0啟動
TH0 = 0x3C; //定時器0初值 1Ms
TL0 = 0xb0;
ET1 = 1; //定時器中斷允許
TR1 = 1; //定時器1啟動
TH1 = 0xFC; //定時器1初值 1Ms
TL1 = 0x18;
EA=1;
}
void main(void)
{
uchar xuhuan=0;
bit js=1;
uchar dat0;
bit fffz=0;
float Tset;
w_config(0x00);
iapreadbyte(0x00); //讀數
dat0=dat;
Twendu(ALARM,dat0,0x00);
Twendu(DELAY,0x00,0x00);
kaishi();
while(1)
{
if(!key1&&js)
{
delay10ms();
if(!key1&&js)
{
js=0;
TR0=0;
Tset=read_16(ALARM)*10;
Tsettemp=Tset;
xuhuan=1;
redled=1;
}
}
while(xuhuan==1)
{
disshu=Tsettemp;
if(!key2&&js)
{
delay10ms();
if(!key2&&js)
{
Tsettemp=Tsettemp+10;
if(Tsettemp>=1500)
{
Tsettemp=1500;
}
js=0;
}
}
if(!key3&&js)
{
delay10ms();
if(!key3&&js)
{
Tsettemp=Tsettemp-10;
if(Tsettemp<=100)
{
Tsettemp=100;
}
js=0;
}
}
if(!key1&&js)
{
delay10ms();
if(!key1&&js)
{
xuhuan=0;
TR0=1;
js=0;
dat=Tsettemp/10;
iaperasesector(0x00); //擦除
iapprogrambyte(0x00,dat); //寫入
Twendu(ALARM,dat,0x00);
}
}
if(key1&&key2&&key3)
{
js=1;
}
}
if(key1&&key2&&key3)
{
js=1;
}
}
}
void timer0() interrupt 1 //1000us
{
float huan=0;
float qing;
TH0=0x3c;
TL0=0xb0;
tempcount++;
if(tempcount==3)
{
tempcount=0;
huan=read_16(0x00);
tempchu=huan*10;
disshu=tempchu;
}
if((tempchu!=0)&&(Tsettemp!=0))
{
if(tempchu>=Tsettemp)
{
redled=0;
}
}
}
void timer1() interrupt 3 //1000us
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
LM75溫度傳感器.rar
(2.89 KB, 下載次數: 29)
2017-6-11 21:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1