📄 串口通信c51源程序.txt
字号:
////////////////////////////////////////////////
AT24C01的C51源程序|串口通信C51源程序
--------------------------------------------------------------------------------
/* 24C01 24C02的C51源程序|串口通信C51源程序,
未整理,但编译后的HEX代码可在WS803上直接运行。*/
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#include<string.h>
#define UN unsigned char
void csf();
UN d10[4];
void del05s();
void delay();
void ask();
void stop();
void start();
UN rdby();
void waddr();
void wrby(UN x);
UN raddr();
UN read(UN address);
void write(UN address,UN dat);
void d5ms();
void w8addr(UN x);
sbit ESDA=P2^7;
sbit ECLK=P3^6;
sbit KEY=P2^0;
sbit lsledcs =P3^7;
sfr16 DPTR=0x82;
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;
UN code ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0-9
0x88,0x83,0xa7,0xa1,0x86,0x8e};//数码字型表
void main()
{ unsigned int i,j;
csf();
while(1)
{
P0=0xff;
lsledcs=1;
j=0;
while(j!=30)
{
i=0;
do{
P0=ledcode[0];
P1=0xfe;
delay();
P0=ledcode[1];
P1=0xfd;
delay();
P0=ledcode[2];
P1=0xfb;
delay();
P0=ledcode[3];
P1=0xf7;
delay();
i++;}
while(i!=10);
j++;
}
P1=0xff;
del05s();
}
}
void csf()
{
TMOD=0x20;TH1=0xfd;TL1=0xfd;SCON=0x50;PCON|=0x80;TR1=1;
EA=1;
delay();
ES=0;
SBUF=0xf0;while(TI==0){;}TI=0;
SBUF=0x01;while(TI==0){;}TI=0;
SBUF=0x02;while(TI==0){;}TI=0;
SBUF=0x03;while(TI==0){;}TI=0;ES=1;
}
/*################################串口*/
void surt() interrupt 4
{UN surti; unsigned char cc1;
RI=0;ES=0;
surti=0;
P0=~P0;
d10[surti]=SBUF;
do
{cc1=0xff;
surti++;
while(RI==0){cc1--;if(cc1==0){goto out;}}
RI=0;d10[surti]=SBUF;}
while(1);
out:
if(d10[0]==0x55&&surti>2){write(d10[1],d10[2]);}
else if(d10[0]==0xaa&&surti>1){
SBUF=read(d10[1]);
while(TI==0){;}TI=0;
}
ES=1;
}
void delay()
{unsigned int kk=0xff;
do{_nop_();kk--;}
while(kk!=0);
// ES=0;
// KEY=1;
// if(KEY==0){SBUF=0x99;while(TI==0){;}TI=0;}
// ES=1;
}
void del05s()
{unsigned int kk=0xefff;
do{_nop_();kk--;}
while(kk!=0);
}
void ask()
{
unsigned int i=0xffff;
ESDA=1;_nop_();ECLK=1;_nop_();
do
{i--;
if(ESDA!=1)
{ECLK=0;i=0;}
}
while(i!=0);
}
/*###################################*/
void stop()
{
ECLK=0; _nop_();
ESDA=0; _nop_();
ECLK=1; _nop_();
ESDA=1;_nop_();
ECLK=0;_nop_();
}
/* */
/*###################################*/
/*24c start */
void start()
{
ESDA=1;_nop_();
ECLK=1;_nop_();
ESDA=0;_nop_();
ECLK=0;_nop_();
}
/*###################################*/
/*24c rdby */
UN rdby()
{ ESDA=1;
ECLK=1;_nop_();_nop_();_nop_();ACC7=ESDA;ECLK=0;_nop_();_nop_();_nop_();
ECLK=1;_nop_();_nop_();_nop_();ACC6=ESDA;ECLK=0;_nop_();_nop_();_nop_();
ECLK=1;_nop_();_nop_();_nop_();ACC5=ESDA;ECLK=0;_nop_();_nop_();_nop_();
ECLK=1;_nop_();_nop_();_nop_();ACC4=ESDA;ECLK=0;_nop_();_nop_();_nop_();
ECLK=1;_nop_();_nop_();_nop_();ACC3=ESDA;ECLK=0;_nop_();_nop_();_nop_();
ECLK=1;_nop_();_nop_();_nop_();ACC2=ESDA;ECLK=0;_nop_();_nop_();_nop_();
ECLK=1;_nop_();_nop_();_nop_();ACC1=ESDA;ECLK=0;_nop_();_nop_();_nop_();
ECLK=1;_nop_();_nop_();_nop_();ACC0=ESDA;ECLK=0;_nop_();_nop_();_nop_();
return(ACC);
}
/*###################################*/
/*24c waddr */
void waddr()
{
start();
wrby(0xa0);
ask();}
/*###################################*/
/*24c raddr */
UN raddr()
{
start();
wrby(0xa1);
ask();
ACC=rdby();
stop();
return(ACC);
}
/*###################################*/
void wrby(UN x)
{ ACC=x;
ESDA=ACC7;ECLK=1;_nop_();ECLK=0;_nop_();
ESDA=ACC6;ECLK=1;_nop_();ECLK=0;_nop_();
ESDA=ACC5;ECLK=1;_nop_();ECLK=0;_nop_();
ESDA=ACC4;ECLK=1;_nop_();ECLK=0;_nop_();
ESDA=ACC3;ECLK=1;_nop_();ECLK=0;_nop_();
ESDA=ACC2;ECLK=1;_nop_();ECLK=0;_nop_();
ESDA=ACC1;ECLK=1;_nop_();ECLK=0;_nop_();
ESDA=ACC0;ECLK=1;_nop_();ECLK=0;_nop_();
ESDA=1;_nop_();ECLK=1;
}
/*####################################*/
//-----------------------------------------------------
//从指定的地址中读出一个字节数据涵
//-----------------------------------------------------
UN read(UN address)
{ waddr();
w8addr(address);
//ACC=raddr();
return(raddr());
}
//-----------------------------------------------------
//向指定的地址中写入一个字节数据涵数
//-----------------------------------------------------
void write(UN address,UN dat)
{ //EWP=0;
waddr();
w8addr(address);
wrby(dat);
ask();
stop();
d5ms();
//EWP=1;
}
/* 延时*/
void d5ms()
{ UN a, b;
for (a=0;a<=15;a++)
{
for (b=0;b<0x7f;b++)
{;}
}
}
void w8addr(UN x)
{
wrby(x );
ask();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -