东南大学 单片机实验 解答.docx

上传人:b****6 文档编号:7069788 上传时间:2023-01-16 格式:DOCX 页数:21 大小:18.19KB
下载 相关 举报
东南大学 单片机实验 解答.docx_第1页
第1页 / 共21页
东南大学 单片机实验 解答.docx_第2页
第2页 / 共21页
东南大学 单片机实验 解答.docx_第3页
第3页 / 共21页
东南大学 单片机实验 解答.docx_第4页
第4页 / 共21页
东南大学 单片机实验 解答.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

东南大学 单片机实验 解答.docx

《东南大学 单片机实验 解答.docx》由会员分享,可在线阅读,更多相关《东南大学 单片机实验 解答.docx(21页珍藏版)》请在冰豆网上搜索。

东南大学 单片机实验 解答.docx

东南大学单片机实验解答

实验一

#include

sbitLed1=P1^0;

sbitLed2=P1^1;

voidDelay1s(void)

{

unsignedcharh,i,j,k;

for(h=10;h>0;h--)

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

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

for(k=214;k>0;k--);

}

voidmain()

{

while

(1)

{

Led1=1;

Led2=0;

Delay1s();

Led1=0;

Led2=1;

Delay1s();

}

}

实验二

#include

#include

sbitLed1=P1^0;

sbitLed2=P1^1;

unsignedcharflag,sdata;

voidLed1Invert(void)

{

if(Led1==0)

{

Led1=1;

}

else

{

Led1=0;

}

}

voidInitSerial()

{

SCON=0x50;//将串口设置为方式1,8位数据

PCON=0x00;//不进行2分频

TMOD=0x20;//定时器1设为模式2

TL1=0xfd;//设置波特率为19200=22118400/(32*12*(256-0xfd))

TH1=0xfd;//设置波特率

TR1=1;//启动定时器1

ES=1;//允许串口中断

}

voidSen(unsignedcharch)

{

ES=0;

TI=0;

SBUF=ch;

while(!

TI){}//等待发送结束信号

TI=0;

ES=1;

}

voidSer_ISR()interrupt4//串口中断号为4

{

ES=0;

if(RI)

{

flag=1;

sdata=SBUF;

RI=0;

}

ES=1;

}

voidmain()

{

unsignedchartemp,state;

InitSerial();

EA=1;//允许系统中断

Led1=0;//点亮Led1

temp=XBYTE[0x8000];//读输入状态

Sen(temp);//将状态号码通过串口发送

while

(1)

{

if(flag)

{

Led1Flush();

Sen(sdata+1);//将收到的数据加一后回送

flag=0;

}

state=XBYTE[0x8000];//访问按键状态

if(state!

=temp)//按键和拨码状态改变

{

temp=state;

Sen(temp);

}

}

}

实验三

#include

#include

sbitSCK=P1^7;

sbitRCK=P1^6;

sbitSER=P1^5;

unsignedcharnum[]={0x41,0xf9,0x83,0xa1,0x39,0x25,0x05,0xf1,0x01,0x21,0x11,0x0d,0x47,0x89,0x07,0x17,0xff};//先移低位

unsignedcharflag,sdata;

voidInitSerial()

{

SCON=0x50;//将串口设置为方式1,8位数据

PCON=0x00;//不进行2分频

TMOD=0x20;//定时器1设为模式2,

TL1=0xfa;//设置波特率为960019200=22118400/(32*12*(256-0xfd))

TH1=0xfa;

TR1=1;//启动定时器1

ES=1;//允许串口中断

}

voidSer_ISR()interrupt4//串口中断服务程序//串口中断号为4

{

ES=0;

if(RI)

{

flag=1;

sdata=SBUF;

RI=0;

}

ES=1;

}

voiddelay()//延时0.5秒

{

inti,j;

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

for(j=0;j<230;j++);

}

voidmove_in(unsignedchara)

{

unsignedchari;

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

{

SCK=0;

SER=(num[a]>>i)&(0x01);

SCK=1;

}

}

voidmain()

{

unsignedcharstate,i,j;

InitSerial();//初始化串口

EA=1;//允许系统中断

while

(1)

{

state=XBYTE[0x8000];

if(state==0xff)//显示第一种模式

{

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

{

for(j=0;j<4;j++)move_in(i);

RCK=0;

RCK=1;

delay();

}

}

else

{

if(flag)

{

for(i=0;i<4;i++)move_in(16);//清除当前显示

RCK=0;

RCK=1;

move_in(sdata&(0x0f));

move_in((sdata>>4)&(0x0f));

RCK=0;

RCK=1;

flag=1;

}

}

}

}

实验四

#include

#include

