21.编写一C51函数,使用专用指针,把片外数据存储器中从0x100开始的30个字节数据,传送到片内从0x40开始的区域中。 void main() {
unsigned char data i,*dpt; unsigned char xdata *xdpt; dpt=0x40; xdpt=0x100;
for(i=0;i<30;i++)
*(dpt+i)=*(xdpt+i); }
22.编写一C51程序,实现从P1口输出产生的流水灯,要求用汇编语言函数实现数据左移或右移。 #pragma src
#include 
unsigned char temp,i; while(1) {
temp=0x55; P1=temp; delay();
#pragma asm MOV A,temp RR A
MOV temp,A #pragma endasm
P1=temp; delay(); } }
23.某单片机系统的P2口接一数模转换器DAC0832输出模拟量,现在要求从DAC0832输出连续的三角波,实现的方法是从P2口连续输出按照三角波变化的数值,从0开始逐渐增大,到某一最大值后逐渐减小,直到0,然后再从0逐渐增大,一直这样输出。试编写一函数,使从P2口输出的值产生三角波,并且使三角波的周期和最大值通过入口参数能够改变。 #include
void san(unsigned char max1,unsigned char zhou1) {
13
unsigned char i,j,max,zhou; max=max1; zhou=zhou1; while(1) {
for(i=0;i<=max,i++) {
DAC0832=i;
  for(j=0;j }   for(i=max-1;i>0,i--)  {    DAC0832=i;    for(j=0;j }  }   24.在数字滤波中有一种叫做“中值滤波”技术,就是对采集的数据按照从大到小或者从小到大进行排序,然后取其中在中间位置的数作为采样值。试编写一函数,对存放在片内数据存储器中从0x50开始的20个单元的采样数据用冒泡法排序进行中值滤波,把得到的采样数据存放到0x4f单元中。 void midf() {   unsigned char data temp,i,j,*ptr,*ptr1;  ptr=0x50;  ptr1=0x4f;   for(j=20;j>1,j--)  {   for(i=0;i  if(*(ptr+i)>*(ptr+i+1))  {  temp=*(ptr+i+1); *(ptr+i+1)=*(ptr+i); *(ptr+i)=temp;     }  } }  *ptr1=*(ptr+20/2); }   25.在数字滤波中有一种叫做“去极值平均滤波”技术,就是对采集的数据按照   14  从大到小或者从小到大进行排序,然后去掉相同数目的极大值和极小值,对中间部分数据求算术平均值作为采样值。试编写一函数,对存放在片外数据存储器中从0x150开始的16个单元的采样数据,用选择法进行“去极值平均滤波”,把得到的采样数据存放到0x14f单元中。 void teaf() {   unsigned char xdata *ptr;  unsigned char data temp,i,j,*ptr1;  ptr=0x150;  ptr1=0x4f;   for(j=16;j>1,j--)  {   for(i=0;i  if(*(ptr+i)>*(ptr+i+1))  {  temp=*(ptr+i+1); *(ptr+i+1)=*(ptr+i); *(ptr+i)=temp;     }  } }  temp=0;  for(i=0;i<16-2;i++)  temp=temp+*(ptr+i+1);   *ptr1=temp/(16-2); }  26.利用库函数_getkey编写一函数,实现从单片机串行口接收数据的C51程序,把接收的数据存放在片内数据存储器从0x40开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include   unsigned char data *dpt;  unsigned char i=0,temp;  dpt=0x40;  while(1) {   temp=_getchar();  if(temp==0x0d)  break;   *(dpt+i)=temp;  i++;    15  }  }   27.利用库函数scanf编写一函数,实现从单片机串行口接收数据的C51程序,把接收的数据存放在片外数据存储器从0x240开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include   unsigned char xdata *xdpt;  unsigned char i=0,temp;  xdpt=0x240;  while(1) {   scanf(“%c”,&temp);  if(temp==0x0d)  break;   *(xdpt+i)=temp;  i++; } }  28.利用库函数putchar编写一函数,实现从单片机串行口发送数据的C51程序,发送的数据存放在片内数据存储器从0x50开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include   unsigned char data *dpt;  unsigned char i=0;  dpt=0x50;   while(*(dpt+i)!=0x0d)  {   putchar(*(dpt+i));  i++; } }  29.利用库函数printf编写一函数,实现从单片机串行口发送数据的C51程序,发送的数据存放在片外数据存储器从0x100开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include    16