题目找不到了 在CSDN上搜
main.c
#include "mycode.h"
unsigned int Timer0_count=0,Timer1_count=0;
unsigned char key_value=0;//键值获取
bit change_page=1;//处于数据界面
bit time_1=0;
bit flat=0;
unsigned char c;
unsigned char page_flag=1;//页面标志
void main()
{
System_init();
Timer0Init();
Timer1Init();
EA=1;
ET1=0;
Set_time();
Read_time();
while(1)
{
key_value = get_key();
switch(key_value)
{
case 9 :page_flag++;if(page_flag>=4) page_flag=1;break;///页面切换按键
case 10:
if(change_page==0)//数据界面
switch(page_flag)
{
case 1: slave_hour++; if(slave_hour>23) slave_hour=0;break;
case 2: slave_temp++; if(slave_temp>99) slave_temp=0;break;
case 3: slave_led++; if(slave_led>8) slave_led=4;break;
} ;
break;//加
case 13:change_page=!change_page;page_flag=1;break;//切换数据界面和参数界面
case 14:
if(change_page==0)//数据界面
switch(page_flag)
{
case 1: slave_hour--; if(slave_hour==0) slave_hour=0;break;
case 2: slave_temp--; if(slave_temp==0) slave_temp=0;break;
case 3: slave_led--; if(slave_led<4) slave_led=4;break;
} ;
break;//减
}key_value=0;
if(AD_value>50)
{
an_flag=0;
}
else if(AD_value<50)
{
an_flag=1;
}
if(c!=an_flag)
{Timer1_count=0;ET1=1;c=an_flag;}
if(change_page==1)
{
if((ds_time[2]>8)&&(ds_time[2]<slave_hour))
{HC_138(4); LED1=0;}
else
{HC_138(4); LED1=1;}
if(temp/100<slave_temp)
{HC_138(4); LED2=0;}
else
{HC_138(4); LED2=1;}
if(an_flag)
{
{HC_138(4); P0&=~(1<<(slave_led-1));}
}
}
if(time_1==1)
{
time_1=0;
ET1=0;
Timer1_count=0;
if(an_flag)
{flat=1;}
if(!an_flag)
{flat=0;}
}
if(flat)
{HC_138(4); LED3=0;}
if(!flat)
{HC_138(4); LED3=1;}
}
}
void timer0() interrupt 1
{
Timer0_count++;
if(Timer0_count>=300)
{
ET0=0;
Read_time();
AD_value=(int)((float)(AD_get()/51.0)*100);
Timer0_count=0;
ET0=1;
}
}
void timer1() interrupt 3
{
Timer1_count++;
if(Timer1_count>=3000)
{
time_1=1;
Timer1_count=0;
}
}
mycode.c
#include "mycode.h"
unsigned char code numb[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
//.. - C E P
0x7f,0xbf,0xc6,0x86,0x8c
};
unsigned short int AD_value=0;
bit an_flag=0;
unsigned char slave_hour=17;
unsigned int slave_temp=25;
unsigned char slave_led=4;
void page_display(void)
{
if(change_page==1)//数据界面
{
switch(page_flag)
{
case 1:page1_1();break;
case 2:page1_2();break;
case 3:page1_3();break;
}
}
else if (change_page==0)//参数界面
{
switch(page_flag)
{
case 1:page2_1();break;
case 2:page2_2();break;
case 3:page2_3();break;
}
}
}
void page1_1(void)
{
display(0,ds_time[2]/10);
display(1,ds_time[2]%10);
display(2,11);
display(3,ds_time[1]/10);
display(4,ds_time[1]%10);
display(5,11);
display(6,ds_time[0]/10);
display(7,ds_time[0]%10);
HC_138(6);P0=0xff;
HC_138(7);P0=0xff;
}
void page1_2(void)
{
display(0,12);//显示 C
display(5,temp/1000);
display(6,temp%1000/100);
display(6,10);//显示 点
display(7,temp%100/10);
//
HC_138(6);P0=0xff;
HC_138(7);P0=0xff;
}
void page1_3(void)
{
display(0,13);//显示 E
display(2,AD_value/100);
display(2,10);//显示 点
display(3,AD_value%100/10);
display(4,AD_value%10);
if(AD_value>50)
{
display(7,0);
}
else
{
display(7,1);
}
HC_138(6);P0=0xff;
HC_138(7);P0=0xff;
}
///
void page2_1(void)
{
display(0,14);//显示 P
display(1,1);//
display(6,slave_hour/10);
display(7,slave_hour%10);
HC_138(6);P0=0xff;
HC_138(7);P0=0xff;
}
void page2_2(void)
{
display(0,14);//显示 P
display(1,2);//
display(6,slave_temp/10);
display(7,slave_temp%10);
HC_138(6);P0=0xff;
HC_138(7);P0=0xff;
}
void page2_3(void)
{
display(0,14);//显示 P
display(1,3);//
display(7,slave_led);
HC_138(6);P0=0xff;
HC_138(7);P0=0xff;
}
void display(unsigned char t,unsigned char dat)
{
HC_138(7);P0=0xff;
HC_138(6);P0=1<<t;
HC_138(7);P0=numb[dat];
delay_us(400);
}
void System_init(void)
{
HC_138(4); P0=0xff;
HC_138(5); P0=0x00;
HC_138(0); P0=0x00;
}
void HC_138(unsigned char x)
{
switch(x)
{
case 0:P2&=0x1f;P2|=0x00;break;
case 4:P2&=0x1f;P2|=0x80;break;
case 5:P2&=0x1f;P2|=0xa0;break;
case 6:P2&=0x1f;P2|=0xc0;break;
case 7:P2&=0x1f;P2|=0xe0;break;
}
}
void delay_us(unsigned int t) //@12.000MHz
{
while(t--){
_nop_();
_nop_();
_nop_();
_nop_();}
}
void delay_ms(unsigned int t) //@12.000MHz
{
unsigned char i, j;
while(t--){
i = 12;
j = 169;
do
{
while (--j);
} while (--i);}
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x20; //设置定时初始值
TH0 = 0xD1; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初始值
TH1 = 0xD1; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
}
mycode.h
#ifndef __MYCODE_H__
#define __MYCODE_H__
#include "reg52.h"
#include <stdio.h>
#include "intrins.h"
#include "iic.h"
#include "ds1302.h"
#include "onewire.h"
#include "key.h"
#include "onewire.h"
sfr AUXR = 0x8e;
extern unsigned char page_flag;//页面标志
extern bit change_page;//处于数据界面
extern unsigned short int AD_value;
extern unsigned char slave_hour;
extern unsigned int slave_temp;
extern unsigned char slave_led;
extern bit an_flag;
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit LED5=P0^4;
void Timer1Init(void) ;
void Timer0Init(void) ; //1毫秒@12.000MHz
void page_display(void);
void display(unsigned char t,unsigned char dat);
void HC_138(unsigned char x);
void delay_ms(unsigned int t);
void delay_us(unsigned int t) ;
void System_init(void);
void page1_1(void);
void page1_2(void);
void page1_3(void);
void page2_1(void);
void page2_2(void);
void page2_3(void);
#endif
ds1302.c
#include "ds1302.h"
#include <intrins.h>
#include <reg52.h>
unsigned char ds_time[3]={0x50,0x59,0x16};
sbit SCK = P1^7;
sbit SDA = P2^3;
sbit RST = P1^3;
//写字节
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
//向DS1302寄存器写入数据
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
//从DS1302寄存器读出数据
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
void Set_time()
{
Write_Ds1302_Byte(0x8e,0x00);
Write_Ds1302_Byte(0x80,ds_time[0]);
Write_Ds1302_Byte(0x82,ds_time[1]);
Write_Ds1302_Byte(0x84,ds_time[2]);
Write_Ds1302_Byte(0x8e,0x80);
}
void Read_time()
{
unsigned char t;
t=Read_Ds1302_Byte(0x81);
t&=0x7f;
ds_time[0]=(t>>4)*10+(t&0x0f);
t=Read_Ds1302_Byte(0x83);
ds_time[1]=(t>>4)*10+(t&0x0f);
t=Read_Ds1302_Byte(0x85);
ds_time[2]=(t>>4)*10+(t&0x0f);
}
ds1302.h
#ifndef __DS1302_H
#define __DS1302_H
extern unsigned char ds_time[3];
void Read_time();
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void Set_time();
#endif
iic.c
#include "iic.h"
#include "intrins.h"
#include "reg52.h"
#define DELAY_TIME 5
sbit SDA_IIC = P2^1;
sbit SCL_IIC = P2^0;
//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//I2C总线启动信号
void IIC_Start(void)
{
SDA_IIC = 1;
SCL_IIC = 1;
IIC_Delay(DELAY_TIME);
SDA_IIC = 0;
IIC_Delay(DELAY_TIME);
SCL_IIC = 0;
}
//I2C总线停止信号
void IIC_Stop(void)
{
SDA_IIC = 0;
SCL_IIC = 1;
IIC_Delay(DELAY_TIME);
SDA_IIC = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答或非应答信号
void IIC_SendAck(bit ackbit)
{
SCL_IIC = 0;
SDA_IIC = ackbit;
IIC_Delay(DELAY_TIME);
SCL_IIC = 1;
IIC_Delay(DELAY_TIME);
SCL_IIC = 0;
SDA_IIC = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL_IIC = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA_IIC;
SCL_IIC = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL_IIC = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA_IIC = 1;
else SDA_IIC = 0;
IIC_Delay(DELAY_TIME);
SCL_IIC = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL_IIC = 0;
}
//I2C总线接收一个字节数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL_IIC = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA_IIC) da |= 1;
SCL_IIC = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
unsigned char AD_get(void)
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat=IIC_RecByte();
IIC_WaitAck();
return dat;
}
iic.h
#ifndef _IIC_H
#define _IIC_H
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
unsigned char AD_get(void);
#endif
onewire.c
#include "onewire.h"
#include "reg52.h"
sbit DQ = P1^4;
unsigned int temp;
//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{
t*=10;
while(t--);
}
//单总线写操作
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);
}
//单总线读操作
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;
}
void Read_temp(void)
{
unsigned char th,tl;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
tl=Read_DS18B20();
th=Read_DS18B20();
temp=(th<<8)|tl;
temp=((float)temp*0.065)*1000+5;
temp=(int)temp/10;
}
onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
extern unsigned int temp;
void Read_temp(void);
#endif
key.c
#include "key.h"
#include "mycode.h"
#include <reg52.h>
sfr P4 = 0xC0;
sbit P42 = P4^2;
sbit P44 = P4^4;
unsigned char get_key()
{
unsigned char n,m;
P3=0xf0;P44=1;P42=1; //列信号置一,行信号置零
if(P3!=0xF0||P44!=1||P42!=1) //检测哪一列信号不为一
{
delay_ms(10);
if(P3!=0xF0||P44!=1||P42!=1)
{
P3=0xf0;P44=1;P42=1;
if(P44==0) n=1; //判断哪一列被拉低
else if(P42==0) n=2;
else if((P3&0x20)==0) n=3;
else if((P3&0X10)==0) n=4;
P3=0x0F;P44=0;P42=0; //行信号置零,列信号置一
if((P3&0x01)==0) m=n; //判断哪一行被拉低
else if((P3&0x02)==0) m=n+4;
else if((P3&0x04)==0) m=n+8;
else if((P3&0x08)==0) m=n+12;
// count++; //按键按下后执行的操作
while(P3!=0x0F) //松手判断
{page_display();
Read_temp();}
}
return m;
}
page_display();
Read_temp();
return 0;
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
unsigned char get_key();
#endif