本文基于大连海事大学单片机实验设计,提供所有解题思路,谢谢关注!
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的转换