📄 hello.c
字号:
//**************************************************************
void read24c02() /*读24c02的存储值*/
{uchar i;
TRcvAddress(0xa0,0,&bufdata[0],7);
for(i=0;i<6;i++)
{dispbuf[i]=bufdata[i];
}
} /*返回上一层程式*/
/******************************************************/
void write24c02() /*写24c02的存储值*/
{
TSendAddress(0xa0,0,dispbuf,7); /* 向有子地址器件写入6字节数据函数 */
}
/*******************************************************************/
// 24C02芯片读写 起动总线函数
//函数原型: void Start();
//功能: 启动总线,发送24c02启动条件.
//==================================================================
void Start()
{SDA=0;
nop;
nop;
SCL=0;
SDA=1; /*发送起始条件的数据信号*/
nop;
SCL=1;
nop; /*起始条件建立时间大于4.7us,延时*/
nop;
nop;
nop;
nop;
SDA=0; /*发送起始信号*/
nop; /* 起始条件锁定时间大于4us*/
nop;
nop;
nop;
nop;
SCL=0; /*钳住总线,准备发送或接收数据 */
nop;
nop;
SDA=1;
}
//==================================================================
// 结束总线函数
//函数原型: void Stop();
//功能: 结束总线,发送24c02结束条件.
//==================================================================
void Stop()
{
SCL=0;
SDA=0; /*发送结束条件的数据信号*/
nop; /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4us*/
nop;
nop;
nop;
nop;
nop;
SDA=1; /*发送总线结束信号*/
nop;
nop;
nop;
nop;
SCL=0;
}
//==================================================================
// 89X52发数据或地址给24c02 字节数据发送函数
//函数原型: void SendByte(uchar c);
//功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
// 此状态位进行操作.(不应答或非应答都使acknow=0)
// 发送数据正常,acknow=1; acknow=0表示被控器无应答或损坏。
//==================================================================
void SendByte(uchar c)
{ uchar count;
for(count=0;count<8;count++) /*要传送的数据长度为8位*/
{if((c<<count)&0x80)
SDA=1; /*判断发送位*/
else
SDA=0;
nop;
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
nop;
nop; /*保证时钟高电平周期大于4us*/
nop;
nop;
nop;
SCL=0;
}
nop;
nop;
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
nop;
nop;
SCL=1;
nop;
nop;
nop;
if(SDA==1)
acknow=0; /* 24c02无应答 */
else
acknow=1; /* 发送数据正常 */
SCL=0;
nop;
nop;
}
//==================================================================
// 89X52从24c02读数据字节数据接收函数
//函数原型: uchar RcvByte();
//功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
// 发完后请用应答函数应答从机。
//==================================================================
uchar RcvByte()
{uchar retc=0;
uchar count;
SDA=1; /*置数据线为输入方式*/
for(count=0;count<8;count++)
{ nop;
SCL=0; /*置时钟线为低,准备接收数据位*/
nop;
nop; /*时钟低电平周期大于4.7us*/
nop;
nop;
nop;
SCL=1; /*置时钟线为高使数据线上数据有效*/
nop;
nop;
retc=retc<<1;
if(SDA==1)
retc=retc+1; /*读数据位,接收的数据位放入retc中 */
nop;
nop;
}
SCL=0;
nop;
nop;
return(retc);
}
//==================================================================
// 主机89X52应答子函数
//函数原型: void Ack(bit a);
//功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
//==================================================================
void Ack(bit a)
{if(a==0)
SDA=0; /*在此发出应答或非应答信号 */
else /* 应答 a=0 非应答 a=1 */
SDA=1;
nop;
nop;
nop;
SCL=1;
nop;
nop; /*时钟低电平周期大于4us*/
nop;
nop;
nop;
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
nop;
nop;
}
//==================================================================
// 用户接口函数
// 有无子地址表示是否向芯片的特定地址写数据
// 向有子地址器件写入6字节数据函数 对应数据资料中的写模式
//函数原型: bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);
//功能: 从启动总线到发送从地址,子地址,数据,结束总线的全过程,从器件
// 地址slaaddress,子地址subaddress,发送内容是s指向的内容,no=字节数
// 如果返回1表示操作成功,否则操作有误。
//注意: 使用前必须已结束总线。
//==================================================================
bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no) /* 向有子地址器件写入6字节数据函数 */
{
uchar i;
Start(); /*启动总线*/
SendByte(slaaddress); /*发送器件地址*/
if(acknow==0)
return(0);
SendByte(subaddress); /*发送器件子地址*/
if(acknow==0)
return(0);
for(i=0;i<no;i++)
{
SendByte(s[i]); /*发送数据*/
if(acknow==0)
return(0);
}
Stop(); /*结束总线*/
return(0);
}
//==================================================================
// 向有子地址器件读取4字节数据函数
//函数原型: bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);
//功能: 从启动总线到发送从地址,子地址,读数据,结束总线的全过程,从器件
// 地址slaaddress,子地址subaddress,读出的内容放入s, no=字节数
// 如果返回1表示操作成功,否则操作有误。
//注意: 使用前必须已结束总线。
//==================================================================
bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no)
{
uchar i;
Start(); /*启动总线*/
SendByte(slaaddress); /*发送器件从地址*/
if(acknow==0)
return(0);
SendByte(subaddress); /*发送器件子地址*/
if(acknow==0)
return(0);
Stop(); /*结束总线*/
Start(); /*重新启动总线*/
SendByte(slaaddress+1);
if(acknow==0)
return(0);
for(i=0;i<no;i++)
{* s=RcvByte(); /*接收数据*/
Ack(0); /*发送应答位*/
s++;
}
* s=RcvByte(); /*接收数据*/
Ack(1);
Stop(); /*结束总线*/
return(1);
}
//******************************************************************
void service_int0 () interrupt 1 using 2 /*设定每隔3000us中断扫描一次数码管*/
{
ptr1++; /*扫描指标加1*/
TH0=(65536-2000)/256; /*每隔4000US扫描一次*/
TL0=(65536-2000)%256;
while (ptr1>5) ptr1=0; /*ptr1>5表示6个数码管都已经扫描过*/
P0=(ptr1<<4)|dispbuf[ptr1]; /*将扫描值左移至高4位元再加上资料码*/
} /*返回主程式*/
/********************************************************/
void rec_timer1_intr () interrupt 3 using 3 /*TIMER1中断副程式--秒计时器*/
{
TH1=(65536-59200)/256; //重设TIMER1计数值
TL1=(65536-59200)%256;
dispbuf[8]=0x09; //蜂鸣器设定开/二次分频
if(b1==0) //中断次数完成否,是则表1秒到了
{
b1=100; //重设中断次数
P3_6=1; //秒SEC加1
TR1=0;
dispbuf[8]=0x01; //蜂鸣器关
clear();
//send_to_Led_a(); //串行发送到DTLED-6副程式
//send_to_Comm1();//huzm
//LCD_disple();//huzm
}
TF1=0;
b1--; /*中断次数减1*/
} /*返回主程式*/
/********************************************************/
/******************************************************************/
/*
//串口接收中断函数
void serialRecCom() interrupt 4 using 3
{
if (RI)
{
unsigned char ch;
RI = 0 ;
ch=SBUF;
send_to_Comm1();
}
} */
/***********************************************************************/
/******************************************************/
void Rd1302() /*读时钟芯片DS1302*/
{
char i,j,ts0,conb;
conb=0x81;
clocktmp[0]=0;
clocktmp[1]=0;
clocktmp[2]=0;
ts0=conb;
for(j=0;j<3;j++)
{
clk=RST=0; /*DS1302系统初始化*/
nop;nop;
RST=1;
for(i=0;i<8;i++) /*写控制字到DS1302*/
{
clk=0; /*清时钟*/
if(conb&0x01)
DINOUT=1;
else DINOUT=0;
clk=1; /*时钟上升沿,发送数据有效*/
conb=conb>>1;
nop;
}
conb=ts0=ts0+2;
clk=0;
for(i=0;i<7;i++) /*读时钟芯片的时分秒单元*/
{
if(DINOUT==1)
clocktmp[j]=clocktmp[j]|0x80;
else clocktmp[j]=clocktmp[j]&0x7f;
clk=1;
clocktmp[j]=clocktmp[j]>>1; /*接收暂存单元*/
nop;
clk=0; /*时钟下降沿,接收数据有效*/
}
delay(5);
RST=0;
delay(10);
}
dispbuf[1]=clocktmp[0]&0x0f; //转换秒分时显示单元
dispbuf[2]=clocktmp[0]>>4&0x07;
dispbuf[3]=clocktmp[1]&0x0f;
dispbuf[4]=clocktmp[1]>>4&0x07;
dispbuf[5]=clocktmp[2]&0x0f;
dispbuf[6]=clocktmp[2]>>4&0x03;
nop;
} /*返回主程式*/
void Rec_com1_intr () interrupt 4 using 1 //串行口中断副程式
{
uchar v,i=0;
while(RI!=1); /*接收完成否*/
{
RI=0;
v=SBUF; /*接收的数据存入C*/
//buf_rec_com1=SBUF;//huzm
#if 1
if(v==0xa0) /*是否是识别码"A0"*/
{while(RI!=1); /*接收完成否*/
bufuart[i]=v;
for(i=1;i<7;i++)
{while(RI!=1); /*接收完成否*/
bufuart[i]=SBUF; /*接收的数据存入C*/
RI=0; /*清除接收完成标志位RI*/
}
}
else delay(10);
#endif
//delay(10);//huzm
//send_to_Comm1();
RI=0;
}
send_to_Led_a();//huzm
/*
dispbuf[0]=bufuart[6];
dispbuf[1]=bufuart[5];
dispbuf[2]=bufuart[4];
dispbuf[3]=bufuart[3];
dispbuf[4]=bufuart[2];
dispbuf[5]=bufuart[1];
*/
} /*返回主程式*/
//**************************************************************
void send_to_Comm1(void) /*宣告串口serial发送副程式*/
{
//uchar i=0;//huzm
//
uchar sec,min,hour;
sec=((dispbuf[2]<<4)&0xf0)|(dispbuf[1]&0x0f);
min=((dispbuf[4]<<4)&0xf0)|(dispbuf[3]&0x0f);
hour=((dispbuf[6]<<4)&0xf0)|(dispbuf[5]&0x0f);
//
IE=0x8f;
SBUF=hour; //根据扫描指标到TAB中取ASCII码由SBUF发送出去
//for( i=0; i<rec_comm1_len; i++)//huzm
{
//SBUF=buf_rec_com1;//huzm
while(TI!=1); /*发送完成否?*/
TI=0; /*是,则清除发送完成旗标TI=0*/
delay(20);
}
#if 1
SBUF=min; /*根据扫描指标到TAB中取ASCII码由SBUF发送出去*/
//SBUF=dispbuf_huzm[0];
//SBUF=dispbuf[0];
//dispbuf[0]++;
while(TI!=1); /*发送完成否?*/
TI=0; /*是,则清除发送完成旗标TI=0*/
delay(20);
SBUF=sec; /*根据扫描指标到TAB中取ASCII码由SBUF发送出去*/
while(TI!=1); /*发送完成否?*/
TI=0; /*是,则清除发送完成旗标TI=0*/
delay(20);
#endif
IE=0x9f;
}
main() /*主程式*/
{
/*
TMOD=0x11;
TH1=256-(28800/9600);
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
TR0=0;
T2CON=0x38;
TL2=0xfd;
TH2=0xff;
RCAP2L=0xdc;
RCAP2H=0xff;
TH2=256-(28800/9600);
TR2=1;
SCON=0x50;
IE=0;
IP=0x10;
read24c02();
P1=0xff;
*/
while(1)
{
#if 0
//scan(); //呼叫键盘扫描副程式有按FLAG0会为1
/*
if(FLAG0==1)
{
temp(); //判断有按键输入否?
}
else
*/
{
//FLAG4=FLAG5=0;
//if(FLAG2==1)
{
Rd1302(); /*读时钟芯片DS1302*/
if(dispbuf[1]!=clockbak) /*秒加一*/
{
clockbak=dispbuf[1];
send_to_Led_a(); /*串行发送到DTLED-6副程式*/
send_to_Comm1(); //宣告串口serial发送副程式
}
}
}
#endif
//Rec_com1_intr();//huzm
//send_to_Comm1();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -