1、广东海洋大学单片机实验全套广 东 海 洋 大 学单片机原理实验指导书实验一 发光二极管流水灯实验一、实验目的:1.通过AT89C51单片机控制8个发光二极管,八个发光二极管分别接在单片机的P0.0P0.7接口上,输出“0”时,发光二极管亮。开始时P0.0P0.1P0.7P0.6P0.0,实现亮点以1HZ频率循环移动。2.用PROTEUS 设计,仿真以AT89C51为核心的发光二极管流水灯实验装置。3.掌握发光二极管的控制方法。二、PROTEUS电路设计:三、实验仪器和设备PC机、PROTEUS软件或W-A-51综合开发学习板四、源程序设计:根据电路图自行编写并调试。#include#inclu
2、de #define GPIO_LED P0 void Delay10ms(unsigned int); void main(void) unsigned char n; GPIO_LED=0xfe;/1111_1110-1111_1101 while(1) for(n=0;n7;n+) GPIO_LED=_crol_(GPIO_LED,1); Delay10ms(50); for(n=0;n0;c-) for(b=38;b0;b-) for(a=130;a0;a-);实验二 开关控制LED数码管实验一、实验目的:1.通过AT89C51读入4位开关的输入状态(0F),并将其输出到数码管显示。2
3、.掌握LED数码管的静态显示。3.掌握I/O口的控制方法。二、PROTEUS电路设计:三、实验仪器和设备PC机、PROTEUS软件或W-A-51综合开发学习板四、源程序设计:根据电路图自行编写并调试。#includecharcodeshumaguan=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;main()while(1)switch(P2)case0xf0:P0=shumaguan0;break;case0xf1:P0=shumaguan1;break;case0xf2:P0=
4、shumaguan2;break;case0xf3:P0=shumaguan3;break;case0xf4:P0=shumaguan4;break;case0xf5:P0=shumaguan5;break;case0xf6:P0=shumaguan6;break;case0xf7:P0=shumaguan7;break;case0xf8:P0=shumaguan8;break;case0xf9:P0=shumaguan9;break;case0xfa:P0=shumaguan10;break;case0xfb:P0=shumaguan11;break;case0xfc:P0=shumagua
5、n12;break;case0xfd:P0=shumaguan13;break;case0xfe:P0=shumaguan14;break;case0xff:P0=shumaguan15;break;default:break;实验三 外中断优先级实验一、实验目的:1.理解单片机中断优先级和优先权。2.用PROTEUS 设计,仿真基于AT89C51单片机的中断优先级实验。3.掌握中断编程方法。单片机主程序控制P0口数码管循环显示08;外中断0、外中断1发生时分别在P2口、P1口依次显示08。通过实验可演示高优先级可中断低优先级,但低优先级的中断请求不能中断高优先级。二、PROTEUS电路设计:
6、三、实验仪器和设备PC机、PROTEUS软件或W-A-51综合开发学习板四、源程序设计:根据电路图自行编写并调试。ORG0000HLJMPMAINORG0003HLJMPINT00ORG0013HLJMPINT11ORG0100HMAIN:MOVSP,#30HSETBEX0SETBIT0ETBPX0SETBEX0SETBEX1SETBIT1SETBEX1CLRPX1SETBEAStartMOVR3,#09MOVR0,#0LOOP:MOVDPTR,#TABMOVA,R0MOVCA,A+DPTRMOVP0,AINCR0MOVR4,#5CC:MOVR2,#100BB:MOVR1,#200AA:NOP
7、NOPDJNZR1,AADJNZR2,BBDJNZR4,CCDJNZR3,LOOPSJMPSTARTINT00:PUSHACCPUSHPSWSETBRS0CLRRS1MOVR,#09MOVR0,#0LOO:MOVDPTR,#TABMOVA,R0MOVCA,A+DPTRMOVP2,AINCR0MOVR4,#5FF:MOVR2,#100EE:MOVR1,#200DD:NOPNOPDJNZR1,DDDJNZR2,EEDJNZR4,FFDJNZR3,LOOPOPPSWPOPACCRETIINT11:PUSHACCPUSHPSWSETBRS0SETBRS1MOVR3,#09MOVR0,#0LO:MOVD
8、PTR,#TABMOVA,R0MOVCA,A+DPTRMOVP1,AINCR0MOVR4,#5FG:MOVR2,#100EF:MOVR1,#200DF:NOPNOPDJNZR1,DFDJNZR2,EFDJNZR4,FGDJNZR3,LOPOPPSWPOPACCRETITAB:DB0X40,0XF9,0X24,0X30,0X19,0X12,0X02,0XF8,0X00实验四 60S倒计时实验一、实验目的:1.通过AT89C51的定时器实现60S倒计时,显示采用两位数码管动态显示。2.用PROTEUS 设计,仿真基于AT89C51单片机的60S倒计时实验。二、PROTEUS电路设计:三、实验仪器和
9、设备PC机、PROTEUS软件或W-A-51综合开发学习板四、源程序设计:根据电路图自行编写并调试。#include#defineucharunsignedchar#defineuintunsignedintuchartemp,bai,shi,ge,num;ucharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;voiddelay(uint);voidmain()temp=60;num=0;P2=0x00;TMOD=0x01;TH0=(65536-45872)/
10、256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;while(1)shi=temp/10;ge=temp%10;P0=tableshi;P2=0x02;delay(5);P0=tablege;P2=0x01;delay(5);voidT0_time()interrupt1TH0=(65536-45872)/256;TL0=(65536-45872)%256;num+;if(num=40)num=0;temp-;if(temp=0)temp=60;voiddelay(uintz)uintx,y;for(x=z;x0;x-)for(y=110;y0;y-);实验
11、五 A/D转换实验一、实验目的:1.掌握转换器ADC0809的使用。2.用PROTEUS 设计,仿真基于AT89C51单片机的A/D转换实验。3.通过改变电位器的值改变模拟量的输入,经转换为数字量在LED上显示,比对模拟量和数字量的关系。二、PROTEUS电路设计:三、实验仪器和设备PC机、PROTEUS软件或W-A-51综合开发学习板四、源程序设计:根据电路图自行编写并调试。ORG0000HAJMPSTARTORG0003HAJMPINTORG0100HSTART:MOVR0,#50HMOVXR0,ASETBIT0SETBEX0SETBEASETBF0CLRP2.0MOVDPTR,#TABL
12、OOP:JBF0,LOOP1SETBP3.4CLRP3.5MOVA,R6MOVP1,AACALLDLYCLRP3.4AJMPLHDLOOP1:SETBP3.5CLRP3.4MOVA,R7MOVP1,AACALLDLYCLRP3.5LHD:CPLF0AJMPLOOPINT:MOVXA,R0MOVR7,ASWAPAMOVR6,AMOVA,R7ANLA,#0FHMOVCA,A+DPTRMOVR7,AMOVA,R6ANLA,#0FHMOVCA,A+DPTRMOVR6,AMOVXR0,ARETIDLY:MOVR4,#0FHDL:MOVR5,#045HDL1:DJNZR5,DL1DJNZR4,DLRETT
13、AB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB80H,90H,88H,83H,0C6H,0A1H,86H,8EHEND综合性实验小型计算器的设计一、实验目的1.用单片机AT89C51实现一个小型计算器,可以实现两位数以内的算术运算及显示。2.通过P2口设计一个小型键盘44,键盘包括几个数字键0、1、2、4、5、6、7、8、9,以及功能键加,减,乘,除,等于,CLR(清除)。键盘输入和计算结果可通过P0口输出到数码管,并以动态显示。3.综合性实验内容包含一个44的键盘设计,以及两位数码管动态显示的设计方法。二、PROTEUS电路设计三、实验仪器和设备PC机
14、、PROTEUS软件或W-A-51综合开发学习板四、源程序设计:根据电路图自行编写并调试。#include sbit fou_bit = P10;sbit thi_bit = P11;sbit sec_bit = P12;sbit fir_bit = P13;unsigned char nixiecode216 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92, /无小数点 0x82,0xf8,0x80,0x98,0x88,0x83, 0xc6,0xa1,0x86,0x8e, ;void delay(unsigned int z) unsigned int x,y; for(x=
15、z;x0;x-) for(y=110;y0;y-);void display(unsigned int num) unsigned char thou, hun, ten, bits; thou = num/1000; hun = num%1000/100; ten = num%100/10; bits = num%10; /显示千位 fou_bit = 1; P0 = nixiecode0thou; delay(1); P0 = 0xff; fou_bit = 0; /显示百位 thi_bit = 1; P0 = nixiecode0hun; delay(1); P0 = 0xff; thi
16、_bit = 0; /显示十位 sec_bit = 1; P0 = nixiecode0ten; delay(1); P0 = 0xff; sec_bit = 0; /显示个位 fir_bit = 1; P0 = nixiecode0bits; delay(1); P0 = 0xff; fir_bit = 0;void main(void) unsigned char temp = 0, operaone, operatwo; unsigned int numone = 0, numtwo = 0, num = 0; P0 = 0xff; fou_bit = 0; thi_bit = 0; w
17、hile(1) P2 = 0xfe; switch(P2) case 0xee : if(temp 2) numone = numone*10 + 1; while(P2 = 0xee); num = numone; temp+; break; case 0xde : if(temp 2) numone = numone*10 + 2; while(P2 = 0xde); num = numone; temp+; break; case 0xbe : if(temp 2) numone = numone*10 + 3; while(P2 = 0xbe); num = numone; temp+
18、; break; case 0x7e : operaone = +; while(P2 = 0x7e); operatwo = operaone; num = numtwo = numone; numone = 0; temp = 0; break; P2 = 0xfd; switch(P2) case 0xed : if (temp 2) numone = numone*10 + 4; while(P2 = 0xed); num = numone; temp+; break; case 0xdd : if (temp 2) numone = numone*10 + 5; while(P2 =
19、 0xdd); num = numone; temp+; break; case 0xbd : if (temp 2) numone = numone*10 + 6; while(P2 = 0xbd); num = numone; temp+; break; case 0x7d : operaone = -; while(P2 = 0x7d); operatwo = operaone; num = numtwo = numone; numone = 0; temp = 0; break; P2 = 0xfb; switch(P2) case 0xeb : if (temp 2) numone
20、= numone*10 + 7; while(P2 = 0xeb); num = numone; temp+; break; case 0xdb : if (temp 2) numone = numone*10 + 8; while(P2 = 0xdb); num = numone; temp+; break; case 0xbb : if (temp 2) numone = numone*10 + 9; while(P2 = 0xbb); num = numone; temp+; break; case 0x7b : operaone = *; while(P2 = 0x7b); opera
21、two = operaone; num = numtwo = numone; numone = 0; temp = 0; break; P2 = 0xf7; switch(P2) case 0xe7 : if (temp 2) numone = numone*10 + 0; while(P2 = 0xe7); num = numone; temp+; break; case 0xb7 : operaone = =; while(P2 = 0xb7); break; case 0x77 : operaone = /; while(P2 = 0x77); operatwo = operaone;
22、num = numtwo = numone; numone = 0; temp = 0; break; if (P2 = 0xd7) delay(5); if (P2 = 0xd7) numone = 0; numtwo = 0; num = 0; operaone = 0; operatwo = 0; temp = 0; while(P2 = 0xd7); if (operaone = =) switch(operatwo) case +: num = numone + numtwo; break; case -: num = numtwo - numone; break; case *: num = numone * numtwo; break; case /: num = numtwo / numone; break; display(num);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1