sbitSCK=P1^7;

sbitRCK=P1^6;

sbitSER=P1^5;

sbitLed1=P1^0;

sbitLed2=P1^1;

unsignedcharnum[]={0x41,0xf9,0x83,0xa1,0x39,0x25,0x05,0xf1,0x01,0x21,0x11,0x0d,0x47,0x89,0x07,0x17,0xff};//先移低位

unsignedcharflag,sdata;

voidInitSerial()

{

SCON=0x50;//将串口设置为方式1,8位数据

PCON=0x00;//不进行2分频

TMOD=0x20;//定时器1设为模式2,

TL1=0xfa;//设置波特率为960019200=22118400/(32*12*(256-0xfd))

TH1=0xfa;

TR1=1;//启动定时器1

ES=1;//允许串口中断

}

voidLed1Invert()

{

if(Led1==0)Led1=1;

elseLed1=0;

}

voidSer_ISR()interrupt4//串口中断服务程序//串口中断号为4

{

ES=0;

if(RI)

{

flag=1;

sdata=SBUF;

RI=0;

}

ES=1;

}

voiddelay()//延时1秒

{

inti,j;

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

for(j=0;j<230;j++);

}

voidmove_in(unsignedchara)

{

unsignedchari;

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

{

SCK=0;

SER=(num[a]>>i)&(0x01);

SCK=1;

}

}

voidmain()

{

unsignedinti,j;

unsignedcharstate,temp,addr=0;

InitSerial();//初始化串口

EA=1;//允许系统中断

for(i=0;i<32768;i++)XBYTE[i]=0;//初始化RAM

while

(1)

{

state=XBYTE[0x8000];

if(state==0xff)//显示第一种模式

{

Led2=1;

addr=0;

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

{

Led1Invert();

for(j=0;j<4;j++)move_in(16);//清除当前显示

RCK=0;

RCK=1;

temp=XBYTE[0x100+i];//从RAM中读数据并显示

move_in(temp&(0x0f));

move_in((temp>>4)&(0x0f));

RCK=0;

RCK=1;

delay();

}

}

else

{

Led2=0;

if(flag)

{

XBYTE[0x100+addr]=sdata;

addr=(addr+1)%10;

flag=0;

}

}

}

}

实验五

#include

#include

#defineucharunsignedchar

sbitSCK=P1^7;

sbitRCK=P1^6;

sbitSER=P1^5;

sbitLed1=P1^0;

sbitLed2=P1^1;

sbitscl=P1^3;

sbitsda=P1^4;

unsignedcharnum[]={0x41,0xf9,0x83,0xa1,0x39,0x25,0x05,0xf1,0x01,0x21,0x11,0x0d,0x47,0x89,0x07,0x17,0xff};//先移低位

unsignedcharflag,sdata;

/*voidInitSerial()

{

SCON=0x50;//将串口设置为方式1,8位数据

PCON=0x00;//不进行2分频

TMOD=0x20;//定时器1设为模式2,

TL1=0xfa;//设置波特率为960019200=22118400/(32*12*(256-0xfd))

TH1=0xfa;

TR1=1;//启动定时器1

ES=1;//允许串口中断

}

voidLed1Invert()

{

if(Led1==0)Led1=1;

elseLed1=0;

}

voidSer_ISR()interrupt4//串口中断服务程序//串口中断号为4

{

ES=0;

if(RI)

{

flag=1;

sdata=SBUF;

RI=0;

}

ES=1;

}

voiddelayqq()//延时1秒

{

inti,j;

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

for(j=0;j<230;j++);

}

*/

voidmove_in(unsignedchara)

{

unsignedchari;

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

{

SCK=0;

SER=(num[a]>>i)&(0x01);

SCK=1;

}

}

///////////////////////////////////////////////

voiddelay()

{;;}

voidstart()//开始信号

{

sda=1;

delay();

scl=1;

delay();

sda=0;

delay();

}

voidstop()//停止

{

sda=0;

delay();

scl=1;

delay();

sda=1;

delay();

}

voidrespons()//应答

{

uchari;

scl=1;

delay();

while((sda==1)&&(i<250))i++;

scl=0;

delay();

}

voidinit()

{

sda=1;

delay();

scl=1;

delay();

}

voidwrite_byte(uchardate)

{

uchari,temp;

temp=date;

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

{

temp=temp<<1;

scl=0;

delay();

sda=CY;

delay();

scl=1;

delay();

}

scl=0;

delay();

sda=1;

delay();

}

ucharread_byte()

{

uchari,k;

scl=0;

delay();

sda=1;

delay();

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

{

scl=1;

delay();

k=(k<<1)|sda;

scl=0;

delay();

}

returnk;

}

