单片机接口程序

  • 格式:doc
  • 大小:95.50 KB
  • 文档页数:28

实验一:8255

#include

#include

#define PA XBYTE[0X7CFF] //0111 1100,A1A0=00时选中端口A

#define PB XBYTE[0X7DFF] //0111 1101,A1A0=01时选中端口B

#define com XBYTE[0X7FFF] //0111 1111 A1A0=11时选中控制寄存器,P2.7为0选中芯片

void main()

{

unsigned char a;

com=0x90; //1001 0000设置8255的控制字格式

a=PA;

PB=a;

}

实验二:485

先发后收:

#include

unsigned char a;

unsigned char b;

int n;

sbit p=P1^0;

void Delay(int n);

void main()

{

TMOD=0X20;

SCON=0X50;

TH1=0Xfd;

TL1=0Xfd;

TR1=1;

b=0xff;

while(1)

{

p=1 ;

b=b-0x01;

SBUF=b;

while(TI==0)

{}

TI=0;

Delay(3000);

p=0;

while(RI==0)

{}

P2=SBUF; RI=0;

Delay(3000);

}

}

void Delay(int n)//延时程序

{

while(n--)

{}

}

先收后发:

#include

unsigned char a;

unsigned char b;

int n;

sbit p=P1^0;

void Delay(int n);

void main()

{

TMOD=0X20;

SCON=0X50;

TH1=0Xfd;

TL1=0Xfd;

TR1=1;

while(1)

{

p=0;

while(RI==0)

{}

P2=SBUF;

a=SBUF;

RI=0;

Delay(3000);

p=1;

b=0xff-a;

SBUF=b;

while(TI==0)

{}

TI=0;

Delay(3000);

}}

void Delay(int n) //延时程序

{ while(n--)

{}

}

实验三:232

#include"reg51.h" //中断法,波特率9.6k

void main()

{ SCON=0x50;

TMOD=0x20;

PCON=0X80;

TL1=0XFA;

TH1=0XFA;

TR1=1;

EA=1;

ES=1;}

void intserl(void)interrupt 4

{ unsigned char date;

if(RI)

{date=SBUF;

P2=date;

RI=0;

SBUF=0x4c;

}

TI=0;

}

查询法:

#include"reg51.h" //查询法,波特率9.6k

void main()

{

unsigned char date;

SCON=0x50;

TMOD=0x20;

PCON=0X80;

TL1=0XFA;

TH1=0XFA;

TR1=1;

EA=1;

ES=1;

while(1)

{P1=0x00;

if(RI)

{date=SBUF;

P2=date; RI=0;

P1=0x01;

SBUF=P0;

TI=0;}

else while(!RI);}

}

实验四:LED

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit clk1=P2^0;

sbit ds=P2^1;

sbit clk2=P2^2;

sbit oe1=P2^7;

sbit oe2=P2^6;

uchar a;

uchar tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //逐列有效(列低电平有效)

uchar tab2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //逐个多一列有效

void delay(uint t)

{

uchar i,j;

for(j=t;j>0;j--)

for(i=t;i>0;i--);

}

void send_595(uchar byte)

{

uchar i;

for(i=0;i<8;i++)

{

clk1=0;

delay(1);

ds=(bit)(byte&0x80);

delay(1);

clk1=1;

delay(1);

byte=byte<<1;}

clk2=0;

delay(2);

clk2=1; }

void output_data() //输出数据

{

clk2=0;

_nop_();

_nop_();

clk2=1;

}

void send138(uchar a)

{ uchar i;

for(i=0;i<8;i++)

{

P0=a++; //对应每一列,从第一行到第八行

clk2=0;

_nop_();

_nop_();

clk2=1;

delay(90);

}

}

void main()

{

/*------------------------------红色按行一颗一颗点亮------------------------------------------*/

uchar i;

oe1=0;

oe2=1;

for(a=0;a<8;a++) //一行一行地亮

{

P0=a;//固定行

for(i=0;i<8;i++)

{

send_595(tab1[i]); //逐列点亮

output_data();

delay(90);}

}

/*------------------------------绿色按列一颗一颗点亮-----------------------------------------*/

oe1=1;

oe2=0;

{send_595(0xfe); //选中第一列 send138(0);

send_595(0xfd); //选中第二列

send138(0);

send_595(0xfb);

send138(0);

send_595(0xf7);

send138(0);

send_595(0xef);

send138(0);

send_595(0xdf);

send138(0);

send_595(0xbf);

send138(0);

send_595(0x7f);

send138(0);}

------红色一行一行点亮 oe1=0;

oe2=1;

for(a=0;a<8;a++) //一行一行地亮

{P0=a;

for(i=0;i<8;i++)

{

send_595(tab2[i]); //逐列点亮

output_data();

delay(90);

}

}

/*------------------------------绿色一行一行点亮------------------------------------------*/

oe1=1;

oe2=0;

{send_595(0xfe); //固定前一列

send138(0);

send_595(0xfc); //固定前两列

send138(0);

send_595(0xf8);

send138(0);

send_595(0xf0);

send138(0);

send_595(0xe0);

send138(0);

send_595(0xc0);

send138(0);

send_595(0x80);

send138(0);

send_595(0x00);