|
基于STC12C5A60S2芯片,有掉電保護(hù)程序
單片機源程序如下:
- //LM75溫度控制器//
- //頭文件
- #include<STC12C5A60S2.h>
- #include<intrins.h>
- //宏
- #define uchar unsigned char
- #define uint unsigned int
- #define CONF 0X01 //配置寄存器
- #define TEMP 0X00 //溫度寄存器只讀
- #define ALARM 0X03 //超溫關(guān)閉極限寄存器默認(rèn)5000H
- #define DELAY 0X02 //滯后寄存器默認(rèn)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;
- //*****************************************************//函數(shù)名
- void init(void); //初始化
- void start(void); //起始
- void stop(void); //終止
- void ack(void); //應(yīng)答
- void noack(void); //非應(yīng)答
- bit rack(void); //接受應(yīng)答位
- void send(uchar date); //發(fā)送數(shù)據(jù) 1字節(jié)
- uchar read(void); //接受數(shù)據(jù) 1字節(jié)
- uchar w_config(uchar cdata); //寫配置寄存器
- uchar Twendu(uchar Twd,uchar wen_high,uchar wen_low); //高低溫
- float read_16(uchar addr); //讀2字節(jié)
- uchar read8(uchar adder); //讀1字節(jié)
- void disseg(uint seg); //顯示
- void delay(void); //5us
- void delay10ms(void); //10us
- void delay500ms(void); //500ms
- void kaishi(void); //
- //AIP //
- void iapidle(); //AIP初始化函數(shù)
- uchar iapreadbyte(uint addr); //讀EEPROM的一個字節(jié)地址的內(nèi)容
- void iapprogrambyte(uint addr,uchar dat); //寫一個字節(jié)的IAP/ISP/EEPROM空間
- void iaperasesector(uint addr); //扇區(qū)擦除
- //*****************************************************//
- //初始化
- 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;
- }
- //應(yīng)答
- void ack(void)
- {
- uchar a;
- sda=0;
- scl=1;
- delay();
- while(sda==1&&(a<255))
- {
- a++;
- }
- scl=0;
- delay();
- }
- //非應(yīng)答
- void noack(void)
- {
- sda=1;
- scl=1;
- delay();
- scl=0;
- sda=0;
- }
- //接受應(yīng)答位
- bit rack(void)
- {
- bit flag;
- scl=1;
- delay();
- flag=sda;
- scl=0;
- delay();
- return flag;
- }
- //發(fā)送數(shù)據(jù) 1字節(jié)
- 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();
- }
- //接受數(shù)據(jù) 1字節(jié)
- 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字節(jié)溫度
- 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() //****初始化函數(shù)
- {
- IAP_CONTR=0; //關(guān)閉IAP功能
- IAP_CMD=0; //CMD寄存器初始化
- IAP_TRIG=0; //清空觸發(fā)寄存器
- IAP_ADDRH=0X80; //數(shù)據(jù)指針指向非EEPROM區(qū)
- IAP_ADDRL=0; //CLEAR IAP address to preventmisuse
- }
- uchar iapreadbyte(uint addr) //讀EEPROM的一個字節(jié)地址的內(nèi)容
- {
- IAP_CONTR=ENABLE_IAP; //設(shè)置IAP控制寄存器
- IAP_CMD=1; //設(shè)置IAP的命令寄存器為讀狀態(tài)
- IAP_ADDRL=addr; //設(shè)置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) //寫一個字節(jié)的IAP/ISP/EEPROM空間
- {
- IAP_CONTR=ENABLE_IAP; //打開IAP功能并設(shè)置等待時間
- IAP_CMD=2; //設(shè)置寫命令
- IAP_ADDRL=addr; //設(shè)置字節(jié)地址低8位
- IAP_ADDRH=addr>>8; //設(shè)置字節(jié)地址的高8位
- IAP_DATA=dat; //寫內(nèi)容
- IAP_TRIG=0X5A; //發(fā)送觸發(fā)命令1
- IAP_TRIG=0XA5; //發(fā)送觸發(fā)命令2
- _nop_(); //等待直到寫操作完成 60us
- iapidle();
- }
- void iaperasesector(uint addr) //扇區(qū)擦除
- {
- IAP_CONTR=ENABLE_IAP; //開IAP功能并設(shè)置等待時間
- IAP_CMD=3; //設(shè)置擦除命令
- 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); //讀數(shù)
- 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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
LM75溫度傳感器.rar
(2.89 KB, 下載次數(shù): 29)
2017-6-11 21:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|