题目
代码
这套题也就在DS1302上考察了停止功能,其他的也算比较简单
timer.c
#include <timer.h>
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=ET0=1;
}
timer.h
#ifndef _TIMER_H_
#define _TIMER_H_
#include <STC15F2K60S2.H>
void Timer0Init(void);
#endif
smg.c
#include <smg.h>
unsigned char code smgduan[23]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XBF,0XFF,0XC6};
unsigned char dspbuf[8];
void smg_display(void)
{
static unsigned char i=0;
P2=(P2&0X1F)|0XE0;
P0=0XFF;
P2&=0X1F;
P2=(P2&0X1F)|0XC0;
P0=1<<i;
P2&=0X1F;
P2=(P2&0X1F)|0XE0;
P0=smgduan[dspbuf[i]];
P2&=0X1F;
if(++i==8)
i=0;
}
smg.h
#ifndef _SMG_H_
#define _SMG_H_
#include <STC15F2K60S2.H>
void smg_display(void);
extern unsigned char dspbuf[8];
#endif
keybord.c
#include <keybord.h>
unsigned char i,key_value,key_press,key_sum=0;
void key_read(void)
{
P3=0XF0;
P44=P42=1;
if(P44==0||P42==0||P35==0||P34==0)
{
for(i=0;i<4;i++)
{
P3=0XFF;
P44=P42=1;
P3&=~(0X01<<i);
if(P44==0) key_value=4*i;
else if(P42==0) key_value=4*i+1;
else if(P35==0) key_value=4*i+2;
else if(P34==0) key_value=4*i+3;
}
if(++key_sum==1)
key_press=1;
}
else
key_sum=0;
}
keybord.h
#ifndef _KEYBORD_H_
#define _KEYBORD_H_
#include <STC15F2K60S2.H>
extern unsigned char key_value,key_press;
void key_read(void);
#endif
ds18b20.c
#include <ds18b20.h>
#include <intrins.h>
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
t*=12;
while(t--);
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
//通过单总线向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_temp(void)
{
unsigned char TL,TH;
unsigned int dat;
float temp;
init_ds18b20();
Delay1ms();
Write_DS18B20(0XCC);
Write_DS18B20(0X44);
init_ds18b20();
Delay1ms();
Write_DS18B20(0XCC);
Write_DS18B20(0XBE);
TL=Read_DS18B20();
TH=Read_DS18B20();
dat=((TH<<8)|TL);
temp=dat*0.0625;
return temp;
}
ds18b20.h
#ifndef _DS18B20_H_
#define _DS18B20_H_
#include <STC15F2K60S2.H>
float ds18b20_read_temp(void);
#endif
ds1302.c
#include <ds1302.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
unsigned char code addr_write[3]={0X80,0X82,0X84};
unsigned char code addr_read[3]={0X81,0X83,0X85};
unsigned char time[3]={0X50,0X59,0X23};
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=0;
}
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0;
_nop_();
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (temp);
}
void ds1302_write(void)
{
unsigned char i=0;
EA=0;
Write_Ds1302(0X8E,0X00);
for(i=0;i<3;i++)
Write_Ds1302(addr_write[i],time[i]);
Write_Ds1302(0X8E,0X80);
EA=1;
}
void ds1302_read(void)
{
unsigned char i=0;
EA=0;
for(i=0;i<3;i++)
time[i]=Read_Ds1302(addr_read[i]);
EA=1;
}
ds1302.h
#ifndef _DS1302_H_
#define _DS1302_H_
#include <STC15F2K60S2.H>
void ds1302_write(void);
void ds1302_read(void);
void Write_Ds1302( unsigned char address,unsigned char dat );
extern unsigned char time[3];
#endif
main.c
#include <STC15F2K60S2.H>
#include <timer.h>
#include <smg.h>
#include <keybord.h>
#include <ds18b20.h>
#include <ds1302.h>
unsigned char flag_time=0;
unsigned char flag_key;
unsigned char flag_smg=0;
unsigned char flag_ds18b20;
unsigned int temp;
float temp1;
unsigned char worker_num[8]={20,20,20,20,20,20,20,20};
unsigned char num=0;
unsigned char k;
unsigned char temp_num=0;
unsigned char flag_alarm;
unsigned char flag_1s;
unsigned char countdown;
void all_init(void)
{
P2=(P2&0X1F)|0XA0;
P0=0X00;
P2&=0X1F;
P2=(P2&0X1F)|0X80;
P0=0XFF;
P2&=0X1F;
}
void main(void)
{
ds1302_write();
Timer0Init();
all_init();
while(1)
{
/**********keybord**********/
if(flag_key)
{
flag_key=0;
keybord_read();
}
if(key_press)
{
key_press=0;
if(key_value==10 && flag_smg!=2)
flag_time=1;
if(key_value>=0 && key_value<=9 && flag_smg!=2)
{
flag_smg=1;
switch(num)
{
case 0: worker_num[num]=key_value;num++;break;
case 1: worker_num[num]=key_value;num++;break;
case 2: worker_num[num]=key_value;num++;break;
case 3: worker_num[num]=key_value;num++;break;
case 4: worker_num[num]=key_value;num++;break;
case 5: worker_num[num]=key_value;num++;break;
case 6: worker_num[num]=key_value;num++;break;
case 7: worker_num[num]=key_value;num++;break;
}
}
if(num==8)
{
num=0;
flag_smg=2;
for(k=0;k<8;k++)
worker_num[k]=20;
}
}
/**********ds18b20**********/
temp1=ds18b20_read_temp();
if(flag_smg==2)
{
if(flag_ds18b20)
{
temp_num++;
flag_ds18b20=0;
temp=temp1*100;
}
if(temp_num==11)
{
if(temp>3700)
flag_alarm=1;
}
}
if(flag_alarm==1)
{
temp_num=0;
if(flag_1s)
{
flag_1s=0;
countdown++;
if(countdown<=5)
{
P2=(P2&0X1F)|0XA0;
P0=0X40;
P2&=0X1F;
}
else
{
flag_alarm=0;
countdown=0;
P2=(P2&0X1F)|0XA0;
P0=0X00;
P2&=0X1F;
flag_smg=0;
}
}
}
/**********ds1302**********/
ds1302_read();
if(flag_time==0)
Write_Ds1302(0X80,(time[0]|0X80));
/**********smg**********/
if(flag_smg==0)
{
dspbuf[0]=time[2]/16;
dspbuf[1]=time[2]%16;
dspbuf[2]=20;
dspbuf[3]=time[1]/16;
dspbuf[4]=time[1]%16;
dspbuf[5]=20;
dspbuf[6]=time[0]/16;
dspbuf[7]=time[0]%16;
}
else if(flag_smg==1)
{
dspbuf[0]=worker_num[0];
dspbuf[1]=worker_num[1];
dspbuf[2]=worker_num[2];
dspbuf[3]=worker_num[3];
dspbuf[4]=worker_num[4];
dspbuf[5]=worker_num[5];
dspbuf[6]=worker_num[6];
dspbuf[7]=worker_num[7];
}
else if(flag_smg==2)
{
dspbuf[0]=22;
dspbuf[1]=21;
dspbuf[2]=21;
dspbuf[3]=21;
dspbuf[4]=21;
dspbuf[5]=temp/1000;
dspbuf[6]=temp%1000/100+10;
dspbuf[7]=temp%100/10;
}
}
}
void timer_isr0(void) interrupt 1
{
static unsigned char flag_key_time=0;
static unsigned int flag_ds18b20_time=0;
static unsigned int flag_1s_time=0;
if(++flag_key_time>=30)
{
flag_key_time=0;
flag_key=1;
}
if(++flag_ds18b20_time>=500)
{
flag_ds18b20_time=0;
flag_ds18b20=1;
}
if(++flag_1s_time==1000)
{
flag_1s_time=0;
flag_1s=1;
}
smg_display();
}