目录
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 精彩内容
发表评论