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 #define DAC0832 XBYTE[0x7FFF]
void san(unsigned char max1,unsigned char zhou1) {
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 } } 16 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.在数字滤波中有一种叫做“去极值平均滤波”技术,就是对采集的数据按照从大到小或者从小到大进行排序,然后去掉相同数目的极大值和极小值,对中间部分数据求算术平均值作为采样值。试编写一函数,对存放在片外数据存储器中从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; 17 } } } 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++; } } 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++; 18 } temp=0; for(i=0;i<16-2;i++) temp=temp+*(ptr+i+1); *ptr1=temp/(16-2); } } 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 unsigned char xdata *xdpt; unsigned char i=0; xdpt=0x100; while(*(xdpt+i)!=0x0d) { printf(“%c”,*(xdpt+i)); i++; } } 30.编写一定时器/计数器0定时100ms中断处理函数,使函数实现时钟的功能,即产生时钟的秒、分钟和小时。设定时初值的高、低字节分别为TIMER_H和TIMER_L。 设fosc=6mhz #include unsigned char data shi,fen,miao,bfm; 19 void main() { TMOD=0x01; TIMER_H=15536/16; TIMER_L=15536; ET0=1; EA=1; TR0=1; while(1); } void time0_int() interrupt 1 { TIMER_H=15536/16; TIMER_L=15536; bfm++; if(bfm==10) { bfm=0; miao++; } if(miao==60) { miao=0; fen++; } if(fen==60) { fen=0; shi++; } if(shi==24) { shi=0; } } 31.在Keill C的调试状态下,如何使用跟踪运行、单步运行、跳出函数运行命令? 答:Step命令和Step Over命令的区别:当遇到调用函数时,前者将跟踪进入函数,而后者是一步执行完函数。 如果用全速运行命令Go,可以使用Stop Running命令停止运行。 欲退出调试状态,可以再次点击Debug菜单下的Start/Stop Debug Session命令或相应的按钮。 20