单片机原理及应用课程实验2

本文基于大连海事大学单片机实验设计,提供所有解题思路,谢谢关注!

tips:请站在巨人的肩膀上

1、内部RAM20H中存放有原码机器数,将其转换为补码存在21单元中,并赋值给有符号字符变量value。

#include<reg51.h>
void main()
{
	//定义指针变量p
	unsigned char *p,t;
	signed char Value;
	//让p指向20H的地址 
	p = 0x20;
	//取p所指向地址的值的最高位来判断他是正数还是负数 
	t = *p>>7;
	if(t == 0)//正数 
	{
		//把值赋给Value变量 
		Value = *p;
		//把地址加一 
		p++;
	}
	else
	{
		//把所有位置取反 
		Value = ~(*p);
		//加一 
		Value = Value +1;
		//首位变回1 
		Value = Value|0x80;
        //地址加一 
		p++;
	}
	//再把value赋给p 
	*p = Value;
	//用while使程序卡在这里 
	while(1);
}

修改20H单元的内容,单步(连续、设置断点 方式)运行程序,验证21H单元结果是否正确,找出它们之间的关系。

(20H)=

03H

82H

9FH

FEH

80H

7FH

50H

43H

(21H)=

03H

FEH

E1H

82H

80H

7FH

50H

43H

value=

03H

FEH

E1H

82H

80H

7FH

50H

43H

程序实现的功能:

20H中的数的补码存储到21H

2、P1口接8个发光二极管LED,编程实现8个LED灯依次点亮,循环往复。设fosc=2MHz。

#include<reg51.h>
#include<intrins.h>

//用char的原因是八位 
unsigned char aa;
void delayms(unsigned int xms)
{
    unsigned int i,j;
    //让其循环达到延时的效果 
	for(i = xms; i > 0; i--)
	    for(j = 110;j > 0;j--);
}

void main()
{
	//把11111110赋值给aa 
    aa = 0xfe;
	while(1)
	{
		//把aa的值赋给P1 
	   P1 = aa;
	   //调用延时函数,要不然跳的快 
	   delayms(10);
	   //左移函数 
	   aa = _crol_(aa,1);
	}
}

分析与验证:不断修改程序中延时参数或仿真时钟参数,观察发光二极管的变化。

发光二极管会随着延时参数的变化而变化

程序实现的功能:P1口接8个发光二极管LED,编程实现8个LED灯依次点亮,循环往复。

3、(选作)内部RAM从20H单元开始存放有压缩BCD码,以函数形式编程,将其转换为真值赋给变量value,压缩BCD码的长度(最大4字节)保存在30H单元中。BCD码的长度存放在20H单元中。如:BCD码的219存储格式为(20H)=02H,(21H)=02H,(22H)=19H。

#include<reg51.h>
unsigned char *p1,*p2;
unsigned int now,a,b,n,sum,cnt;
int calculate()
{
 sum = 0;
 cnt = 0;
 p1 = 0x20; n = *p1; 
 p1++;
 while(n)
 {
  n--;
  now = *p1;
  p1++;
  a = now>>4;
  b = now&0x0f;
  sum = sum*100+(a*10+b);
  if(a != 0) cnt += 2;
  else cnt ++;
 }
 p2 = 0x30;
 *p2 = cnt;
 return sum;
}

void main()
{
 unsigned int value;
    value = calculate();
}

分析与验证:

BCD

5

57

135

231

1456

2568

42365

65532

30H

1

2

3

3

4

4

5

5

value=

0x0005

0x0039

0x0087

0x00E7

0x05B0

0x0A08

0xA57D

0xFFFC

程序实现的功能:

实现二进制和BCD的转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值