#include "reg51.h"
#include "intrins.h"
sbit p24=P2^4;//数码管位控制口
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
sbit p23=P2^3;//控制灯
sbit eoc=P2^2;
sbit oe=P2^0;
sbit ale_start=P2^1;//A/D转换口
sbit p10=P1^0;//键控制按键抠
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit sda=P1^6; //数据线
sbit scl=P1^5; //时钟线
sbit p17=P1^7;//控制蜂鸣器
bit b0=1;//控制数码管的亮熄
bit b1=1;
bit b2=1;
bit b3=1;
bit a0=0;//数码管闪烁控制位
bit a1=0;
bit a2=0;
bit a3=0;
bit s=0;//小数点控制位
unsigned char led0=0;
unsigned char led1=0;
unsigned char led2=0;
unsigned char led3=0;//数码管初始态
unsigned char led4=0xff;//灯的初状态全灭
unsigned char j=0;//控制转换通道时间
unsigned char k=0;//按键次数记(录设置()
unsigned int bc[50][4];//保存修改数值
unsigned char adz[8];//a/d转化数值
unsigned char dd[16];//下限温度
unsigned char gg[16];//上限温度
unsigned int add=0;//显示通道下标
unsigned char code x[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1
,0x86,0x8e};
void fun()//数码管延时
{
unsigned char i;
for(i=0;i<50;i++)
;
}
/*数码管动态显示*/
void xs()//显示程序
{
if(s)
P0=x[led0];
else
P0=x[led0]&0x7f;
if(b3)
p24=0;
fun();
p24=1;
P0=x[led1];
if(b2)
p25=0;
fun();
p25=1;
P0=x[led2];
if(b1)
p26=0;
fun();
p26=1;
P0=x[led3];
if(b0)
p27=0;
fun();
p27=1;
P0=led4;
p23=0;
fun();
p23=1;
}
/*I2C存储器*/
/* void flash() //时序延时
{
unsigned char i;
for(i=0;i<50;i++){ _nop_ (); }
}
void start() //24c02启动子程序
{
scl=1; //时钟高
sda=1; //
flash();
sda=0; //1--0
flash();
scl=0; //
flash();
}
void stop() //
{
scl=1; //时钟高
sda=0;
flash() ;
sda=1; //0--1
flash();
}
void empty() //主应答信号,非
{
sda=1;
scl=1; //时钟高
flash() ;
scl=0; //时钟低
sda=0;
flash() ;
}
void writex(unsigned char j) //写字节函数,芯片应答检测
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++){
if ((temp&0x80)!=0){sda=1;}//判最高位数据,1
else { sda=0;} //0
flash();
scl=1;flash();scl=0; // 时钟
flash();
temp=temp<<1; // 数据左移1位
}
sda=1; //置为输入口
scl=1; //时钟高
while((sda==1)&&(i<255)){i++;} //等芯片输出低并延时
scl=0; //时钟低
sda=0; //为启动做准备
}
unsigned char readx() //读字节函数
{
unsigned char i,j,k=0;
sda=1; //置为输入口
for (i=0;i<8;i++){
scl=1; //时钟高
if (sda==1) j=1; //读
else j=0;
k=(k<<1)|j; //取数据
flash();
scl=0; //时钟低
flash();
}
return(k); //返回测量值
}
unsigned char x24c02_read(unsigned char address)//读单字节函数
{
unsigned char i;
start(); //启动
writex(0xa0); //写器件地址,写
writex(address); //写芯片地址
start(); //启动
writex(0xa1); //写器件地址,读
i=readx(); // 读数据
empty(); //应答,主应答
stop(); //停止
return(i); //返回
}
void x24c02_write(unsigned char address,unsigned char info1,unsigned
char info2)//根据保存数据多少可添加相应地址
{
start(); //启动
writex(0xa0); //写器件地址,写
writex(address); //写芯片地址
writex(info1); //数据
writex(info2); //数据
stop();//停止
}*/
/*数码管计时,控制*/
void inetop1() interrupt 3//T1控制数码管闪
{
TH1=0X3C;//0.1s
TL1=0XB0;
p17=1;//关蜂鸣器
k++;
if(k==5)
{k=0;
if(a0) b0=!b0;//闪的控制
if(a1) b1=!b1;
if(a2) b2=!b2;
if(a3) b3=!b3;
//x24c02_write(0x00,d,e);//向存储器写保存数据
}
}
void inetop() interrupt 1//T2控制时间
{
TH0=0X3C;//0.1S,重装初值
TL0=0XB0;
p17=1;
j++;//记录定时次数
if(j==20)//0.5s
{j=0;
add++ ;
if(add==8)
{add==0;}
}
}
/*按键操作*/
void key() interrupt 0//键盘函数
{
p10=1;p11=1;p12=1;p13=1;
if(p10==0)
{
p17=0;//单独闪烁控制
a0=1;
a2=1;
TR0=!TR0;//计时开始,停止
TR1=!TR1;//数码管闪烁启动,停止
if(TR0==0)
{s=0;
}
}
//停止,开始
if(p11==0)
{//加1
p17=0;
if(a0){ led3++;
if(led3==10) led3=0;
}
if(a1){ led2++;
if(led2==10) led2=0;
}
if(a2){ led1++;
if(led1==10) led1=0;
}
if(a3){ led0++;
if(led0==8) led0=0;
}
}
if(p12==0)
{//移位
if(a0){ a0=0;a1=1;b0=1;
}
else if(a1){ a1=0;a2=1;b1=1;
}
else if(a2){ a2=0;a3=1;b2=1;
}
else{ a3=0;a0=1;b3=1;
}
}
/*下面部分操作上下限温度设置,CASE操作修改怎么写?*/
if(p13==0)
{
k++;//记录次数
switch(k)
{//奇数上限,偶数下限
case 1: P0=0xfd;
;break;
case 2:P0=0xbf;
; break;
case 3: P0=0xfd;
; break;
case 4:P0=0xbf;
;break;
case 5:P0=0xfd;
;break;
case 6:P0=0xbf;
;break;
case 7:P0=0xfd;
;break;
case 8:P0=0xbf;
;break;
case 9:P0=0xfd;
; break;
case 10:P0=0xbf;
;break;
case 11:P0=0xfd;
;break;
case 12:P0=0xbf;
;break;
case 13:P0=0xfd;
break;
case 14:P0=0xbf;
;break;
case 15:P0=0xfd;
;break;
case 16:P0=0xbf;
;break;
default : k=0;
}
if(k==0)
{ if(a0)//保存
{ a0=0;
b0=1;
a1=0;
b1=1;
}
else if(a2)
{ a2=0;
b2=1;
a3=0;
b3=1;
}
b0=1;b1=1;b2=1;b3=1;//数码管全亮
}
}
}
void ad()
{
eoc=1;//
oe=0;//
ale_start=0;//
P0=add;
ale_start=1;//
_nop_();
_nop_();
ale_start=0;//
_nop_ ();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();//10US
while(eoc==0);
oe=1;
P0=0xff;
adz[add]=P0;
oe=0;
_nop_();
led3=adz[add]%10;
led1=adz[add]/100;
led2=(adz[add])%10;
led0=add;
if(add==8)
{add=0;}
/*比较温度,操作灯相应显示*/
if(adz[add]
{
P0=0X7F;
}
if(adz[add])>g[2*add+1])//高于上限温度
{
P0=0XFE;
}
else//正常显示温度
{
P0=0XA5;
}
}
void main()
{
TMOD=0X11;//方式1控制
TH0=0X3c;//赋初值T0,控制数码管计时
TL0=0Xb0;
TH1=0X3c;//赋初值T1,控制数码管闪烁
TL1=0Xb0;
ET0=1;
TR0=1;//启动T0,控制时间
EX0=1;//开允许位T0
ET1=1;//开允许位T
TR1=0;//启动T1,控制数码管闪
EX1=1;//开允许位T1
IT0=1;//选择触发方式
EA=1;//开总中断
oe=0;
//e=x24c02_read(0x01);//读保存数据HOUR
// d=x24c02_read(0x00);//读保存数据MIN*/
for(;;)
{
xs();
ad();
}
}