📄 bdz.c
字号:
#include "reg52.h"
#include "math.h"
#include "intrins.h"
#define byte unsigned char
#define uint unsigned int
#define WRITE 0xA0 //写地址
#define READ 0xA1 //读地址
#define OV_TIM 250
#define HI 0xf8
#define LO 0x2f //12m 1ms 6m 2ms //扫描速度降低一倍
#define TRUE 1
#define FALSE 0
sbit DAS=P2^0;
sbit CLS=P2^1;
#define tem_xiax_addr 10 //iic中的地址
#define tem_shax_addr 20
#define time_addr 30
sbit time_led=P2^2;
sbit mod_led=P2^3;
sbit daiji_led=P2^4;
sbit com0=P2^5;
sbit com1=P2^6;
sbit com2=P2^7;
sbit JDQ=P0^7;
sbit SET=P3^4;
sbit ADD=P3^5;
sbit SUB=P3^6;
sbit MOD=P3^7;
sbit FMQ=P1^7;
sbit CLK=P0^0; //ad
sbit DA=P0^1;
sbit CS=P0^2;
#define duan P1
#define tem_lc_xiax 50
#define tem_lc_shax 230
byte caij,count,caij;
uint k=60000,j=10000,xiax_linshi;
uint tem_shax,tem_xiax;
byte iic[2],t2=0,t1=0,t0=0,cai_flag=0,tem_now,n,cai_N;
bit flag=0;
code byte smg[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};
/*================================24C02部分===============================================================*/
/*----------------------------------------------------------------------
IIC启动信号
----------------------------------------------------------------------*/
void I_start(void)
{
DAS=1;
CLS=1;
DAS=0;
CLS=0;
}
/*---------------------------------------------------------------------------
IIC停止信号
----------------------------------------------------------------------------*/
void I_stop(void)
{
CLS=0;
DAS=0;
CLS=1;
DAS=1;
CLS=0;
}
void I_init(void)
{
CLS=0;
I_stop();
}
/*-------------------------------------------------------------------------
IIC时钟信号
函数返回一个IIC数据线上的值
--------------------------------------------------------------------------*/
bit I_clock(void) //发送的数据咱存在sample中
{
bit sample;
CLS=1;
sample=DAS;
CLS=0;
return(sample);
}
/*---------------------------------------------------------------------------
向IIC器件发送一个字节数据 参数:I_data
返回应答位信号,为1表示发送成功,为0表示发送失败
-----------------------------------------------------------------------------*/
bit I_send(byte I_data)
{
register byte i;
for(i=0;i<8;i++)
{
if(I_data&0x80)
DAS=1;
else DAS=0;
I_data=I_data<<1;
I_clock();
}
DAS=1;
return(~I_clock()); //返回应答信号,为1表示发送成功,为0表示发送失败
}
/*-----------------------------------------------------------------------------
接受一个IIC器件发送过来的字节数据,参数无
返回 字节数据
--------------------------------------------------------------------------------*/
byte I_receive(void)
{
byte I_data=0;
register byte i;
for(i=0;i< 8;i++)
{
I_data=I_data*2;
_nop_();
if(I_clock())
I_data=I_data+1;
_nop_();
_nop_();
_nop_();
}
return(I_data);
}
/*-----------------------------------------------------------------------------
接受IIC器件数据后的应答信号 参数无,返回无
--------------------------------------------------------------------------------*/
void I_Ack(void)
{
DAS=0;
I_clock();
DAS=1;
}
/*----------------------------------------------------------------------------
调用函数: I_start 无参数,无返回值 I_send :函数原形
bit function I_send(byte I_data) 返回0,1
参数:Address 要写入的IIC器件单元地址 返回:1,0
功能:写入器件地址和器件单元地址,等待想IIC器件发送数据
----------------------------------------------------------------------------*/
bit E_address(byte Address)
{
I_start();
if(I_send(WRITE)) //发送写地址
return (I_send(Address)); //写入器件控制单元地址
else
return(FALSE);
}
/*---------------------------------------------------------------------------
从IIC器件读数据块 存入EAROMImage[]中
参数:t 为数据块的首地址
返回: 位数据 为1表示成功,0表示失败
--------------------------------------------------------------------------*/
bit E_read_block(byte t,byte block_size,byte *EAROMImage) //t起始地址
{
register byte i;
byte j;
j=0;
i=t+block_size;
if(E_address(t)) //发送器件地址
{
I_start();
if(I_send(READ)) //
{
for(;t<=i; t++)
{
EAROMImage[j++]= (I_receive());
if(t!=i)
I_Ack();
else
{ I_clock();
I_stop();
}
}
return(TRUE);
}
else
{
I_stop();
return(FALSE);
}
}
else
{
I_stop();
return(FALSE);
}
}
/*---------------------------------------------------------------------
延时程序
----------------------------------------------------------------------*/
void wait_5ms(void)
{
register uint i;
for(i=0;i<1000;i++)
_nop_();
}
/*----------------------------------------------------------------------------
功能将EAROMImage[]数组写入IIC器件
参数: i 器件首地址
返回: 0,1
-----------------------------------------------------------------------------*/
bit E_write_block(byte i,byte block_size,byte *EAROMImage) //i起始地址
{ register byte t;
byte j;
j=0;
t=i+block_size;
for(;i<=t; i++)
{
if(E_address(i)&&I_send(EAROMImage[j++]))
{
I_stop();
wait_5ms();
}
else
return(FALSE);
}
return(TRUE);
}
/*---------------------------------------------------------------------------
延时
参数: t 返回:无
-------------------------------------------------------------------------*/
void delay(uint t)
{
uint i,j;
for(i=0; i<t;i++)
for(j=0;j<10;j++);
}
/*---------------------------------------------------------------------------
功能: 将参数save里的值写入 以t为首地址的IIC器件
参数: t 首地址 save 要保存的变量
返回: 无
---------------------------------------------------------------------------*/
write(unsigned char t,unsigned int save,byte *Imagew)
{
// XBF=0;
Imagew[0] = save/256; //高位
Imagew[1] = save-(save/256)*256; //低位
if( E_write_block(t,1,Imagew))
_nop_();
// XBF=1; //写保护
}
/*---------------------------------------------------------------------------
功能: 将24C02中的存放的数据转化成十进制,存入save中,
参数: g 表示IIC器件中的首地址
返回: uint 数据
-----------------------------------------------------------------------------*/
unsigned int read(unsigned char g,byte *Imager)
{
unsigned int save=0;
// XBF=0;
if(E_read_block(g,1,Imager))
{
uint i = Imager[0],t=Imager[1];
save = ((i * 256) +t);
// XBF=1; //写保护
}
return(save);
}
/*========================================================================================================*/
void js(int sav) //计算
{
t2=sav/100;
t1=(sav%100)/10;
t0=sav%10;
}
/*---------------------------------------------
功能: 修改数据 10进制
参数: min 下限 max 上限 save 初始值
返回: save 最终值
注意: 按键没有q0,q1,q2区别,while 循环中wg=0;
-----------------------------------------------*/
int jiajian(int min,int max,int savx) //加减,上限,下限
{
bit i=1;
int j=0,x=0;
js(savx);
delay(1500);
while(i)
{
if((SUB==1)&&(ADD==1)) //没有键按下时,X一直记数
{ j=0;x=x+1;
}
else {j=j+1;x=0;} //有键按下时,J一直记数
if(ADD==0)
{
delay(100);
if(ADD==0) //有加按下
{ if(j<15)
savx=savx+1;
if((j>=15)&&(j<30))
savx=savx+10;
if(j>=30)
savx=savx+100;
}
}
if(SUB==0)
{
delay(100); //有减按下
if(SUB==0)
{
if(j<15)
savx=savx-1;
if((j>=15)&&(j<30))
savx=savx-10;
if(j>=30)
savx=savx-100;
}
}
if(savx>max) //如果数值大于上限,不再加
savx=max;
if(savx<min) //如果数值小于下限,不再减
savx=min;
js(savx);
if(SET==0)
{
delay(100);
if(SET==0)
i=0; //退出循环
}
if(x>=25)
{i=0; savx=OV_TIM;} //一定时间内没有键按下,退出循环,返回OV_TIM
delay(1200);
}
return(savx);
}
/*---------------------------------------------------
功能: 将三位数码管对应的值读出后,修改,再写入
参数: 1 24C02器件地址, min 下限 max 上限 vidao 自定义字符
返回: int型 修改后的值
-------------------------------------------------------*/
int shd_3(int addrss,int min,int max)
{ int save=0,sav=0;
save=read(addrss,iic);
js(save);
delay(800);
sav=jiajian(min,max,save);
if(sav!=OV_TIM)
{
write(addrss,sav,iic);
}
return(sav);
}
byte caiji(void)
{
byte cai=0,i;
CS=1; _nop_();_nop_();
CS=0;
for(i=0;i<=7;i++)
{
cai=cai<<1;
CLK=0;
_nop_();_nop_();CLK=1;
cai|=(DA&0x01);
}
CS=1;
return(cai);
}
byte zh(byte ca)
{
byte tem_n;
tem_n=(230-50)*ca/256+50;
return(tem_n);
}
void stin(void)
{ uint time;
//uint time,tem_shax,tem_xiax;
tem_xiax=read(tem_xiax_addr,iic);
tem_shax=read(tem_shax_addr,iic);
if((tem_xiax>230)||(tem_xiax<50))
{
tem_xiax=50;
}
if((tem_shax>230)||(tem_xiax<50)||(tem_shax<tem_xiax))
{
tem_shax=230;
}
time=read(time_addr,iic);
if((time>999)||(time<0))
{
time=0;
}
JDQ=1;
FMQ=1;
}
/*============================中断与主程序部分==============================================================*/
void T1_int() interrupt 3 using 3
{
TH1=HI;
TL1=LO;
if(cai_N>=150)
{
TH0=0;
TL0=0;
cai_N=0;
cai_flag=1;
}
else
cai_N++;
if((n>=1)&&(n<=3))
switch(n)
{
case 1:
duan|=0x7f;
_nop_();_nop_();_nop_();_nop_();
com0=0;com1=1;com2=1; //high
duan=smg[t2];
_nop_();_nop_();_nop_();_nop_();
break;
case 2:
duan|=0x7f;
_nop_();_nop_();_nop_();_nop_();
com0=1;com1=0;com2=1; //high
duan=smg[t1];
_nop_();_nop_();_nop_();_nop_();
break;
case 3:
duan|=0x7f;
_nop_();_nop_();_nop_();_nop_();
com0=1;com1=1;com2=0; //high
duan=smg[t0];
_nop_();_nop_();_nop_();_nop_();
break;
}
n++;
if(n>=4) n=1;
}
void init_t01(void)
{
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
TH1 = HI;
TL1 = LO;
TH0=0; //| EA | |--| |--| | ES | | ET1 | |EX0| |ET0| |EX0|
TL0=0; // 1 0 1 0 0 0
TMOD = 0x11; //| GATE | C/T | M1 | M2| GATE | C/T| M1| M2 |
IE=0x88; // 0 0 0 1 0 1 0 1
TR0=1; //T1工作在定时器方式,T0工作在定时器方式
TR1=1;
}
main()
{
I_init(); //IIC处处市
init_t01(); //定时器,计数器初始化
stin(); //读出2402中存储的数据
while(1)
{
if(MOD==0)
{ delay(200); //2
if(MOD==0) //
{ // mod_flag=1;
count++;
if(count==1)
{
mod_led=0;
xiax_linshi=shd_3(tem_xiax_addr,50,230);
if(xiax_linshi!=OV_TIM)
tem_xiax=xiax_linshi;
mod_led=1;
}
if(count==2)
{
mod_led=0;
if(xiax_linshi==OV_TIM)
shd_3(tem_shax_addr,(tem_xiax+1),230);
else
shd_3(tem_shax_addr,(xiax_linshi+1),230);
mod_led=1;
}
if(count==3)
{
mod_led=0;
shd_3(time_addr,0,999);
mod_led=1;
}
if(count==4)
{
mod_led=0;
js(0);
delay(20000);
j=10000;
count=0;
JDQ=1; //断开
mod_led=1;
}
}
}
caij=caiji();
tem_now=zh(caij);
if((tem_now>230)&&(tem_now<50))
{
tem_now=0;
}
js(tem_now);
if(flag==1)
{ JDQ=0;
if(tem_now>=tem_shax)
{ JDQ=1;
FMQ=0;
cai_N=0;
cai_flag=0;
if(cai_flag==1)
{FMQ=1;cai_flag=0;flag=0;}
}
}
else
{ JDQ=0;
if(tem_now>=tem_shax)
{ JDQ=1;
FMQ=0;
cai_N=0;
cai_flag=0;
if(cai_flag==1)
{FMQ=1;cai_flag=0;}
}
}
if(tem_now<tem_shax)
{
if((SET==0))
{
delay(200);
if(SET==0)
{
flag=1;
}
}
else
{
flag=0;
}
}
}
}
/*=========================================================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -