1、实验内容一
1.1、问题一:
设ROM中的表格TAB中存储有8个无符号数(小于等于10),求这8个无符号数的算术平均值(结果只保留整数位),结果存入内部RAM30H中(先将TAB中存入8个常数,可采用指针或存储器绝对地址访问)。
1.2、问题一的代码
C语言采用存储器绝对地址访问代码如下:
#include <reg51.h>
#include <absacc.h>
int i;
void main()
{
int code TAB[8] = {1,2,3,4,5,6,7,8};
int sum = 0;
for (i = 0; i < 8;i++)
{
sum += TAB[i];
}
sum = sum / 8;
DBYTE[0x0030] = sum;
}
C语言采用指针绝对地址访问代码如下:
#include <reg51.h>
#include <absacc.h>
int i;
void main()
{
int code TAB[8] = {1,2,3,4,5,6,7,8};
int data *xp = 0x30;
int sum = 0;
for (i = 0; i < 8;i++)
{
sum += TAB[i];
}
sum = sum / 8;
*xp = sum;
}
2、实验内容二
2.1、问题二:
设晶振为12MHz,编写一个延时N个500ms的延时子程序,N在调用前由主程序赋值。利用该子程序设计一个系统,控制一个发光二极管以不同的频率闪烁。
2.2、问题二的代码:
C语言代码如下:
#include <reg51.h>
void delay(int);
void main()
{
int N = 3;
while (1)
{
P1 = 0x00;
delay(N);
P1 = 0x0FF;
delay(N);
}
}
void delay(int n)
{
int i,j;
while(n--)
{
for (i = 208; i > 0;i--)
for(j = 300 ; j > 0;j--)
;
}
}
3、实验内容三
3.1、问题三:
如图3-1所示,单片机P1口的P1.0和P1.1各接一个开关K1、K2,P1.4、P1.5、P1.6和P1.7各接一只发光二极管。由K1和K2的不同状态来确定哪个发光二极管被点亮。(if语句或switch语句)
3.2、问题三的代码:
C语言switch语句代码如下:
#include<reg51.h>
void main ()
{
char a;
a=P1;
a=a&0x03;
switch(a)
{
case 0: P1=0x7F; break;
case 1: P1=0xBF; break;
case 2: P1=0xDF; break;
default : P1=0xEF;
}
}
C语言if语句代码如下:
#include <reg51.h>
void main()
{
char a;
a = P1;
a = a&0x03;
if (a == 0)
P1 = 0x7F;
else if(a == 1)
P1 = 0xBF;
else if (a == 2)
P1 = 0xDF;
else
P1 = 0xEF;
}
4、实验内容四
4.1、问题四:
用单位杜邦线将I/O口P1.0与发光二极管LED1连接,利用PWM(脉冲宽度调制)原理控制该二极管的亮度逐渐变暗至不亮,再逐渐变亮。
4.2、问题四的代码:
C语言代码如下:
#include <reg51.h>
void delay(int);
sbit P1_0 = P1^0;
void main()
{
while(1)
{
int low,cycal = 500;
for (low = 1; low < cycal;low++)
{
P1_0 = 1;
delay(low);
P1_0 = 0;
delay(cycal - low);
}
for (low = 1; low < cycal;low++)
{
P1_0 = 0;
delay(low);
P1_0 = 1;
delay(cycal - low);
}
}
}
void delay(int n)
{
while(n--)
{
;
}
}