单片机编程练习题
第四章习题:
1、编程将8051的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(任意位置)。
#include<reg51.h>
#include<math.h>
int movdata(char);
void main()
{
unsigned int xdata sum;
unsigned char *ptr,a,b;
ptr=0x20;
a=*ptr;
ptr=0x35;
b=*ptr;
sum=a*b;
}
2、8051的片内数据存储器25H单元中存放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存中。
#include<reg51.h>
#include<math.h>
void main()
{
char n;
char *ptr;
float *ptr2;
float f;
ptr=0x25;
n=*ptr;
f=sqrt(n);
ptr2=0x30;
*ptr2=f;
}
3、将外部RAM 10H~15H单元的内容传送到内部RAM 10H~15H单元。
#include<reg51.h>
int movdata(char);
void main()
{
char n=6;
char *ptr1=0x10;
char xdata *ptr2;
ptr2=0x10;
while(n--)
{
*ptr1++=*ptr2++;
}
}
4、内部RAM 20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。
#include<reg51.h>
unsigned int x _at_ 0x20;
unsigned int y _at_ 0x22;
unsigned int z _at_ 0x24;
void main()
{
z=(x>y)?x:y;
}
第五章习题
1、编写出外部中断1为下跳沿触发的中断初始化程序。
#include<reg51.h>
void Int_init()
{IT1=1;
EA=1;
EX1=1;
}
2、有一外部中断源,接入端,当其中有中断请求时,要求CPU 把一个从内部RAM 30H 单元开始的50个字节的数据块传送到外部RAM 从1000H 开始的连续存储区。
请编写对应的程序。
#include<reg51.h>
void main(){
IT0=1 ;
EA=1;
EX0=1;
while(1) ;
}
void intx0() interrupt 0 using 1{
char * ptr1=0x30;
char xdata i, * ptr2=0x1000;
for(i=0;i<50;i++) *ptr2++=*ptr1++;
}
3、设fosc = 12MHz ,利用定时器,TO(工作在方式2)在P1.1引脚上获取输出周期为O.4ms 的方波信号,定时器溢出时采用中断方式处理,请编写,T0的初始化程序及中断服务程序。
#include<reg51.h>
sbit P1_1=P1^1; void timer0()interrupt 1 using 1{
0INT
P1_1=!P1_1;
}
void main(){
P1_1=0;
TMOD=0x02;
TH0=56;
TL0=56;
IE=0x82;
TR0=1;
for(;;){}
}
4、设fosc = 6MHz,要求每隔50ms,从内部RAM以30H开始的数据存储区传送一个字节数据到外部RAM以2000H开始的连续存储区,共传送50个数据。
要求:采用定时器T1以方式2实现定时,数据传送在中断服务程序中完成。
#include<reg51.h>
char intcnt=0;
char movcnt=0;
char *ptr1=0x30;
char xdata *ptr2=0x2000;
void timer1()interrupt 3 using 1{
intcnt++;
if(intcnt==100){ if(movcnt<50){ *ptr2++=*ptr1++; movcnt++;
}
else EX1=0; intcnt=0;
}
}
void main(){ TMOD=0x20;
TH1=6;
TL1=6;
IE=0x84;
TR1=1;
for(;;){}
}。