89c51单片机教学实验内容与答案.docx
- 文档编号:1869333
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:10
- 大小:84.05KB
89c51单片机教学实验内容与答案.docx
《89c51单片机教学实验内容与答案.docx》由会员分享,可在线阅读,更多相关《89c51单片机教学实验内容与答案.docx(10页珍藏版)》请在冰豆网上搜索。
89c51单片机教学实验内容与答案
1.数据传送实验
要求:
将片内从30H开始连续7个单元的内容送入从40H开始的地址单元中。
(先在30H~36H中送初值)
#include
voidmain()
{
unsignedchardatai,*d1,*d2;
d1=0x30;
d2=0x40;
{
*d1=0x10;
*(d1+1)=0x11;
*(d1+2)=0x22;
*(d1+3)=0x45;
*(d1+4)=0x30;
*(d1+5)=0x32;
*(d1+6)=0x21;
}
for(i=0;i<7;i++)
{
*(d2+i)=*(d1+i);
}
}
2.排序实验
要求:
将片内从30H单元开始的10个无符号数,按由小到大的顺序排列。
(先在30H~39H中送排序初值)
#include
voidmain()
{
unsignedchardata*p,i,j,d;
p=0x30;
*(p+0)=0x21;
*(p+1)=0x11;
*(p+2)=0x31;
*(p+3)=0x02;
*(p+4)=0x22;
*(p+5)=0x42;
*(p+6)=0x32;
*(p+7)=0x41;
*(p+8)=0x05;
*(p+9)=0x22;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(*(p+j)>*(p+j+1))
{d=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=d;
}
}
3.并行接口实验
要求:
使用P1口控制LED1~LED8进行花样显示。
显示顺序规律为:
(1)8个LED依次左移单个点亮。
(2)8个LED依次左移逐个点亮。
(3)8个LED依次左移逐个熄灭,然后再从
(1)进行循环,中间延迟时间1s。
#include
#defineucharunsignedchar//在程序中用uchar替代unsignedchar
//目的在于减少代码输入量
#defineuintunsignedint
voiddelay(uint);//定义延时函数
voidLeftMovLED(void);//定义向左移运点亮LED的函数
//*******主函数********
voidmain(void)
{
while
(1)//死循环
{
LeftMovLED();//调用LeftMovLED实现左移点亮LED功能
}
}
voidLeftMovLED(void)
{
uchari,temp;//定义两个变量
temp=0x01;//temp赋初值
for(i=0;i<8;i++)//下面的代码循环8次
{
P1=temp;//将temp内的值赋给PORTD点亮LED
temp=temp<<1&0xfe;//将temp左移一位后将最后一位清零。
delay(1000);//调用延时函数,延时时间大约1S
}
temp=0x01;//temp赋初值
for(i=0;i<8;i++)//下面的代码循环8次
{
P1=temp;//将temp内的值赋给PORTD点亮LED
temp=temp<<1&0xfe;//将temp左移一位后将最后一位清零。
temp++;
delay(1000);//调用延时函数,延时时间大约1S
}
for(i=0;i<8;i++)//下面的代码循环8次
{
P1=temp;//将temp内的值赋给PORTD点亮LED
temp=temp<<1&0xfe;//将temp左移一位后将最后一位清零。
delay(1000);//调用延时函数,延时时间大约1S
}
}
//*******延时函数*******
voiddelay(uintx)
{
uchari;//定义一个循环变量
while(x--)//循环执行在下代码x次,x在呼叫此函数处赋值。
for(i=0;i<165;i++)//循环执行以下代码165次(大约1ms)
continue;
}
4.定时器/计数器实验
要求:
使用定时/计数器作为延时控制,在两灯P0.0和P0.1之间按1s互相闪烁。
#include
#defineucharunsignedchar
sbitLED=P0^0;
sbitLED1=P0^1;
uchartime;
voidInitTimer0(void)
{
LED=1;
LED1=0;
TMOD=0x01;//定时器0,工作方式1
TH0=0x3c;
TL0=0xb0;//50ms中断一次
EA=1;
ET0=1;
TR0=1;
}
voidmain(void)
{
InitTimer0();
while
(1);//分号,表示在此一直循环执行,等待中断。
相当于汇编的AJMP$
}
voidTimer0Interrupt(void)interrupt1
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==20)//中断20次,1s
{
time=0;
LED=!
LED;//P1.0上的LED1s亮灭一次
LED1=!
LED1;
}
}
6.LED显示器
要求:
设计一个59秒计时器,使用两位共阳极LED数码管将其显示出来。
实验电路图要求自己设计,可参考书上例子或上网查询。
#include
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,};
voiddelay(uintxms)//延时函数
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidmain()
{
ucharkey,a;
a=0;
while(a<5)
{
key=0;
while(key<10)
{
delay(1000);
switch(key)
{
case0:
P2=table[0];break;//0按下相应的键显示相对应的码值
case1:
P2=table[1];break;//1
case2:
P2=table[2];break;//2
case3:
P2=table[3];break;//3
case4:
P2=table[4];break;//4
case5:
P2=table[5];break;//5
case6:
P2=table[6];break;//6
case7:
P2=table[7];break;//7
case8:
P2=table[8];break;//8
case9:
P2=table[9];break;//9
}
switch(a)
{
case0:
P1=table[0];break;//0按下相应的键显示相对应的码值
case1:
P1=table[1];break;//1
case2:
P1=table[2];break;//2
case3:
P1=table[3];break;//3
case4:
P1=table[4];break;//4
case5:
P1=table[5];break;//5
}
if(key==9)
{
a++;
}
key++;
}
}
}
仅供个人用于学习、研究;不得用于商业用途。
Forpersonaluseonlyinstudyandresearch;notforcommercialuse.
NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 89 c51 单片机 教学 实验 内容 答案