实验一 数据区赋值
(用指针、at、宏分别设计程序)
实现给片内RAM 30H和片外RAM 3000H开始的16字节区域分别赋值为0x01、0x02......0x0f。
At
#include data unsigned char buffer1[16] _at_ 0x30; xdata unsigned char buffer2[16] _at_ 0x0030; void main() { unsigned int i,j; for(i=0;i<16;i++) { buffer1[i]=i; } for(j=0;j<16;j++) { buffer2[j]=j; } while(1); } 宏 #include unsigned int i,a,b; a=0x30; b=0x0030; for(i=0;i<16;i++) { DBYTE[a++]=i; XBYTE[b++]=i; } while(1); } 指针 #include unsigned char data*p1; unsigned char xdata*p2; unsigned int i; p1=0x30; p2=0x3000; for(i=0;i<16;i++) { *p1=i; p1++; *p2=i; p2++; } } 实验二 数据区数据处理 对30H开始的内存区数据0x01~0x0f进行处理: 将30H开始的内容变成0x01、0x23、0x45......0xef存到40H开始的单元 将40H开始的内容变成0xef、0xcd.....0x23、0x01存到50H开始的单元 将50H开始的内容变成0x0f、0x0e、0x0d......0x01、0x00存到60H开始的单元 #include #include data unsigned char buffer1[16] _at_ 0x30; data unsigned char buffer2[8] _at_ 0x40; data unsigned char buffer3[8] _at_ 0x50; data unsigned char buffer4[16] _at_ 0x60; void main() { unsigned int i,j,k,r; for(i=0;i<16;i++) {buffer1[i]=i;}//30H赋值 for(j=0;j<8;j++) {buffer2[j]=buffer1[2*j]<<4|buffer1[2*j+1];}//40H for(k=0;k<8;k++) {buffer3[k]=buffer2[7-k];}//50H for(r=1;r<16;r++) { if(r%2==0) buffer4[r-1]=buffer3[r/2-1]>>4; else buffer4[r-1]=buffer3[r/2]&0x0f;}//60H } 实验三 并行口实验 P3.0接开关K0,设计程序实现: 当K0=0时,P1口连接的8个LED灯从LED0~LED7依次点亮; 当K0=1时,P1口连接的8个LED灯从LED7~LED0依次点亮; #include #define unchar unsigned char void delay() { unchar i,j; for(i=0;i<255;i++) for(j=0;j<255;j++); } void mian() { unchar a,b,i; do {P3=0xff;//将P3置为输入状态 a=P3; a=a&0x01;//屏蔽高7位 if (a==0) {b=0x01; for(i=0;i<8;i++) {P1=b; delay(); b=b<<1;} } else {b=0x80; for(i=0;i<8;i++) {P1=b; delay(); b=b>>1;} } }while(1); } 根据P3.1和P3.0连接的开关K1和K0的状态实现P1口连接的8只LED灯按以下形式亮灭: K1 K0 亮灯 0 0 8只灯全亮全灭交替 0 1 LED7~4和LED3~0交替全亮全灭 1 0 从全灭状态起,8只灯从两头到中间再从中间到两头依次点亮 1 1 从全亮状态起,8只灯从两头到中间依次点灭,再从中间到两头依次点亮 #include void mian() {unchar a,b,c,i; do {P3=0xff; a=P3; a=a&0x03;//屏蔽高六位 switch(a) {case 0: {for(i=0;i<2;i++) {P1=0x00; delay(); P1=0x0ff; delay();} }break; case 1: {for(i=0;i<2;i++) {P1=0x0f; delay(); P1=0x0f0; delay();} }break; case 2: {P1=0x00; for(i=0;i<4;i++) {b=(0x01<>i)&0xf0; P1=b+c; delay();} for(i=0;i<4;i++) {b=(0x08>>i)&0x0f; c=(0x10<>i))&0xf0; P1=b+c; delay();} for(i=0;i<4;i++) {b=(~(0x08>>i))&0x0f; c=(~(0x10<实验四 外部中断实验1 INT0中断:P1接8个LED灯,点动开关接P3.2(INT0),负跳变产生中断,编写程序实现:主程序8只LED灯一起亮灭闪烁循环往复;INT0中断程序实现8个LED灯左右点亮循环5次后退出中断。 #include #include void main() {EA=1; EX0=1; IT0=1; do{P1=0x00; delay(); P1=0xff; delay();} while(1); } void int0() interrupt 0 using 1 { unchar k,m; k=0x80; for(m=0;m<40;m++)//左点亮循环5次 {P1=k; delay(); k=_cror_(k,1); } } INT1中断:P1接8个LED灯,点动开关接P3.2(INT0),负跳变产生中断,编写程序实现:主程序8只LED灯一起亮灭闪烁循环往复;INT0中断程序实现8个LED灯左右点亮循环5次后退出中断。 #include #include } void main() { EA=1; EX1=1; IT1=1; do{P1=0x00; delay(); P1=0xff; delay();} while(1); } void int1() interrupt 2 using 2 { unchar a,b,c; EX1=0; a=0x80; for(b=0;b<5;b++) //左右点亮循环5次 { for(c=0;c<8;c++) {P1=0x80>>c; delay();} for(c=0;c<8;c++) {P1=0x01< 两个外部中断:P1接8个LED灯,点动开关接P3.2 (INT0),K0开关接P3.3(INT1),均为负跳变产生中断和低优先级,编写程序实现如下功能:①主程序8只LED灯一起亮灭闪烁循环往复。②INT0中断程序实现:8个LED灯左点亮循环5次后退出中断;INT1中断程序实现8个LED灯右点亮循环5次后退出中断。(为方便实验现象观察,中断程序里的循环次数可改为10次) 运行程序,观察在INT0中断服务期间,INT1申请中断是否会响应?(不会)在INT1中断期间,INT0申请中断是否会响应?(不会)解释实验现象理解同优先级下的中断优先 顺序的知识。(自然优先级INT0>INT1,但进入中断后互不干扰;自然优先级下若同时触发INT0和INT1,则先响应INT0) 修改程序,INT0设为低优先级,INT1设为高优先级,运行程序观察实验现象: 在INT0中断程序运行中,INT1中断请求能否得到相应?(可以) 在INT1中断程序运行中,INT0中断请求能否得到相应? (不可以) 修改程序,INT0设为高优先级,INT1设为低优先级,运行程序观察实验现象: 在INT0中断程序运行中,INT1中断请求能否得到相应?(不可以) 在INT1中断程序运行中,INT0中断请求能否得到相应?(可以) 解释原因,加强对中断嵌套知识的理解。 (若手动设置优先级,(如PX0=1,PX1=0使INT0为高级中断、INT1为低级中断),高级中断可以打断执行中的低级中断) (实验设置目的:体会中断管理机制,理解中断嵌套规则。) #include #include void main() { EA=1; EX0=1; EX1=1; IT0=1; IT1=1; IP=0; //1.IP=0即PX0=0;PX1=1;同为低优先级 //2.PX0=0;PX1=1; //3.PX0=1;PX1=0; do{ P1=0x00; delay(); P1=0xff; delay(); } while(1); } void int0() interrupt 0 using 1 { unchar a,b; b=0x80; for(a=0;a<40;a++) {P1=b; delay(); k=_cror_(b,1); } } void int1() interrupt 2 using 2 { unchar k,m; k=0x01; for(m=0;m<40;m++) {P1=k; delay(); k=_crol_(k,1); } } 实验六 定时器实验 P1接8个LED灯,点动开关接P3.2 (INT0),负跳变产生中断。 编写程序实现如下功能: ① 主程序8只LED灯上电全灭。 ② INT0中断程序实现:按一次启动定时器T0,再按一次停止。停止后恢复到上电状态。 ③ 定时器T0实现:8个LED灯左点亮循环,每个点亮时间为1S。 (定时器分别用中断方式和查询方式实现。) 定时器初值计算:10000us=216-X*12/6 得X=ec78H 中断方式: #include #include EX0=1; EA=1; IT0=1; EX0=1; ET0=1; TR0=0; while(1);} void temer0() interrupt 1 {TH0=0xec; TL0=0x78; i--; if(i<=0) {P1=a; a=_cror_(a,1); i=100; } } void int0() interrupt 0 {TR0=~TR0; if(TR0==0) P1=0x00;} 查询方式: #include if(TF0) {TF0=0? TH0=0Xec; TL0=0X78; i--; if(i<=0) {P1=a; a=_cror_(a,1); i=100;} } } void int0() interrupt 0 {TR0=~TR0; if(TR0==0) P1=0x00;} 实验七 定时器计数器综合实验 P1接8个LED灯,P3.7接1个LED灯,点动开关接P3.2 (INT0),负跳变产生中断,P3.3 (INT1)用低电平触发中断。 编写程序实现如下功能: ① 主程序9只LED灯上电全灭。 ② INT0中断程序实现:按一次启动定时器T0,再按一次停止。停止后恢复到上电状态。 ③ INT1中断程序实现:按一次启动定时器T1,再按一次停止。停止后恢复到上电状态。 定时器T0实现:P3.7所接1个LED灯亮灭闪烁,亮灭时间各为1S。 计数器T1实现:记录由T1口所输入脉冲个数(P3.5输入下降沿),以二进制形式在P1口输出。 (提示:低电平触发及时恢复高电平,以免中断重入) (计数器输入为T1(P3.5)、T0(P3.4)外部脉冲;定时器为系统时钟12分频,内部脉冲(一个机器周期1us)) #include #include {TMOD=0X61;//(T1方式2.T0方式1)或2.TMOD=0X51;(T1.T0方式1) TH0=0Xec; TL0=0X78; TH1=0Xff;//或2.TH1=0X00; TL1=0Xff;//或2.TL1=0X00; P1=0X00; P3_7=0; EA=1; IT0=1; EX0=1; IT1=1; EX1=1; ET0=1; ET1=1; TR0=0; TR1=0; while(1);//或2.P1=TL1;} void temer0() interrupt 1 {TH0=0Xec; TL0=0X78; i--; if(i<=0) {P3_7=~P3_7; i=100;} } void int0() interrupt 0 {TR0=~TR0; if(TR0==0) P3_7=0;} void int1() interrupt 2 {TR1=~TR1; if(TR1==0) P1=0; } void temer1() interrupt 3 // 2.TMOD=0X51;删掉该段 {unsigned char b; TH1=0Xff; TL1=0Xff; b++; P1=b;} 实验八 双机串行通讯基础实验 通信要求:fosc=6M,波特率2400,(提示:通讯双方工作在方式1,定时器1工作在 方式2定时模式,计数初值设为:0xf3,SMOD=1。) 程序设计内容:要求内部RAM30H开始的16个字节内容用程序实现赋值0~15。用查询或中断方式实现将甲机内部RAM 30H开始的16个字节的内容发送到已机并存入内部RAM 40H开始的单元中,并同时从P1口输出。 为了观察发送过程,要求每发送一个数据使甲机的P1_0连接的指示灯LED0亮灭一次。(亮灭延时时间自定,但要求能明显观察到亮灭状态转换。) 温馨提示:在中断处理模式中数据发送和接收完毕后,程序执行while(1);语句,可在此处设置断点运行程序;或者执行一直让P1_0连接的LED0灯常亮的死循环程序;在查询模式下发送和接收完毕后最后执行while(1);语句,可在此处设置断点运行程序;或者执行一直让P1_0连接的LED0灯常亮的死循环程序;)。 实验连线:甲机的P1.0分别接LED0,乙机P1接LED0~LED7,甲机RXD接乙机TXD,甲机TXD接乙机RXD,两机共地。 #include #include data unsigned char buffer1[16] _at_ 0x30; unsigned char i,temp=0,j=0; sbit P1_0=P1^0; void delay() { unsigned char m,n; for(m=0;m<255;m++) for(n=0;n<255;n++); } void main() { for(i=0;i<16;i++) {buffer1[i]=i;} P1_0=0; TMOD=0X20; TH1=0xf3; TL1=0xf3; SCON=0X40; PCON=0X80; EA=1; ES=1; TR1=1; SBUF=buffer1[0]; while(1);} void serialtrp() interrupt 4 {TI=0; SBUF=buffer1[j]; delay(); P1_0=~P1_0; j++; if(j==16) j=0; } #include void serall0() interrupt 4 {RI=0; if(a==16) {ES=0; while(1);} else {DBYTE[Hong1]=SBUF; a++; P1=DBYTE[Hong1]; Hong1++;} } #include data unsigned char buffer1[16] _at_ 0x30; unsigned char i,temp=0,j=0; sbit P1_0=P1^0; void delay() { unsigned char m,n; for(m=0;m<255;m++) for(n=0;n<255;n++); } void main() { P1_0=0; TMOD=0X20; TH1=0xf3; TL1=0xf3; SCON=0X40; PCON=0X80; EA=1; ES=1; TR1=1; for(i=0;i<16;i++) {buffer1[i]=i;} SBUF=buffer1[0];//可省 while(1) { SBUF=buffer1[j]; delay(); P1_0=~P1_0; j++; if(j==16) j=0; while(TI==0); } } #include data unsigned char buffer[16] _at_ 0x30; void delay(uchar j) {uchar t; while (j--) {for (t=0;t<120;t++); } } void main() {uchar i,temp; TMOD=0X20; TH1=0Xf3; TL1=0xf3; SCON=0X40; PCON=0X80; TR1=1; P1_0=0; while(1) {for(i=0;i<16;i++) {buffer[i]=i; temp=buffer[i]; SBUF=temp; while(TI==0); TI=0; P1_0=1; delay(500); P1_0=0; delay(500); } } } #include for(i=0;i<16;i++) {while(RI==0); RI=0; DBYTE[Hong1]=SBUF; a++; P1=DBYTE[Hong1]; Hong1++;} while(1); } 实验九 串行通信综合实验 通信要求:fosc=6M,波特率2400,通讯双方工作在方式1,定时器1工作在方式2定时模式,计数初值设为:0xf3,SMOD=1。 1、甲机通过点动开关的动作触发INT0下降沿中断,在中断程序中以查询方式向乙机发送开关K0~K7的状态,设计发送程序和乙机接收程序(查询还是中断接收自定)。 实验连线:甲机P1口接K0~K7,点动开关接INT0;乙机P1口接LED0~LED7;甲机RXD接乙机TXD,甲机TXD接乙机RXD,两机共地。 2、甲机通过1s定时方式,在定时中断程序中以查询或中断方式向乙机发送P1口连接的开关K0~K7的状态,乙机通过查询或中断方式接收甲机的开关信号并送乙机的P1口连接的LED灯LED0~LED7上。 为了便于观察发送过程,要求甲机每发送一个数据使P2_0连接的指示灯LED0亮灭一次(亮灭延时时间自定,但要求能明显观察到亮灭状态转换)。设计发送程序和接收程序(查询还是中断接收自定)。 实验连线:甲机P1口接K0~K7,P2.0接LED0观察发送过程;乙机P1口接LED0~LED7;甲机RXD接乙机TXD,甲机TXD接乙机RXD,两机共地。 #include #include void delay(unsigned int i) { uchar j; for(;i>0;i--) for(j=0;j<125;j++); } void main() { TMOD=0x21; TH1=0xf3; TL1=0xf3; SCON=0x40; PCON=0x80; TR1=0; EA=1; EX0=1; IT0=1; P2_0=0; P1=0xff; while(1){;}} void int0(void) interrupt 0 using 0 { TR1=~ TR1; temp=P1; SBUF=temp; delay(500); P2_0=~P2_0; delay(500); while(TI==0); TI=0; } #include TMOD=0X21; TH0=0xec; TL0=0x78; TH1=0xf3; TL1=0xf3; SCON=0X40; PCON=0X80; EA=1; ET0=1; TR0=1; TR1=1; P1=0xff; P2_0=1; temp=P1; SBUF=temp; while(1); } void temer0() interrupt 1 { TH0=0xec; TL0=0x78; i--; if(i<=0) {temp=P1; SBUF=temp; while(TI==0); TI=0; P2_0=~P2_0; i=100;} } #include TMOD=0x20; TH1=0xf3; TL1=0xf3; SCON=0x50; PCON=0x80; TR1=1; P1=0; while(1) { while(RI==0); RI=0; temp=SBUF; P1=temp; }} 实验十 定时、记数、显示 设计一个带有控制功能的脉冲发生器/计数器系统,脉冲发生器发出周期为2秒的方波(提示:可由P1.0口输出,用发光二极管显示);被计数脉冲由T0口输入,所记录的脉冲数以十进制形式在数码管显示(至少应可记录256个脉冲);设两个按键,一个启动脉冲发生器,一个启动记数,(按一次启动,再按一次停止),不启动时,发光管灭,数码管显示学号。 #include #include uchar code seg1[]={0x06,0x7d,0x4f,0x4f,0x07,0x5b}; uchar code y2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(uint t) { uchar a; while(t--)for(a=0;a<200;a++); } void main() { uchar m,j; TMOD=0x15; TH1=0xec; TL1=0x78, TH0=0X00; TL0=0X00; EA=1; ET0=1; TR0=0; TR1=0; P0_1=0; IT0=1; ET1=1; EX0=1; IT1=1; EX1=1; while(1) {if(TR0==0) {j=0x40; for(i=0;i<6;i++) { j= _cror_ (j,1); P1=seg1[i]; P2=j; delay(1); } } if(TR0==1) {j=0x04; P1=y2[TL0/100]; P2=j; delay(1); j=0x02; P1=y2[(TL0%100)/10]; P2=j; delay(1); j=0x01; P1=y2[(TL0%100)%10]; P2=j; delay(1); } } } void int0() interrupt 0 { TR0=~TR0; } void int1() interrupt 2 { TR1=~TR1; if(TR1==0) P0_1=0; } void timer1() interrupt 3 { TH1=0xEC; TL1=0x78; i--; if(i==0) { P0_1=~P0_1; i=200; } } 实验十一、D/A转换实验 实验内容:假设0832工作在单缓冲方式 口地址为 0X8000。 根据P1.0~P1.1连接的K0~K1的状态,分别实现下述表格功能所要求的功能: K1 K0 波形输出 0 0 1 1 0 1 0 1 幅值从1V上升到4V的锯齿波 幅值从1V上升到4V的三角波 幅值从1V上升到4V的梯形波 幅值从1V和4V的方波 #include for(m=0;m<255;m++) for(n=0;n<255;n++); } void main() { uchar i,a; while(1) { P1=0xff; a=P1&0x03; switch(a) { case 0: { for(i=205;i>51;i--) DA0832=i; } break; case 1: { for(i=51;i<205;i++) DA0832=i; for(i=205;i>51;i--) DA0832=i; } break; case 2: { for(i=51;i<205;i++) DA0832=i; delay(); for(i=205;i>51;i--) DA0832=i; delay(); } break; case 3: { i=51; DA0832=i; delay(); i=205; DA0832=i; dalay(); } break; } } } 实验十二:A/D转换实验 1、IN0端连接电位器滑动端,分别设计查询和中断程序不断采集电位器输出的模拟电压值,将A/D转换的结果通过P1口连接的8个LED显示出来。 实验连线:CS0接0809片选端(地址为0x8000,P1.0~P1.7接LED0~LED7。在查询方式下P3.0接EOC,在中断方式下EOC通过反相器再接INT0即P3.2。 2、定时数据采集程序设计:用T0定时30秒采集一次IN0连接的模拟信号并送P1口连接的LED显示的程序 #include #include while(EOC==0); x=*ad; //OE=1; P1=x; } } #include {IN0=0;//启动转换,使START(内部和WR非相连)置1 while(EOC);//EOC为1,本句死循环;EOC为0,进行下句 while(!EOC);//EOC为0,本句死循环;EOC为1,进行下句;这两句共同构成EOC上升沿检测 t=IN0; P1=t; } } #include TMOD=0x01; TL0=0x3C; TH0=0xb0; P1=0x00; EA=1; ET0=1; TR0=1; while(1); } void temer0() interrupt 1 {uchar x; uchar xdata *ad; TL0=0x3c; TH0=0xb0; j--; if(j<=0) { ad=&IN0; *ad=0; while(EOC==0); x=*ad; P1=x; j=200; } } #include TMOD=0x01; TL0=0x3C; TH0=0xb0; P1=0x00; EA=1; ET0=1; TR0=1; while(1); } void temer0() interrupt 1 {uchar t; TL0=0x3c; TH0=0xb0; j--; if(j<=0) { IN0=0;//启动转换,使START(内部和WR非相连)置1 while(EOC);//EOC为1,本句死循环;EOC为0,进行下句 while(!EOC);//EOC为0,本句死循环;EOC为1,进行下句;这两句共同构成EOC上升沿检测 t=IN0; P1=t; j=200; } } #include uchar code y2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit EOC=P3^0; void delay(uint t) { uchar a; while(t--)for(a=0;a<200;a++); } void main() { uchar b,j; P1=0; while(1) {IN0=0;//启动转换,使START(内部和WR非相连)置1 while(EOC);//EOC为1,本句死循环;EOC为0,进行下句 while(!EOC);//EOC为0,本句死循环;EOC为1,进行下句;这两句共同构成EOC上升沿检测 b=IN0; j=0x04; P1=y2[b/100]; P2=j; delay(1); j=0x02; P1=y2[(b%100)/10]; P2=j; delay(1); j=0x01; P1=y2[(b%100)%10]; P2=j; delay(1); } } 因篇幅问题不能全部显示,请点此查看更多更全内容