voiddelay1(ucharx)

{

uchara,b;

for(a=x;a>0;a--)

for(b=100;b>0;b--);

}

voidwrite_add(ucharaddress,uchardate)

{

start();

write_byte(0xa2);

respons();

write_byte(0x00);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

ucharread_add(ucharaddress)

{

uchardate;

start();

write_byte(0xa2);

respons();

write_byte(0x00);

respons();

write_byte(address);

respons();

start();

write_byte(0xa3);

respons();

date=read_byte();

stop();

returndate;

}

//////////////////////

//voidmain()

//{

//uchartemp;

//init();

//write_add(0x23,0xa7);

//delay1(10000);

//temp=read_add(0x23);

//move_in(temp&(0x0f));

//move_in((temp>>4)&(0x0f));

//RCK=0;

//RCK=1;

//while

(1);

//}

/*voidmain()

{

unsignedinti,j;

unsignedcharstate,temp,addr=0;

InitSerial();//初始化串口

EA=1;//允许系统中断

for(i=0;i<32768;i++)XBYTE[i]=0;//初始化RAM

while

(1)

{

state=XBYTE[0x8000];

if(state==0xff)//显示第一种模式

{

Led2=1;

addr=0;

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

{

Led1Invert();

for(j=0;j<4;j++)move_in(16);//清除当前显示

RCK=0;

RCK=1;

temp=XBYTE[0x100+i];//从RAM中读数据并显示

move_in(temp&(0x0f));

move_in((temp>>4)&(0x0f));

RCK=0;

RCK=1;

delay();

}

}

else

{

Led2=0;

if(flag)

{

XBYTE[0x100+addr]=sdata;

addr=(addr+1)%10;

flag=0;

}

}

}

}*/

实验六

#include

#include

#defineucharunsignedchar

sbitSCK=P1^7;

sbitRCK=P1^6;

sbitSER=P1^5;

sbitLed1=P1^0;

sbitLed2=P1^1;

sbitscl=P1^3;

sbitsda=P1^4;

unsignedcharnum[]={0x41,0xf9,0x83,0xa1,0x39,0x25,0x05,0xf1,0x01,0x21,0x11,0x0d,0x47,0x89,0x07,0x17,0xff};//先移低位

unsignedcharflag,sdata;

voidInitSerial()

{

SCON=0x50;//将串口设置为方式1,8位数据

PCON=0x00;//不进行2分频

TMOD=0x20;//定时器1设为模式2,

TL1=0xfa;//设置波特率为960019200=22118400/(32*12*(256-0xfd))

TH1=0xfa;

TR1=1;//启动定时器1

ES=1;//允许串口中断

}

voidLed1Invert()

{

if(Led1==0)Led1=1;

elseLed1=0;

}

voidLed2Invert()

{

if(Led2==0)Led2=1;

elseLed2=0;

}

voidSer_ISR()interrupt4//串口中断服务程序//串口中断号为4

{

ES=0;

if(RI)

{

flag=1;

sdata=SBUF;

RI=0;

}

ES=1;

}

voiddelay()//延时0.4秒

{

inti,j;

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

for(j=0;j<230;j++);

}

voidmove_in(unsignedchara)

{

unsignedchari;

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

{

SCK=0;

SER=(num[a]>>i)&(0x01);

SCK=1;

}

}

voidmain()

{

unsignedcharstate,temp,i,j=0;

unsignedcharnum[4];

InitSerial();//初始化串口

EA=1;//允许系统中断

for(i=0;i<4;i++)move_in(16);//清空显示

RCK=0;

RCK=1;

Led1=0;Led2=0;

while(j<4)

{

if(flag)

{

num[j]=sdata;

j++;

flag=0;

}

}

Led1=1;Led2=1;

for(i=0;i<4;i++)move_in(num[i]);//显示

RCK=0;

RCK=1;

while

(1)

{

state=XBYTE[0x8000];

if(state==0xef)//左移数码管显示

{

delay();

temp=num[3];

num[3]=num[2];

num[2]=num[1];

num[1]=num[0];

num[0]=temp;

for(i=0;i<4;i++)move_in(num[i]);//显示

RCK=0;

RCK=1;

}

if(state==0xdf)//右移数码管显示

{

delay();

temp=num[0];

num[0]=num[1];

num[1]=num[2];

num[2]=num[3];

num[3]=temp;

for(i=0;i<4;i++)move_in(num[i]);//显示

RCK=0;

RCK=1;

}

if(state==0xbf)//Led1

{

delay();

Led1Invert();

}

if(state==0x7f)//Led2

{

delay();

Led2Invert();

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1