部分內容借鑒別人的,stc12c5a60s2通過,如 Delay1_1us(88); 是通過單獨另外寫一個定時器程序,測出來的,需要注意 。
單片機源程序如下:
#define uchar unsigned char
#define uint unsigned int
#define MAIN_Fosc 22118400 // 11059200
#define ci_1us (double)MAIN_Fosc/12000000
void Delay1_1us(uint b) //@22.1184MHz
{
unsigned char i;
do{
_nop_();
_nop_();
i = 2;
while (--i);
} while (--b);
}
void Delay1ms(uint b) //@22.1184MHz
{
unsigned char i, j;
i = 22;
j = 128;
do{
do
{
while (--j);
} while (--i);
} while (--b);
}
sbit P_TXD1 = P3^1;
void Tx1Send(uchar dat) //9600,N,8,1 發送一個字節
{ uint i,m;
uchar j;
EA = 0;
m =90*ci_1us ;
P_TXD1 = 0;
i=m; // i=165; //stc12 165 104us
while(--i) ;
for(j=0; j<8; j++)
{
if(dat & 1) P_TXD1 = 1;
else P_TXD1 = 0;
dat >>= 1; i=m;
while(--i) ;
}
P_TXD1 = 1;
i=m;
while(--i) ;
EA = 1;
Delay1ms(1);
}
sbit p30 = P3^0;
unsigned char Content = 0x00;
bit r()
{unsigned int i;
unsigned char uContent = 0x00;
if(p30 == 0){Delay1_1us(44);
if(p30 == 0)
{
for(i=0;i<8;i++)
{
uContent = uContent >> 1;
Delay1_1us(88);
if(p30 == 1) uContent |= 0x80;
}
}
Delay1_1us(88);
Content=uContent;
return(1);
}
else return(0);
}
unsigned char sz[6] ;
bit ReceiveString()
{
char num=0 ;
unsigned char count=0;
loop:
if(num<6)
{ while( r()==0)
{
count++;
if(count>280)
return 0;
}
sz[num]=Content;
count=0;
num++;
goto loop;
}
sz[num]='\0';
return 1;
}
void PrintString(unsigned char *puts)
{for (; *puts != 0; puts++) Tx1Send(*puts);
}
|