目录

1.使用的单片机为IAPI15F2K61S2

2.使用的外设

3.各个外设的作用

1.数码管功能

 2.LED灯

3.蜂鸣器与继电器

4.按键

5.串口通信

4.利用发送单个字符函数

发送字符型的数字值,为一个变量+'0',发送为字符型数字。

4.初始化

5.程序

1.main

2.iic.h

3.onewire.c

1.使用的单片机为IAPI15F2K61S2

2.使用的外设

1.LED灯,继电器与蜂鸣器。

2.数码管与按键。

3.DS18B20 和PCF85911。

4.串口通信。

3.各个外设的作用

1.数码管功能

1.显示室温的温度与转口的电压相互切换。

 2.LED灯

1.处于温度显示界面时,LED1灯亮。

2.处于电压显示界面时,LED2灯亮。

3.处于锁定界面时,LED3为0.1s为周期。

3.蜂鸣器与继电器

1.电压大于3.60时蜂鸣器响。

2.温度大于28.0度时继电器吸合。

4.按键

1.S4按键按下为锁定,串口发送不能控制单片机。

2.S5按键按下为解除锁定。

3.S12按键按下串口发送当时数码管显示的数值,只在锁定的界面有效。

5.串口通信

1.串口发送'A',数码管显示温度界面,并且收到当时的温度。

2.串口发送'B',数码管显示电压界面,并且收到当时的电压。

3.返回的格式,温度:25.2C,电压:2.33V。

4.利用发送单个字符函数

发送字符型的数字值,为一个变量+'0',发送为字符型数字。

4.初始化

1.默认为温度显示界面

2.蜂鸣器与继电器关闭。

5.程序

1.main

#include

#include "iic.h"

#include "onewire.h"

int ds18b20_ms; //温度计时

int adc_ms; //电压计时

int led_ms; //灯计时

void Timer2Init(void) //1ms@12.000MHz

{

AUXR &= 0xFB; //定时器时钟12T模式

T2L = 0x20; //设置定时初始值

T2H = 0xD1; //设置定时初始值

AUXR |= 0x10; //定时器2开始计时

EA=1;

IE2|=0x04;

}

void Delay1ms(int xms) //@12.000MHz

{

unsigned char i, j;

while(xms--)

{

i = 12;

j = 169;

do

{

while (--j);

} while (--i);

}

}

void Device(unsigned char p2,unsigned char p0)

{

P0=p0;

P2=P2&0x1f|p2;

P2=P2&0x1f;

}

//初始化关闭led灯和蜂鸣器与继电器

void system()

{

Device(0xa0,0);

Device(0x80,0xff);

}

// 0~9 U .

unsigned char nixie[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3E,0x80};

void smg(unsigned n,unsigned m)

{

int a;

a=0x01<

Device(0xc0,0);

Device(0xe0,~nixie[m]);

Device(0xc0,a);

}

int wdl;//接收温度

void wd()

{

if(ds18b20_ms>=10)//10毫秒刷新一次

{

wdl=ds18b20_read();

ds18b20_ms=0;

}

}

unsigned char adc_255;//接收电压

int adc_500;//转换后的电压

void adc_dq()

{

if(adc_ms>10)

{

adc_255=ADC(0x43);

adc_ms=0;

}

adc_500=adc_255*100/51;

}

char model=0;//显示状态

void smg_show()

{

//温度

if(model==0)

{

smg(0,10);

smg(1,1);

smg(5,wdl/100);

smg(6,wdl/10%10);

smg(6,11);

smg(7,wdl%10);

}

//电压

if(model==1)

{

smg(0,10);

smg(1,2);

smg(5,adc_500/100);

smg(5,11);

smg(6,adc_500/10%10);

smg(7,adc_500%10);

}

}

void UartInit(void) //9600bps@12.000MHz

{

SCON = 0x50; //8位数据,可变波特率

AUXR |= 0x40; //定时器时钟1T模式

AUXR &= 0xFE; //串口1选择定时器1为波特率发生器

TMOD &= 0x0F; //设置定时器模式

TL1 = 0xC7; //设置定时初始值

TH1 = 0xFE; //设置定时初始值

ET1 = 0; //禁止定时器%d中断

TR1 = 1; //定时器1开始计时

ES=1;

EA=1;

}

char coude=0;//判断是否锁定

void Senart(char p)//发送一个字符

{

SBUF =p;

while(TI==0);

TI=0;

}

void senartstring( char* b)//发送字符串

{

char s=0;

do

{

Senart(*(b+s));

s++;

}while(*(b+s)!='\0');

}

unsigned char cn;//接收串口发送的数据

void key()//按键

{

P44=0;P42=1;P3=0xFF;

//s4

if(P33==0){Delay1ms(1);if(P33==0){ coude=1;while(P33==0){}}}

//s5

if(P32==0){Delay1ms(1);if(P32==0){ coude=0;while(P32==0){}}}

//s12

if(coude==1)

{

P4=0xff;P3=0xDF;

if(P33==0){Delay1ms(1);if(P33==0)

{ if(model==0){senartstring("温度:"); Senart( wdl/100+'0');Senart( wdl/10%10+'0') ;senartstring(".");Senart( wdl%10+'0') ; senartstring("C"); }

if(model==1){senartstring("电压:"); Senart( adc_500/100+'0');senartstring(".");Senart( adc_500/10%10+'0');Senart( adc_500%10+'0') ; senartstring("V"); }

while(P33==0){}}}

}

}

void u1() interrupt 4

