所涉及模块如图 pwm ds18b20参考以前文章
#include <STC15F2K60S2.h>
#include "onewire.h"
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
uchar yi,er,san,si,wu,liu,qi,ba;
uchar tem;//温度
uchar wind_n=1;//风速控制
uchar time=0;//倒计时时间
uchar time_n=0;//定时时间控制
uint tt=0;//定时器计数
uint count=0;
uchar flag7=0;//按键s7标志位
void Delay1ms(uint ms);
void allinit();
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void keyscan();
void ledscan();
void Timer0Init(void);
void main()
{
allinit();
Timer0Init();
yi=10,er=1,san=10,si=11,wu=0,liu=0,qi=0,ba=0;
while(1)
{
if(flag7==0)
{
yi=10,er=wind_n,san=10,si=11;
wu=time/1000,liu=time%1000/100,qi=time%100/10,ba=time%10;
}
if(flag7==1)
{
yi=10,er=4,san=10,si=11,wu=11,liu=tem/10,qi=tem%10,ba=12;
}
tem=temget();
keyscan();
ledscan();
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
void keyscan()
{
if(P30==0)//S7
{
Delay1ms(5);
if(P30==0)
{
if(flag7==0)
flag7=1;
else if (flag7==1)
flag7=0;
}
while(!P30);//避免重复判断
}
if(P31==0)//S6
{
Delay1ms(5);
if(P31==0)
{
time=0;
}
while(!P31);//避免重复判断
}
if(P32==0)//S5
{
Delay1ms(5);
if(P32==0)
{
if(time==0)
time=60;
else if(time<=60)
time=120;
else if(time<=120)
time=0;
// switch(time_n)//切换定时时间 可实现与if同样功能
// {
// case 0:
// time=60;
// time_n=1;
// break;
//
// case 1:
// time=120;
// time_n=2;
// break;
//
// case 2:
// time=0;
// time_n=0;
// break;
// }
}
while(!P32);//避免重复判断
}
if(P33==0)//S4
{
Delay1ms(5);
if(P33==0)
{
if(wind_n==1)
wind_n=2;
else if(wind_n==2)
wind_n=3;
else if(wind_n==3)
wind_n=1;
// switch(wind_n)//切换工作风速 可实现与if同样功能
// {
// case 1:
// wind_n=2;
// break;
//
// case 2:
// wind_n=3;
// break;
//
// case 3:
// wind_n=1;
// break;
// }
}
while(!P33);//避免重复判断
}
}
void ledscan()
{
if(time>0)
{
if(wind_n==1)
{
P2=0X80;
P0=0XFE;
}
else if(wind_n==2)
{
P2=0X80;
P0=0XFD;
}
else if(wind_n==3)
{
P2=0X80;
P0=0XFB;
}
}
else
{
P2=0X80;
P0=0XFF;
}
}
void Timer0Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x50; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
void Timer0() interrupt 1
{
tt++;
count++;
if(count==10000)
{
count=0;
if(time>0)
{
time--;
}
}
if(tt==11)//pwm波频率控制
{
tt=1;
}
if(time>0)
{
if(wind_n==1)//pwm波控制
{
if(tt<3)
P34=1;
else P34=0;
}
else if(wind_n==2)
{
if(tt<4)
P34=1;
else P34=0;
}
else if(wind_n==3)
{
if(tt<8)
P34=1;
else P34=0;
}
}
}
void allinit()
{
P2=0X80;
P0=0XFF;
P2=0XC0;
P0=0XFF;
P2=0XE0;
P0=0XFF;
P2=0XA0;
P0=0X00;
}
void Delay1ms(uint ms) //@12.000MHz
{
unsigned char i, j;
uint k;
for(k=ms;k>0;k--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
void display1(uchar yi,uchar er)
{
P2=0XC0;
P0=0X01;//段选
P2=0XE0;
P0=tab[yi];//位选
Delay1ms(1);
P2=0XC0;
P0=0X02;//段选
P2=0XE0;
P0=tab[er];//位选
Delay1ms(1);
}
void display2(uchar san,uchar si)
{
P2=0XC0;
P0=0X04;//段选
P2=0XE0;
P0=tab[san];//位选
Delay1ms(1);
P2=0XC0;
P0=0X08;//段选
P2=0XE0;
P0=tab[si];//位选
Delay1ms(1);
}
void display3(uchar wu,uchar liu)
{
P2=0XC0;
P0=0X10;//段选
P2=0XE0;
P0=tab[wu];//位选
Delay1ms(1);
P2=0XC0;
P0=0X20;//段选
P2=0XE0;
P0=tab[liu];//位选
Delay1ms(1);
}
void display4(uchar qi,uchar ba)
{
P2=0XC0;
P0=0X40;//段选
P2=0XE0;
P0=tab[qi];//位选
Delay1ms(1);
P2=0XC0;
P0=0X80;//段选
P2=0XE0;
P0=tab[ba];//位选
Delay1ms(1);
P2=0XC0;
P0=0XFF;//段选
P2=0XE0;
P0=0XFF;//位选
}
DS18B20驱动
/*
程序说明: 单总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台
日 期: 2011-8-9
*/
#include "onewire.h"
//单总线延时函数
void Delay_OneWire(unsigned int t)
{
t=12*t;//时间扩大12倍
while(t--);
}
//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;
}
//通过单总线向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;
}
unsigned char temget(void)
{
unsigned char temp;
unsigned char low,high;
Init_DS18B20();//初始化
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=(low>>4)|(high<<4);
return temp;
}
#ifndef _ONEWIRE_H
#define _ONEWIRE_H
#include <STC15F2K60S2.h>
#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe
//IC引脚定义
sbit DQ = P1^4;
//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);
//添加函数
unsigned char temget(void);
#endif