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