{

if(RI==1)

{

cn=SBUF;

if(coude==0)

{

switch(cn)

{

case 'A':model=0;senartstring("温度:"); Senart( wdl/100+'0');Senart( wdl/10%10+'0') ;senartstring(".");Senart( wdl%10+'0') ;senartstring("C");break;

case 'B':model=1;senartstring("电压:"); Senart( adc_500/100+'0');senartstring(".");Senart( adc_500/10%10+'0');Senart( adc_500%10+'0') ;senartstring("V");break;

}

}

RI=0;//清除中断标志位

}

}

char i=0;//用led闪

void LED()

{

if(model==0&&coude==0)

Device(0x80,~0x01);

if(model==1&&coude==0)

Device(0x80,~0x02);

if(coude==1)

{

if(led_ms>500&&i==0)

{

led_ms=0;

Device(0x80,~0x04);

i++;

i=i%2;

}

if(led_ms>500&&i==1)

{

led_ms=0;

Device(0x80,0xff);

i++;

i=i%2;

}

}

}

void bj()//报警函数

{

//温度大于28时

if(wdl>280)

{

Device(0xa0,0x10);

}

else

{

Device(0xa0,0);

}

//电压大于3.60时

if(adc_500>360)

{

Device(0xa0,0x40);

}

else

{

Device(0xa0,0);

}

}

void main()

{

Timer2Init();

system();

UartInit() ;

while(1)

{

smg_show();

bj();

}

}

void t2() interrupt 12

{

ds18b20_ms++;

adc_ms++;

led_ms++;

wd();

adc_dq();

LED();

key();

}

2.iic.c

#include "reg52.h"

#include "intrins.h"

#define DELAY_TIME 5

#define SlaveAddrW 0xA0

#define SlaveAddrR 0xA1

//总线引脚定义

sbit SDA = P2^1; /* 数据线 */

sbit SCL = P2^0; /* 时钟线 */

void IIC_Delay(unsigned char i)

{

do{_nop_();}

while(i--);

}

//总线启动条件

void IIC_Start(void)

{

SDA = 1;

SCL = 1;

IIC_Delay(DELAY_TIME);

SDA = 0;

IIC_Delay(DELAY_TIME);

SCL = 0;

}

//总线停止条件

void IIC_Stop(void)

{

SDA = 0;

SCL = 1;

IIC_Delay(DELAY_TIME);

SDA = 1;

IIC_Delay(DELAY_TIME);

}

//发送应答

void IIC_SendAck(bit ackbit)

{

SCL = 0;

SDA = ackbit; // 0:应答,1:非应答

IIC_Delay(DELAY_TIME);

SCL = 1;

IIC_Delay(DELAY_TIME);

SCL = 0;

SDA = 1;

IIC_Delay(DELAY_TIME);

}

//等待应答

bit IIC_WaitAck(void)

{

bit ackbit;

SCL = 1;

IIC_Delay(DELAY_TIME);

ackbit = SDA;

SCL = 0;

IIC_Delay(DELAY_TIME);

return ackbit;

}

//通过I2C总线发送数据

void IIC_SendByte(unsigned char byt)

{

unsigned char i;

for(i=0; i<8; i++)

{

SCL = 0;

IIC_Delay(DELAY_TIME);

if(byt & 0x80) SDA = 1;

else SDA = 0;

IIC_Delay(DELAY_TIME);

SCL = 1;

byt <<= 1;

IIC_Delay(DELAY_TIME);

}

SCL = 0;

}

//从I2C总线上接收数据

unsigned char IIC_RecByte(void)

{

unsigned char i, da;

for(i=0; i<8; i++)

{

SCL = 1;

IIC_Delay(DELAY_TIME);

da <<= 1;

if(SDA) da |= 1;

SCL = 0;

IIC_Delay(DELAY_TIME);

}

return da;

}

char ADC(char a)

{

char ad;

IIC_Start();

IIC_SendByte(0x90);

IIC_WaitAck();

IIC_SendByte(a);

IIC_WaitAck();

IIC_Start();

IIC_SendByte(0x91);

IIC_WaitAck();

ad=IIC_RecByte();

IIC_SendAck(1);

IIC_Stop();

return ad;

}

2.iic.h

#ifndef _IIC_H

#define _IIC_H

unsigned char ADC(char a);

#endif

3.onewire.c

#include "reg52.h"

sbit DQ = P1^4; //单总线接口

//单总线延时函数

void Delay_OneWire(unsigned int t) //STC89C52RC

{

t=t*12;

while(t--);

}

//通过单总线向DS18B20写一个字节

void Write_DS18B20(unsigned char dat)

{

unsigned char i;

for(i=0;i<8;i++)

{

DQ = 0;

DQ = dat&0x01;

Delay_OneWire(5);

DQ = 1;

dat >>= 1;

}

Delay_OneWire(5);

}

//从DS18B20读取一个字节

unsigned char Read_DS18B20(void)

{

unsigned char i;

unsigned char dat;

for(i=0;i<8;i++)

{

DQ = 0;

dat >>= 1;

DQ = 1;

if(DQ)

{

dat |= 0x80;

}

Delay_OneWire(5);

}

return dat;

}

//DS18B20设备初始化

bit init_ds18b20(void)

{

bit initflag = 0;

DQ = 1;

Delay_OneWire(12);

DQ = 0;

Delay_OneWire(80);

DQ = 1;

Delay_OneWire(10);

initflag = DQ;

Delay_OneWire(5);

return initflag;

}

float ds18b20_read()

{

int hignet,low;

float rd;

init_ds18b20();

Write_DS18B20(0xcc);

Write_DS18B20(0x44);

init_ds18b20();

Write_DS18B20(0xcc);

Write_DS18B20(0xbe);

low=Read_DS18B20();

hignet=Read_DS18B20();

rd=((hignet<<8)|low)*0.625;

if(rd<700)

return rd; //除去一上电的85

}

3.onewire.h

#ifndef __ONEWIRE_H

#define __ONEWIRE_H

float ds18b20_read();

#endif

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: