总结单片机程序大全.doc
单片机c语言实例程序300篇
单片机c语言实例程序300篇单片机C语言【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){inti,j,k;printf("\n");for(i=1;i<5;i++)/某以下为三重循环某/for(j=1;j<5;j++)for(k=1;k<5;k++){if(i!=k&&i!=j&&j!=k)/某确保i、j、k三位互不相同某/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main()单片机C语言{longinti;intbonu1,bonu2,bonu4,bonu6,bonu10,bonu;canf("%ld",&i);bonu1=100000某0.1;bonu2=bonu1+100000某0.75;bonu4=bonu2+200000某0.5;bonu6=bonu4+200000某0.3;bonu10=bonu6+400000某0.15;if(i<=100000)bonu=i某0.1;eleif(i<=200000)bonu=bonu1+(i-100000)某0.075;eleif(i<=400000)bonu=bonu2+(i-200000)某0.05;eleif(i<=600000)bonu=bonu4+(i-400000)某0.03;eleif(i<=1000000)bonu=bonu6+(i-600000)某0.015;elebonu=bonu10+(i-1000000)某0.01;printf("bonu=%d",bonu);}============================================================ ==【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
单片机指令大全
单片机指令大全- - 指令格式功能简述字节数周期一、数据传送类指令MOV A, Rn 寄存器送累加器 1 1MOV Rn,A 累加器送寄存器 1 1MOV A ,@Ri 内部RAM单元送累加器 1 1MOV @Ri ,A 累加器送内部RAM单元 1 1MOV A ,#data 立即数送累加器 2 1MOV A ,direct 直接寻址单元送累加器 2 1MOV direct ,A 累加器送直接寻址单元 2 1MOV Rn,#data 立即数送寄存器 2 1MOV direct ,#data 立即数送直接寻址单元 3 2MOV @Ri ,#data 立即数送内部RAM单元 2 1MOV direct ,Rn 寄存器送直接寻址单元 2 2MOV Rn ,direct 直接寻址单元送寄存器 2 2MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2 MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1XCH A ,@Ri 累加器与内部RAM单元交换 1 1 XCHD A ,direct 累加器与直接寻址单元交换 2 1XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1POP direct 栈顶弹出指令直接寻址单元 2 2PUSH direct 直接寻址单元压入栈顶 2 2二、算术运算类指令ADD A, Rn 累加器加寄存器 1 1ADD A,@Ri 累加器加内部RAM单元 1 1ADD A, direct 累加器加直接寻址单元 2 1ADD A, #data 累加器加立即数 2 1ADDC A, Rn 累加器加寄存器和进位标志 1 1ADDC A,@Ri 累加器加内部RAM单元和进位标志 1 1 ADDC A, #data 累加器加立即数和进位标志 2 1 ADDC A, direct 累加器加直接寻址单元和进位标志 2 1INC A 累加器加1 1 1INC Rn 寄存器加1 1 1INC direct 直接寻址单元加1 2 1INC @Ri 内部RAM单元加1 1 1INC DPTR 数据指针加1 1 2DA A 十进制调整 1 1SUBB A, Rn 累加器减寄存器和进位标志 1 1 SUBB A,@Ri 累加器减内部RAM单元和进位标志 1 1 SUBB A, #data 累加器减立即数和进位标志 2 1 SUBB A, direct 累加器减直接寻址单元和进位标志 2 1 DEC A 累加器减1 1 1DEC Rn 寄存器减1 1 1DEC @Ri 内部RAM单元减1 1 1DEC direct 直接寻址单元减1 2 1MUL AB 累加器乘寄存器B 1 4DIV AB 累加器除以寄存器B 1 4三、逻辑运算类指令ANL A, Rn 累加器与寄存器 1 1ANL A,@Ri 累加器与内部RAM单元 1 1ANL A, #data 累加器与立即数 2 1ANL A, direct 累加器与直接寻址单元 2 1ANL direct, A 直接寻址单元与累加器 2 1ANL direct, #data 直接寻址单元与立即数 3 1ORL A, Rn 累加器或寄存器 1 1ORL A,@Ri 累加器或内部RAM单元 1 1ORL A,#data 累加器或立即数 2 1 ORL A,direct 累加器或直接寻址单元 2 1 ORL direct, A 直接寻址单元或累加器 2 1 ORL direct, #data 直接寻址单元或立即数 3 1 XRL A, Rn 累加器异或寄存器 1 1XRL A,@Ri 累加器异或内部RAM单元 1 1 XRL A,#data 累加器异或立即数 2 1 XRL A,direct 累加器异或直接寻址单元 2 1 XRL direct, A 直接寻址单元异或累加器 2 1 XRL direct, #data 直接寻址单元异或立即数 3 2 RL A 累加器左循环移位 1 1RLC A 累加器连进位标志左循环移位 1 1 RR A 累加器右循环移位 1 1RRC A 累加器连进位标志右循环移位 1 1 CPL A 累加器取反 1 1CLR A 累加器清零 1 1四、控制转移类指令类ACCALL addr11 2KB范围内绝对调用 2 2 AJMP addr11 2KB范围内绝对转移 2 2 LCALL addr16 2KB范围内长调用 3 2 LJMP addr16 2KB范围内长转移 3 2 SJMP rel 相对短转移 2 2JMP @A+DPTR 相对长转移 1 2RET 子程序返回 1 2RET1 中断返回 1 2JZ rel 累加器为零转移 2 2JNZ rel 累加器非零转移 2 2CJNE A ,#data ,rel 累加器与立即数不等转移 3 2 CJNE A ,direct ,rel 累加器与直接寻址单元不等转移 3 2 CJNE Rn,#data ,rel 寄存器与立即数不等转移 3 2 CJNE @Ri ,#data,rel RAM单元与立即数不等转移 3 2 DJNZ Rn ,rel 寄存器减1不为零转移 2 2 DJNZ direct ,rel 直接寻址单元减1不为零转移 3 2 NOP 空操作 1 1五、布尔操作类指令MOV C, bit 直接寻址位送C 2 1MOV bit, C C送直接寻址位 2 1CLR C C清零 1 1CLR bit 直接寻址位清零 2 1CPL C C取反 1 1CPL bit 直接寻址位取反 2 1SETB C C置位 1 1SETB bit 直接寻址位置位 2 1ANL C, bit C逻辑与直接寻址位 2 2ANL C, /bit C逻辑与直接寻址位的反 2 2ORL C, bit C逻辑或直接寻址位 2 2ORL C, /bit C逻辑或直接寻址位的反 2 2JC rel C为1转移 2 2JNC rel C为零转移 2 2JB bit,rel 直接寻址位为1转移 3 2JNB bit,rel 直接寻址为0转移 3 2JBC bit,rel 直接寻址位为1转移并清该位 3 2单片机MCS-51系列指令快速记忆法随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、汽车电子、通信、智能仪器仪表)得到了广泛的应用。
单片机的各种程序
mov p1,#90h lcall DELAY lcall loop DELAY:MOV R3,#10 L3:MOV R4,#100 L2:MOV R5,#250 L1:DJNZ R5,L1 DJNZ R4,L2 DJNZ R3,L3 RET End 5.数码显示管 JS1 BIT P1.0 AJ1 BIT P1.1 DSPY EQU P2 ORG 0000H AJMP MAIN ORG 0040H MAIN: MOV SP,#7FH MOV 20H,#00H BEGIN: JNB JS1, JIA1 JB AJ1,DISP ACALL DE110M JB AJ1,DISP JNB AJ1,$ DEC 20H ANL 20H,#0FH AJMP DISP JIA1: ACALL DE110M JB JS1,DISP JNB JS1,$ JNC 20H ANL 20H,#0FH DISP: MOV A,20H ACALL SEG7 MOV DSPY,A
RL A SJMP SHIFT FLASH: MOV R2,0AH FLASH1:MOV P1,A LCALL DELAY MOV P1,#0FFH LCALL DELAY DJNZ R2,FLASH1 RET DELAY:MOV R5,#200 D1:MOV R6,#123 NOP DJNZ R6,$ DJNZ R5,D1 RET 4.数码显示管显示2015循环 org 0000h start: loop: mov p1,#0c0h lcall DELAY mov p1,#0f9h lcall DELAY mov p1,#0a4h lcall DELAY mov p1,#0b0h lcall DELAY mov p1,#99h lcall DELAY mov p1,#92h lcall DELAY mov p1,#82h lcall DELAY mov p1,#0f8h lcall DELAY mov p1,#80h lcall DELAY
单片机常见程序
org 00hmain: mov P0, #0ffh ;向P0端口锁存器写0FFH,准备输入mov a, P0 ;从P0口输入数据mov P1, a ;将数据传至P1口sjmp mainend2 单片机IO-2程序org 00hmov a, #1loop: mov P1, a ;将a的内容通过P1口输出call delay ;调延时子程序rl a ; a左移一位sjmp loopdelay: mov r0, #80h ;延时子程序delay1: mov r1, #00hdelay2: djnz r1, delay2djnz r0, delay1retend3 单片机LED点阵程序ORG 0HSTART: MOV P2,#0FFH ;阳极全部加高电平MOV A,#80H ;A初值为80H,为最左一列(第7列)阴极输出低电平准备? LOOP: MOV P1,A ;使一列阴极为低电平CALL DELAY ;延时RRC A ;A右移一位,为下一列阴极输出低电平作准备JNC LOOP ;八列未完转移?CLR CMOV P1,#0FFH ;阴极全部加低电平mov a,#80h ;为最上面一行输出高电平准备LOOP1: MOV P2,A ;使一行阳极极为高电平CALL DELAY ; 延时RRC A ; A右移一位,为下一行阳极输出高电平作准备JNC LOOP1 ; 八行未完转移?CLR CAJMP STARTDELAY: MOV R1,#0C8H ;延时子程序DEY0: MOV R0,#0HDEY1: DJNZ R0,DEY1DJNZ R1,DEY0RETEndORG 0H ;显示'年?START:MOV DPTR,#DA TA1 ;指向点阵代码首址MOV R2,#80H ;80H使第7列(最左一列)阴极为低电平??CLR CDISP: MOV A,#0MOVC A,@A+DPTR ;取一列代码MOV P2,A ;加至阳极MOV P1,R2 ;使一列阴极为低电平CALL DELAY ;延时INC DPTR ;指向下一列代码?MOV A,R2 ;R2右移一位,为下一列阴极输出低电平作准备RRC A ;MOV R2,A ;JNC DISP ;8列未完,转AJMP STARTDELAY: MOV R1,#0 ;延时子程序DELY0: DJNZ R1,DEL Y0RETDA TA1: DB 24H,44H,0DCH,54H,7FH,54H,54H,44H;年的点阵代码END5 报警程序ORG 0000HLJMP MAINORG 1BHJMP T1INT ;定时器1中断入口地址ORG 0100HMAIN: MOV SP,#60HANL TMOD,#0FH ;定时器1置为方式1ORL TMOD,#10HORL IE,#88H ;允许定时器1中断MAIN1: MOV DPTR,#TONE ;置TONE表首地址MOV A,#00H ;TONE表偏移量LOOP: MOVC A,@A+DPTR ;读TONE表中的TH1值JZ MAIN1 ;为0则转MAIN1,进入下一周期MOV TH1,A ;TONE表中的高字节送TH1和R5MOV R5,AINC DPTR ;从TONE表中读出TL1的值MOV A,#00HMOVC A,@A+DPTRMOV TL1,A ;TONE表中的低字节值送TL1和R6MOV R6,ASETB TR1 ;启动定时器1INC DPTRMOV A,#00HMOVC A,@A+DPTR ;从TONE表中取出音的时间MOV R2,ALOOP1: M OV R3,#80H ;延时LOOP2: M OV R4,#0FFHDJNZ R4,$DJNZ R3,LOOP2DJNZ R2,LOOP1INC DPTR ;TONE表地址加1,指向下一个音调MOV A,#00HJMP LOOPT1INT: CPL P1.2 ;取反得到一定频率的方波,使喇叭;发出一定音高的音调CLR TR1 ;停止定时器1计数MOV TH1,R5 ;重置定时器1时间常数MOV TL1,R6SETB TR1 ;恢复定时器1计数RETITONE: DB 0FCH,46H,04H,0FCH,0AEH,04H ;音调表DB 0FDH,0BH,04H,0FDH,34H,04HDB 0FDH,83H,04H,0FDH,0C8H,04HDB 0FEH,06H,04H,0FEH,22H,04HDB 0FEH,22H,04H,0FEH,06H,04HDB 0FDH,0C8H,04H,0FDH,83H,04HDB 0FDH,34H,04H,0FDH,0BH,04HDB 0FCH,0AEH,04H,0FCH,46H,0CHDB 00H,00H,00HEND6 查询式键盘0525ORG 0000HSTART: mov P1,#0FFH ;P1端口全部置01111 1111 MOV P2,#00HMOV A,P1jnb acc.7,START ;有无键按下,直接寻址为为零则转移ANL A,#3FH ;立即数与到累加器;0011 1111CJNE A,#3FH,S1 ;比较立即数和A,不等则转移到S1 AJMP STARTS1: call delay ;延时去抖动MOV A,P1jnb acc.7,STARTANL A,#3FHcjne A,#3Eh,S2 ;0键按下0011 1110mov A,#01H ;0000 0001mov P2,Acall delay1AJMP STARTS2: cjne A,#3DH,S3 ;1键按下0011 1101 mov A,#02H ;0000 0010mov P2,Acall delay1AJMP STARTS3: cjne A,#3BH,S4 ;2键按下0011 1011 mov A,#04H ;0000 0100mov P2,Acall delay1AJMP STARTS4: cjne A,#37H,S5 ;3键按下0011 0111 mov A,#08H ;0000 1000mov P2,Acall delay1AJMP STARTS5: cjne A,#2FH,S6 ;4键按下0010 1111 mov A,#10H ;0001 0000mov P2,Acall delay1AJMP STARTS6: cjne A,#1FH,S7 ;5键按下0001 1111 mov A,#20H ;0010 0000mov P2,Acall delay1S7: AJMP STARTDELAY: MOV R6,#10H;30H ;延时子程序DE0: mov R7,#10H;30HDE1: DJNZ R7,DE1DJNZ R6,DE0RETDELAY1: MOV R4,#0FFH ;延时子程序DE2: mov R5,#0FFHDE3: DJNZ R5,DE3DJNZ R4,DE2RETEND7 电子琴KEYBUF EQU 30HSTH0 EQU 31HSTL0 EQU 32HTEMP EQU 33HORG 00HLJMP STARTORG 0BHLJMP INT_T0START: MOV TMOD,#01HSETB ET0SETB EAWAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ACLR TR0NOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ACLR TR0NOKEY2:MOV P3,#0FFHCLR P3.6ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ACLR TR0NOKEY3:MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,AMOV A,KEYBUFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,@A+DPTR MOV STL0,AMOV TL0,ASETB TR0DK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ACLR TR0NOKEY4:LJMP W AITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETINT_T0:MOV TH0,STH0MOV TL0,STL0CPL P1.0RETITABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HTABLE1: DW 64021,64103,64260,64400DW 64524,64580,64684,64777DW 64820,64898,64968,65030DW 65058,65110,65157,65178END8 键盘ORG 0H ;翻转法键盘扫描显示?KB1: MOV P1,#0F0H ;列线输出低电平MOV A,P1 ;输入行线值CJNE A,#0F0H,KB2 ;若有键按下, 转KB2?AJMP KB1 ;若无键按下,转KB1KB2: MOV B,A ;保存键码的高四位ORL A,#0FH ;A高四位不变,低四位置1?MOV P1,A ;键码的高四位通过行线输出?MOV A,P1 ;输入列线值ANL A,#0FH ;屏蔽高四位ORL B,A ;键码的高四位与低四位合并MOV DPTR,#TAB ;DPTR 指向键码表首地址?MOV R3,#0 ;R3?作为键号计数器KB3: MOV A,R3MOVC A,@A+DPTR ;取键码CJNE A,B,NEXT ;所取键码与当前按键的键码不等转移?CALL DELAY ;延时20msCALL DISPLAY ;显示键号WAIT0: MOV P1,#0F0H ;以下3条指令为等待按键释放MOV A,P1CJNE A,#0F0H,W AIT0CALL DELAYAJMP KB1NEXT: INC R3 ;键号计数器加1AJMP KB3DELAY: MOV R0,#32H ;延时20msDELAY0: MOV R1,0C8HDELAY1: DJNZ R1,DELAY1DJNZ R0,DELAY0RET;显示子程序DISPLAY:MOV DPTR,#TAB1 ;DPTR指向段码表首址MOV A,R3MOVC A,@A+DPTR ;查段码表MOV SBUF,A ;输出段码RETTAB: DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH,0D7H DB 0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH ;0~F键码tab1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0~9 DB 88H,83H,0C6H,0A1H,86H,8EH ;a~f段码END9 交通灯制作SR EQU P1.0 ;南北红灯SY EQU P1.1 ;南北黄灯SG EQU P1.2 ;南北绿灯ER EQU P1.3 ;东西红灯EY EQU P1.4 ;东西黄灯EG EQU P1.5 ;东西绿灯ORG 00hST1: SETB SG ;南北方向绿灯亮CLR SYCLR SRCLR EGCLR EYSETB ER ;东西方向红灯亮MOV R3, #20 ;长延时CALL DELAYMOV R4, #8 ;南北方向绿灯闪4次ST2: CPL SG ;MOV R3, #2 ;短延时CALL DELAYDJNZ R4, ST2CLR SG ;南北方向绿灯灭SETB SY ;南北方向黄灯亮MOV R3, #20 ;延时CALL DELAYST3: CLR SY ;南北方向黄灯灭SETB SR ;南北方向红灯亮CLR ER ;东西方向红灯灭SETB EG ;东西方向绿灯亮MOV R3, #20 ;长延时CALL DELAYST4: MOV R4, #8 ;东西方向绿灯闪4次LP: CPL EGMOV R3, #2 ;短延时CALL DELAYDJNZ R4, LPCLR EG ;东西方向绿灯灭SETB EY ;东西方向黄灯亮MOV R3, #20 ;延时CALL DELAYSJMP ST1 ;转ST1DELAY: MOV R1, #0 ;延时子程序DELAY1: MOV R0, #0DELAY2: DJNZ R0, DELAY2DJNZ R1, DELAY1DJNZ R3, DELAYRETend10 矩阵键盘0518ORG 00H ;扫描法键盘扫描显示?CLR P3.3CLR P3.4KB1: MOV P2,#0FH ;行线输出低电平MOV A,P2 ;输入列线值CJNE A,#0FH,KB2 ;若有键按下,转KB2行扫??AJMP KB1 ;若无键按下,转KB1KB2: MOV B,#7FHKB22: MOV P2,BMOV A,P2ANL A,#0FHCJNE A,#0FH,KB3 ;此行有键按下, 转KB3MOV A,BRR AMOV B,AAJMP KB22KB3: ANL B,#0F0HORL B,AMOV R3,#0HMOV DPTR,#TABKB4: MOV A,R3MOVC A,@A+DPTR ;取键码CJNE A,B,NEXT ;所取键码与当前按键的键码不等转移?CALL DELAY ;延时20msCALL DISPLAY ;显示键号WAIT: MOV P2,#0F0H ;以下3条指令为等待按键释放MOV A,P2CJNE A,#0F0H,W AITCALL DELAYAJMP KB1NEXT: INC R3 ;键号计数器加1AJMP KB4DELAY: MOV R0,#05H ;延时20msDELAY0: MOV R1,0C8HDELAY1: DJNZ R1,DELAY1DJNZ R0,DELAY0RET;显示子程序DISPLAY:MOV DPTR,#TAB1 ;DPTR指向段码表首址MOV A,R3MOVC A,@A+DPTR ;查段码表SETB p3.3SETB p3.4MOV P1, A ;将段码送出RETTAB: DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH,0D7H DB 0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH ;0~F键码tab1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0~9 DB 77H,7CH,39H,5EH,79H,71H ;a~f段码END11 按键控制ORG 0000HSTART: MOV P1, #0FFHMOV P2, #00HMOV A, P1JNB ACC.7, STARTANL A, #3FHCJNE A, #3FH,S1AJMP STARTS1: CALL DELAYMOV A, P1JNB ACC.7, STARTANL A, #3FHCJNE A, #3FH,S2MOV A, #01HMOV P2, ACALL DELAY1AJMP STARTS2: CJNE A, #3DH,S3MOV A, #02HMOV P2,ACALL DELAY1AJMP STARTS3: CJNE A, #3BH,S4MOV A, #04HMOV P2, ACALL DELAY1AJMP STARTS4: CJNE A, #37H,S5MOV A, #08HMOV P2, ACALL DELAY1AJMP STARTS5: CJNE A, #2FH,S6MOV A,#10HMOV P2, ACALL DELAY1AJMP STARTS6: CJNE A, #1FH,S7MOV A, #20HMOV P2, ACALL DELAY1S7: AJMP STARTDELAY: MOV R6,#10H;30H DE0: MOV R7,#1OH;30HDE1: DJNZ R7,DE1DJNZ R6,DE0RETDELAY1: MOV R4,#0FFH DE2: MOV R5,#0FFHDE3: DJNZ R5,DE3DJNZ R4,DE2RETEND。
单片机程序汇总,大家参考一下剖析
第八章4节支持手打!!#include<reg51.h>#include <math.h>#define PI 3.1415unsigned int num;void main() {while (1) {for (num = 0 ; num < 360 ; num++)P2= 127 +127 * sin((float)num / 180 * PI);}}#include<absacc.h>#define DAC0832 XBYTE[0xfeff] //设置DAC0832的访问地址unsigned char num;void main() {while (1) {for (num = 0 ; num < 255 ; num++) //上升段波形DAC0832=num;for (num = 255 ; num > 0 ; num--) //下降段波形DAC0832=num;//DAC0832转换输出}}#include<absacc.h>#include<reg51.h>#define DAC1 XBYTE[0xfeff] //设置1#DAC0832输入锁存器的访问地址#define DAC2 XBYTE[0xfdff] //设置2#DAC0832输入锁存器的访问地址#define DAOUT XBYTE[0xefff] //两个DAC0832的DAC寄存器访问地址void main (void){unsigned char num; //需要转换的数据while(1){for(num =0; num <=255; num++){DAC1 = num; //上锯齿送入1#DACDAC2 = 255-num; //下锯齿送入2#DACDAOUT = num; //两路同时进行D/A转换输出}}}/*发送程序*/#include<reg51.h>#define uchar unsigned charchar code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'void delay(unsigned int time){unsigned int j = 0;for(;time>0;time--)for(j=0;j<125;j++);}void main(void){uchar counter=0; //定义计数器TMOD=0x20; //T1定时方式2TH1 = TL1 = 0xf4; //2400b/sPCON=0; //波特率不加倍SCON = 0x50; //串口方式1,TI和RI清零,允许接收;TR1=1; //启动T1while(1){SBUF = counter; //发送联络信号while(TI==0); //等待发送完成TI = 0; //清TI标志位while(RI==0); //等待乙机回答RI = 0;if(SBUF ==counter){ //若返回值与发送值相同,组织新数据P2 = map[counter]; //显示已发送值if(++counter>9) counter=0;//修正计数器值delay(500);}}}/*接收程序*/#include<reg51.h>#define uchar unsigned charchar code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'void main(void){uchar receiv; //定义接收缓冲TMOD=0x20; //T1定时方式2TH1=TL1=0xf4; //2400b/sPCON=0; //波特率不加倍SCON=0x50; //串口方式1,TI和RI清零,允许接收;TR1=1; //启动T1while(1){while(RI==1){ //等待接收完成RI = 0; //清RI标志位receiv = SBUF; //取得接收值SBUF = receiv; //结果返送主机while(TI==0); //等待发送结束TI = 0; //清TI标志位P2 = map[receiv];//显示接收值}}}第六章方式一。
单片机课程学习总结
《单片机》课程学习总结《单片机》这门课程我已经学了一个学期了,在这一个学期的学习过程中,我一开始不怎么懂得编程,但慢慢的我现在已经不仅会读程序还会写程序了。
真为自己一个学期来努力学到的单片机知识只是而感到高兴。
怎么学单片机?也常看到有人说学了好几个月可就是没有什么进展。
当然,受限于每个人受到的教育水平不同和个人理解能力的差异,学习起来会有快慢之分,但我感觉最重的就是学习方法。
一个好的学习方法,能让你事半功倍,这里说说我学习单片机的经历和方法。
我觉得学习单片机首先要懂得C语言,因为单片机大多说都是靠程序来实现的,如果看不懂程序或则不懂的编程是很难学会单片机的。
学习单片机首先要明白一个程序是怎么走的,要完全懂得程序每一个步骤的意思。
其次要懂得每一条指令的意思,不能盲目地去靠背指令,这是记得不牢靠的,最主要的还是靠了解。
学习单片机最主要的对89C51芯片内部结构有全方面的,只要了解了89C51才能知道单片机实现什么样的功能和作用,才能对单片机有更深一步的了解。
通过一个学期《单片机》这门课程的学习,我也从中有了不少心得和体会想和大家分享一下。
万事开头难、要勇敢迈出第一步。
开始的时候,不要老是给自己找借口,不要说单片机的程序全是英文,自己看不懂。
遇到困难要一件件攻克,不懂指令就要勤奋看书,不懂程序就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。
然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少。
然后建个程序,加入项目中,再写代码、编译、运行。
必须熟悉这一套工序。
个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。
单片机是注重理论和实践的,光看书不动手,是学不会的。
知识点用到才学,不用的暂时丢一边。
厚厚的一本书,看着人头都晕了,学了后面的,前面的估计也快忘光了,所以,最好结合实际程序,用到的时候才去看,不必说非要把书从第一页看起,看完它才来写程序。
单片机程序大全
第1题:i/o口,int0外部中断,停止继续ORG 0000HLJMP S TARTORG 0003HLJMP P INT0ORG 001BHLJMP P TI1START: MOV TMOD,#10HMOV SCON,#00HMOV TH1,#03CHMOV TL1,#0B0HMOV R4,#00HMOV R5,#10MOV DPTR,#TABSETB E ASETB E X0SETB I T0SETB E T1SETB T R1DISP: MOV A,R4MOV B,#10DIV ABMOVC A,@A+DPTRMOV SBUF,ALCALL DELAYJNB TI,$CLR TISETB P1.0CLR P1.1MOV A,BMOVC A,@A+DPTRMOV SBUF,ALCALL DELAYJNB TI,$CLR TISETB P1.1CLR P1.0LJMP D ISPPTI1: DJNZ R5,JIXUMOV R5,#10INC R4CJNE R4,#61,JIXUMOV R4,#0JIXU: MOV TH1,#03CHMOV TL1,#0B0HRETIPINT0:CPL TR1RETIDELAY:MOV R1,#200DJNZ R1,$RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H, 7FH,6FHEND外驱第2题:i/o口,延时0.5秒,0—ff Int0外部中断,停止继续ORG 0000HLJMP STARTORG 0003HLJMP INTV1ORG 001BHLJMP TIME1START:MOV TMOD,#10HMOV SCON,#00HSETB EX0SETB IT0SETB EAMOV TH1,#3CHMOV TL1,#0B0HSETB ET1SETB TR1SETB EAMOV R4,#0MOV R5,#10CLR P1.0CLR P1.1BBB:SETB P1.0MOV DPTR,#TABMOV A,R4ANL A,#0FHMOVC A,@A+DPTRMOV SBUF,ALCALL DELAYCLR P1.0SETB P1.1MOV A,R4SWAP AANL A,#0FHMOVC A,@A+DPTRMOV SBUF,ALCALL DELAYCLR P1.1SJMP BBBDELAY:MOV R3,#200DJNZ R3,$RET TIME1:DJNZ R5,AAAMOV R5,#10INC R4CJNE R4,#0FFH,AAAMOV R4,#00HAAA: MOV TH1,#3CHMOV TL1,#0B0HSETB TR1RETIINTV1:CPL TR1RETITAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND外驱第4题:定时器Ti工作在技术方式。
单片机的一些常用程序
单片机复习程序1、从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0 口的8 个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0 的值向左循环移动DelayMS(150);}}2、交通灯/* 名称:LED 模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5 次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5 此后变红灯,东西向变绿灯,如此重复。
*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0; //东西向灯sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3; //南北向灯sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//交通灯切换void Traffic_Light(){switch(Operation_Type){case 1: //东西向绿灯与南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case 2: //东西向黄灯闪烁,绿灯关闭DelayMS(300);YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁5 次Flash_Count=0;Operation_Type=3;break;case 3: //东西向红灯,南北向绿灯亮RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000);Operation_Type=4;break;case 4: //南北向黄灯闪烁5 次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1; if(++Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;}}//主程序void main(){while(1) Traffic_Light();}3、定时器控制交通指示灯/* 名称:定时器控制交通指示灯说明:东西向绿灯亮5s 后,黄灯闪烁,闪烁5 次亮红灯,红灯亮后,南北向由红灯变成绿灯,5s 后南北向黄灯闪烁,闪烁5 次后亮红灯,东西向绿灯亮,如此往复。
单片机程序
1、编程将片内 RAM30H 单元开始的15 B 的数据传递到片外 RAM3000H 开始的单元中去。
解: STRAT: MOV R0,#30HMOV R7,#0FHMOV DPTR,#3000HLOOP: MOV A,@R0MOVX@DPTR,AINC R0INC DPTRDJNZ R7,LOOP3、将内部 RAM 40H 开始的 10 个字节的数搬到外面RAM 2000H 处MOV DPTR,#2000HMOV R0,#40HMOV R2,#0AHLOOP:MOV A,@R0MOVX @DPTR,AINC R0INC DPTRDJNZ R2,LOOPSJMP$ENDRET2 、编程将片内 RAM 40H 单元中的内容送到片外RAM2000H 单元中。
解:ORG0100HMOV A, 40HMOV DPTR, #2000HMOVX @DPTR, AEND4、将存于外面 RAM 8000H 开始的 50H 数据传递 0010H 的地区,请编程实现。
MOV DPTR, #8000HMOV R0,#10HMOV R2,#50HLOOP: MOVX A, @DPTR;取数MOVX @R0,A;存数1NC DPTR1NC R0DJNZ R2, LOOPRET5.片内 RAM40H 开始的单元内有10B 二进制数,编程找出此中最大值并存于50H 单元中.解START: MOV R0,#40H;数据块首地点送 R0MOV R7,#09H;比较次数送R7MOV A,@R0;取数送ALOOP:INC R0MOV30H,@R0;取数送30 HCJNE A,30H,NEHT;( A)与( 30H)对比NEXT:JNC BIE1(A)≥ (30H)转 BIR1MOV A,30H;(A)< (30H),大数送 ABIE1:DJNZ R7,LOOP;比较次数减 1,不为 0,持续比较MOV50H,A;比较结束,大数送 50HRET6.片内 RAM30H 开始的单元中有 10B 的二进制数,请编程求它们之和(和<256 ).解ADDIO:MOV R0,30H ADD A,@R0MOV R7,#9DJNZ R7,LOOPMOV A,@R0MOV30H,A LOOP: INC R0RET7、设从内存BLOCK单元开始寄存一无符号数的数据块,其长度为LEN。
单片机程序大全(29页)
单片机程序大全(29页)在单片机程序设计领域,有许多常用的程序,可以用于各种不同的应用。
本文将为您介绍一些常见的单片机程序,并提供相应的代码示例。
这些程序将涵盖从基本的输入/输出操作到复杂的控制算法。
无论您是初学者还是有一定经验的开发人员,我们相信本文都会对您有所帮助。
I. LED控制程序LED控制程序是单片机程序设计的基础,也是许多初学者的入门项目。
下面是一个简单的LED控制程序示例:```c#include <reg51.h>void delay(unsigned int milliseconds) {unsigned int i, j;for(i = 0; i < milliseconds; i++) {for(j = 0; j < 1000; j++);}}void main() {while(1) {P1 = 0xFF; // 将P1口的所有引脚设置为高电平(点亮LED)delay(1000); // 延时1秒P1 = 0x00; // 将P1口的所有引脚设置为低电平(熄灭LED)delay(1000); // 延时1秒}}```上述程序通过控制单片机的I/O口,实现了LED的闪烁效果。
其中,`delay`函数用于延时一定的时间,通过循环等待的方式实现。
II. 温度传感器数据采集程序许多实际应用中,我们需要使用温度传感器来采集环境温度数据。
下面是一个简单的温度传感器数据采集程序示例:```c#include <reg51.h>unsigned char readTemperature() {unsigned char temperature;// 温度传感器数据采集代码...// 在此省略实际的数据采集操作,以及与温度传感器通信的代码 // 假设最终采集到的温度数据存储在temperature变量中return temperature;}void main() {unsigned char temperature;while(1) {temperature = readTemperature();// 对温度数据进行处理和显示的代码...// 在此省略实际的数据处理和显示操作,以及与显示设备通信的代码}}```上述程序通过`readTemperature`函数模拟温度传感器的数据采集,并将采集到的温度数据存储在`temperature`变量中。
100例单片机程序设计范例汇总(完全免费)
【实例 34】独立键盘控制.......................................................................................................... 43 【实例 35】矩阵式键盘控制...................................................................................................... 44 【实例 36】改进型 I/O 端口键盘................................................................................................46 【实例 37】PS/2 键盘的控制...................................................................................................... 49
【实例 1】使用累加器进行简单加法运算:................................................................................4 【实例 2】使用 B 寄存器进行简单乘法运算:........................................................................... 4 【实例 3】通过设置 RS1,RS0 选择工作寄存器区 1:.............................................................. 4 【实例 4】使用数据指针 DPTR 访问外部数据数据存储器:..................................................... 4 【实例 5】使用程序计数器 PC 查表:........................................................................................ 4 【实例 6】IF 语句实例:.............................................................................................................. 4 【实例 7】SWITCH-CASE 语句实例:............................................................................................. 4 【实例 8】FOR 语句实例:........................................................................................................... 4 【实例 9】WHILE 语句实例:....................................................................................................... 5 【实例 10】DO…WHILE 语句实例:............................................................................................. 5 【实例 11】语句形式调用实例:................................................................................................. 5 【实例 12】表达式形式调用实例:............................................................................................. 5 【实例 13】以函数的参数形式调用实例:..................................................................................5 【实例 14】函数的声明实例:.....................................................................................................5 【实例 15】函数递归调用的简单实例:..................................................................................... 5 【实例 16】数组的实例:............................................................................................................ 6 【实例 17】指针的实例:............................................................................................................ 6 【实例 18】数组与指针实例:.....................................................................................................6 【实例 19】P1 口控制直流电动机实例........................................................................................ 6
单片机的40个程序
名称:定时器0#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P1^2; //定义LED端口/*-----------------------定时器初始化子程序------------*/void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*--------主程序-----------*/main(){Init_Timer0();while(1);}/*--------- 定时器中断子程序--------*/void Timer0_isr(void) interrupt 1 using 1{TH0=0x00; //重新赋值TL0=0x00;LED=~LED; //指示灯反相,可以看到闪烁}/*---------- 名称:定时器1----*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P1^2; //定义LED端口/*---定时器初始化子程序----*/void TIM2Inital(void){RCAP2H = (65536-60000)/256;//晶振12M 10ms 16bit 自动重载RCAP2L = (65536-60000)%256;ET2=1; //打开定时器中断EA=1; //打开总中断TR2=1; //打开定时器开关}/*-----主程序---*/main(){TIM2Inital();while(1);}/*--------定时器中断子程序-----*/void TIM2(void) interrupt 5 using 1//定时器2中断{TF2=0;LED=~LED; //指示灯反相}名称:外部中断0电平触发#include<reg52.h>/*------主程序-*/main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX0=1; //外部中断0开IT0=0; //电平触发while(1){//在此添加其他程序}}/*---------外部中断程序--------*/void ISR_Key(void) interrupt 0 using 1{P1=~P1;}名称:外部中断1#include<reg52.h>main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX1=1; //外部中断0开IT1=1; //边沿触发,IT1=0表示电平触发while(1){//在此添加其他程序}}/*-------外部中断程序-*/void ISR_Key(void) interrupt 2 using 1{//在此处可以添加去抖动程序,防止按键抖动造成错误P1=~P1;}名称:遥控器红外解码LCD1602液晶显示#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的#include<stdio.h>#include<intrins.h>#define TURE 1#define FALSE 0sbit IR=P3^2; //红外接口标志sbit RS = P2^4;//Pin4sbit RW = P2^5;//Pin5sbit E = P2^6;//Pin6#define Data P0//数据端口unsigned int hour,minute,second,count;char code Tab[16]="0123456789ABCDEF";char data TimeNum[]=" ";char data Test1[]=" ";/* 变量声明*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4]; //处理后的红外码,分别是客户码,客户码,数据码,数据码反码unsigned char irdata[33]; //33个高低电平的时间数据/* 函数声明*/void Ir_work(void);void Ircordpro(void);void ShowString (unsigned char line,char *ptr);/* 定时器0中断服务函数*/void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++; //用于计数2个下降沿之间的时间}/* 外部中断0函数*/void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/* 定时器0初始化*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/* 外部中断初始化*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/* 红外键值处理*/void Ir_work(void) //红外键值散转程序{TimeNum[5] = Tab[IRcord[0]/16]; //处理客户码并显示TimeNum[6] = Tab[IRcord[0]%16];TimeNum[8] = Tab[IRcord[1]/16]; //处理客户码并显示TimeNum[9] = Tab[IRcord[1]%16];TimeNum[11] = Tab[IRcord[2]/16]; //处理数据码并显示TimeNum[12] = Tab[IRcord[2]%16];TimeNum[14] = Tab[IRcord[3]/16]; //处理数据反码并显示TimeNum[15] = Tab[IRcord[3]%16];ShowString(1,TimeNum);//显示处理过后的码值irpro_ok=0; //处理完成后清楚标志位}/* 红外解码函数处理*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差{value=value|0x80;}else{value=value;}if(j<8){value=value>>1;}k++;}IRcord[i]=value;value=0;} irpro_ok=1;//处理完毕标志位置1}/* 微秒延时函数*/void DelayUs(unsigned char us)//delay us{unsigned char uscnt;uscnt=us>>1;/* Crystal frequency in 12MHz*/while(--uscnt);}/* 毫秒函数声明*/void DelayMs(unsigned char ms)//delay Ms{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}/* 写入命令函数*/void WriteCommand(unsigned char c){DelayMs(5);//操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/*写入数据函数*/void WriteData(unsigned char c){DelayMs(5); //操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}/*写入字节函数*/void ShowChar(unsigned char pos,unsigned char c) {unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xc elsep=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//写命令WriteData (c); //写数据}/*写入字符串函数*/void ShowString (unsigned char line,char *ptr){unsigned char l,i;l=line<<4;for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符}/* 初始化函数*/void InitLcd(){DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}/*主函数*/void main(void){EX0init(); //初始化外部中断TIM0init();//初始化定时器InitLcd(); //初始化液晶DelayMs(15);sprintf(Test1," "); //显示第一行固定信息ShowString(0,Test1);sprintf(TimeNum,"Code ");//显示第二行固定信息ShowString(1,TimeNum);while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键显示对应的数字等{Ir_work();}}}/*-----------------------------------------------名称:遥控器红外解码数码管显示#include<reg52.h>#include<stdio.h>#include<intrins.h>#define TURE 1#define FALSE 0sbit IR=P3^2; //红外接口标志unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*变量声明*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];/* 函数声明*/void Delay(unsigned char mS);void Ir_work(void);void Ircordpro(void);/*定时器0中断服务函数*/void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++; //用于计数2个下降沿之间的时间}/*外部中断0函数*/void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/* 定时器0初始化*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/*外部中断初始化*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/*红外键值处理*/void Ir_work(void)//红外键值散转程序{switch(IRcord[2])//判断第三个数码值{case 0:P0=dofly[1];break;//1 显示相应的按键值case 1:P0=dofly[2];break;//2case 2:P0=dofly[3];break;//3case 3:P0=dofly[4];break;//4case 4:P0=dofly[5];break;//5case 5:P0=dofly[6];break;//6case 6:P0=dofly[7];break;//7case 7:P0=dofly[8];break;//8case 8:P0=dofly[9];break;//9}irpro_ok=0;//处理完成标志}/* 红外解码函数处理*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差{value=value|0x80;}else{value=value;}if(j<8){value=value>>1;}k++;}IRcord[i]=value;value=0;} irpro_ok=1;//处理完毕标志位置1}void main(void){EX0init(); //初始化外部中断TIM0init();//初始化定时器P2=0x00;//1位数码管全部显示while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}名称:与电脑串口通信内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源打开串口调试程序,将波特率设置为9600,无奇偶校验晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,在发送框输入hello,I Love MCU ,在接收框中同样可以看到相同字符,说明设置和通信正确#include<reg52.h> /void main (void){SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ES = 1; /*打开串口中断*/while (1) /*主循环不做任何动作*/{}}*/串口中断程序*/void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值P1=Temp; //把值输出到P1口,用于观察SBUF=Temp; //把接收到的值再发回电脑端}if(TI) //如果是发送标志位,清零TI=0;}/*-----------------------------------------------名称:红外收发内容:*红外测试程序,用单片机通过发射管发射38K的调制频率码,由一体化接收并解码由发光管显示。
单片机程序大全
独立按键#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit P27=P2^7;sbit K5=P1^4;sbit fmq=P3^6;uchar num;unsigned char code s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x 90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++) //1ms基准延时程序{;}}}void beep() //产生1KHZ频率声音的函数{fmq=0;delay500us();fmq=1;delay500us();}void delay500us(){unsigned char j;for(j=0;j<57;j++) //500us基准延时程序 {; }}void main(){ uchar t;P27=0;while(1){if(K5==0){delay1ms(15);if(K5==0){for(t=0;t<100;t++){ beep();}num=num+1;if(num==16){num=0;}while(!K5);//等待按键释放}}P0=s8[num];}}#include<reg52.h>#define uchar unsigned char //数据类型的宏定义#define uint unsigned int //数据类型的宏定义sbit P27=P2^7;unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0 x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};//共阳数码管显示字型码数组 1011 1111 "-"void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++); //1ms基准延时程序}}void display(unsigned char i){P27=0; //选通最有端的数码管显示P0=table[i]; //显示i参数传来的字型码}void main(void){unsigned char temp;display(16); //初始显示 "-"while(1){P1=0xff; //先向P1口写1;端口读状态P1=0xf0;temp=P1;if(temp!=0xf0){delay1ms(15);if(temp!=0xf0){P1=0xfe;temp=P1;switch(temp){case(0xee):display(0);break;case(0xde):display(1);break;case(0xbe):display(2);break;case(0x7e):display(3);break;}P1=0xfd;temp=P1;switch(temp){case(0xed):display(4);break;case(0xdd):display(5);break;case(0xbd):display(6);break;case(0x7d):display(7);break; }P1=0xfb;temp=P1;switch(temp){case(0xeb):display(8);break;case(0xdb):display(9);break;case(0xbb):display(10);break;case(0x7b):display(11);break;}P1=0xf7;temp=P1;switch(temp){case(0xe7):display(12);break;case(0xd7):display(13);break;case(0xb7):display(14);break;case(0x77):display(15);break;}}}}}/*行线接P1.0-P1.3,列线接P1.4-P1.7。
单片机典型实用程序
单片机典型实用程序一、灯类程序1. P1.7端口上的发光二极管不停闪烁程序完整的源程序如下:;******** 下面是主程序 ********MAIN: CLR P1.7 ; 主程序开始,P1.7输出低电平"0",让点亮发光二极管 ACALL DELAY; 调用延时子程序延时一段时间,让发光二极管亮一段时间 SETB P1.7; P1.7输出高电平"1",熄灭发光二极管ACALL DELAY; 调用延时子程序延时一段时间,让发光二极管熄灭一段时间 AJMP MAIN; 跳转到程序开头重复执行;******** 下面是延时子程序 ********DELAY: MOV R7,#255Y1: MOV R6,#255DJNZ R6,$DJNZ R7,Y1RET ;延时子程序返回END ;程序结束.流程图2. P1端口上的发光二极管左移或右移程序;----- 主程序开始 -----START: MOV ACC,#0FEH ;ACC 中先装入LED1亮的数据(二进制的11111110) MOV P1,ACC ;将ACC 的数据送P1口MOV R0,#7 ;将数据再移动7次就完成一个8位流水过程LOOP: RL A ;将ACC中的数据左移一位MOV P1,A ;把ACC移动过的数据送p1口显示ACALL DELAY ;调用延时子程序DJNZ R0,LOOP ;没有移动够7次继续移动AJMP START ;移动完7次后跳到开始重来,以达到循环流动效果;----- 延时子程序 -----DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束3. P1端口上的发光二极管实用的查表方式多功能流水灯程序;----- 主程序开始 -----ORG 0000H ;上电复位,程序从0000H开始执行START: MOV SP,#60H ;堆栈初始化为60HMOV DPTR,#LIU_TAB ;流水花样表首地址送DPTRLOOP: CLR AMOVC A,@A+DPTRCJNE A,#0FFH,SHOW ;检查流水结束标志AJMP START ;所有花样流完,则从头开始重复流SHOW: MOV P1,A ;将数据送到P1口ACALL DELAYINC DPTRAJMP LOOP;----- 延时子程序 -----DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回;----- 下面是流水花样数据表 -----LIU_TAB:DB 01111111B ;二进制表示的流水花样数据DB 10111111BDB 11011111BDB 11101111BDB 11110111BDB 11111011BDB 11111101BDB 11111110BDB 11111110BDB 11111101BDB 11111011BDB 11110111BDB 11101111BDB 11011111BDB 10111111BDB 01111111BDB 0FFH ;流水花样结束标志0FFHEND ;程序结束4交通红绿灯控制程序ORG 0000HAJMP STARTSTART: MOV SP,#60HMOV P0,#0FFHMOV P1,#0FFHMOV P2,#0FFHMOV P3,#0FFHMAIN: MOV P1,#10111101B ;主线亮绿灯10S,支线亮红灯10SLCALL YS10S ;延时10SMOV R2,#6 ;主线黄灯每秒闪烁1次,共闪6次,支线红灯依然亮AXHS: MOV P1,#10111011BLCALL YS500MXRL P1,#00000100BLCALL YS500MDJNZ R2,AXHSMOV P1,#11100111B ;支线亮绿灯10S,主线亮红灯10SLCALL YS10SMOV R2,#6 ;支线黄灯每秒闪烁1次,共闪6次,主线红灯依然亮BXHS: MOV P1,#11010111BLCALL YS500MXRL P1,#00100000BLCALL YS500MDJNZ R2,BXHSAJMP MAIN ;跳转到开始循环;******** 延时子程序 ********YS500M: MOV R3,#200 ;延时500MSY5_1: MOV R4,#10 ;[1]延时5MSY5_2: MOV R5,#228 ;[1]DJNZ R5,$ ;[2]DJNZ R4,Y5_2 ;[2]DJNZ R3,Y5_1 ;[2]RET ;[1]YS10S: MOV R7,#20 ;延时10SYS10_1: CALL YS500MDJNZ R7,YS10_1RETEND5. P3口两个输入开关来控制对应的P1口的8个LED的显示方式P3.5 P3.4 显示方式•0 0 全亮•0 1 交叉亮• 1 0 低4位连接的灯亮高4位灭• 1 1 低4位连接的灯灭高4位亮ORG 0000H•M OV P3, #00110000B ;使P3口锁存器相应位置位•M OV A, P3 ;读P3口相应引脚线信号•A NL A, #00110000B “逻辑与”操作…屏蔽掉无关位SWAP A;将相应位移位到低位•R L A ;循环左移一位,A*2→A•M OV DPTR, #TABLE ;转移指令表的基地址送数•据指针DPTR•J MP @A+DPTR ;散转指令ONE: MOV P1, #00H;第一种显示方式,S0接地,S1接地SJMP $TWO: MOV P1,#55H;第二种显示方式S0接+5 VS1接地SJMP $THREE:MOV P1,#0FH ;第三种显示方式,S0接地,S1接+5 VSJMP $FOUR:MOV P1,#0F0H;第四种显示方式S0接+5 V,S1接地SJMP $TABLE: AJMP ONE ;转移指令表AJMP TWO Array AJMP THREEA JMP FOUREND二、键盘控制类程序1.P3口按钮控制P1口灯亮MAIN: MOV P3,#0FFHLOOP: MOV A,P3MOV P1,ALJMP LOOPEND2. P3口按钮控制P1.0上的LED亮灭当K1按下开关时指示灯亮,再次按下时指示灯灭。
简单的单片机程序(C语言)
一、单片机第一个灯闪烁(1)#include<reg52.h>sbit d1=P1^0;unsigned int a;void main(){while(1){a=50000;d1=0;while(a--);a=50000;d1=1;while(a--);}}(2)子函数的调用#include<reg52.h>#define uint unsigned int#define uchar unsigned char sbit D1=P1^0;void delay();void main(){ while(1){D1=0;delay();D1=1;delay();}}void delay(){ uint x,y;for(x=100;x>0;x--)for(y=2000;y>0;y--) ; }void delay(uint z)(含参) {uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--)}连续闪烁#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp;void delay(uint);void main(){temp=0xfe;P1=temp;while(1){temp=_crol_(temp,1);delay(600);P1=temp;}}void delay(){uint x,y;for(x=100;x>0;x--)for(y=200;y>0;y--) ;}蜂鸣器响起#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;P1=temp;beep=0;while(1){temp=_crol_(temp,1);delay(600);......流水灯连续亮起每隔一秒#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp;void delay(uint z);void main(){temp=0xfe;P1=temp;while(1){delay(1000);temp=_crol_(temp ,1); //左移一位P1=temp;}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} //延时函数定时器中断流水灯亮、数码管两秒变数#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp,aa,num;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void delay(uint z);void main(){num=0;aa=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;temp=0xfe;P1=temp;dula=1;P0=table[0];dula=0;wela=1;P0=0xc0;wela=0;while(1){delay(1000);temp=_crol_(temp,1);P1=temp;/* if(aa==40){aa=0;num++;if(num==16)num=0;dula=1;P0=table[num];dula=0;} */}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==40){aa=0;num++;if(num==16)num=0;dula=1;P0=table[num];dula=0;}}数码管的流水显示#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp,aa,numdu,numwe;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};void delay(uint z);void main(){numdu=0;numwe=0;aa=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256; //50000代表1微秒乘50000=50毫秒EA=1;ET0=1;TR0=1;while(1){//delay(1000);// temp=_crol_(temp,1);// P1=temp;if(aa==20){aa=0;numdu++;if(numdu==7)numdu=1;dula=1;P0=table[numdu];dula=0;wela=1;P0=tablewe[numwe];wela=0;numwe++;if(numwe==6)numwe=0;}}}/*void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} */void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}两位数的分离写在两个数码管上例子12(应用子函数)#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar temp,numdu,shi,ge;void display(uchar shi,uchar ge);sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void delay(uint z);void main(){numdu=0;temp=12;shi=temp/10;ge=temp%10;while(1)display(shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar shi,uchar ge){dula=1;P0=table[shi];dula=0;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table[ge];dula=0;wela=1;P0=0xfe;wela=0;delay(5);}数码管动态显示从零隔一秒加一次#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};uchar temp,shi,ge,aa;void display(uchar shi,uchar ge);sbit dula=P2^6;sbit wela=P2^7;void init() ;void delay(uint z);void main(){init() ;while(1)if(aa==20)aa=0;temp++;if(temp==100){temp=0;}shi=temp/10;ge=temp%10;display(shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar shi,uchar ge) {dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table[ge];dula=0;wela=1;P0=0xfe;wela=0;delay(5);}void init(){wela=0;dula=0;temp=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}第四课练习3 #include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0,t1,bai,shi,ge,flag,flag1;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f ,0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71,0x36,0x76,0x38,0x3f,0};void display(uchar aa,uchar bb,ucharcc,uchar bai,uchar shi,uchar ge); uint shu;void init();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){init();while(1){if(flag1!=1)display(7,6,5,bai,shi,ge);elsedisplay(16,17,18,18,19,20);}}void init(){shu=432;temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器TH1=(65536-50000)/256;TL1=(65536-50000)%256;//T1定时器(500ms里不用)EA=1;//kai zong 中断ET0=1;ET1=1;TR0=1;// 定时器0打开TR1=1;// 定时器1打开}void timer0() interrupt 1 //定时器0的中断的中断函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0++;if(flag!=1){if(t0==10){t0=1;temp=_crol_(temp,1); //位移P1=temp;}}else{if(t0%4==0){P1=~P1;}if(t0==60){TR0=0;P1=0xff;flag1=1;}}}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t1++;if(t1==2){t1=0;shu--;bai=shu/100;shi=shu%100/10;ge=shu%10;if(shu==398){TR0=0;//控制流水灯关闭TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;flag=1;t0=0;P1=0xff;TR1=0;}}}void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) {dula=1;P0=table[aa];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[bb];dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[cc];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[bai];dula=0;wela=1;P0=0xf7;wela=0;delay(1);dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[ge];dula=0;wela=1;P0=0xdf;wela=0;delay(1);}利用定时器0以500MS速度进行流水灯从上至下移动#include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0;void init() ;void main(){init();while(1){}}void init(){temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器EA=1;//kai zong 中断ET0=1;TR0=1;// 定时器0打开}void timer0() interrupt 1 //定时器0的中断的中断函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0++;if(t0==10){t0=1;temp=_crol_(temp,1); //位移P1=temp;}} /* void init(),void timer0() interrupt 1利用定时器0以500MS速度进行流水灯从上至下移动*/利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数#include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0,t1,bai,shi,ge;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f ,0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void display(uchar aa,uchar bb,ucharcc,uchar bai,uchar shi,uchar ge);uint shu;void init();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){init();while(1){display(7,6,5,bai,shi,ge);}}void init(){shu=432;temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器TH1=(65536-50000)/256;TL1=(65536-50000)%256;//T1定时器(500ms里不用)EA=1;//kai zong 中断ET0=1;ET1=1;TR0=1;// 定时器0打开TR1=1;// 定时器1打开}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t1++;if(t1==2){t1=0;shu--;bai=shu/100;shi=shu%100/10;ge=shu%10;if(shu==398){TR0=0;//控制流水灯关闭TR1=0;}}}void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) {dula=1;P0=table[aa];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[bb];dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[cc];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[bai];dula=0;wela=1;P0=0xf7;wela=0;delay(1);dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[ge];dula=0;wela=1;P0=0xdf;wela=0;delay(1);}第五节/一、用键盘点亮第一个流水灯#include<reg52.h>sbit d1=P1^0;sbit key1=p3^4;void main(){P3=0xff;while(1){if(key1==0)d1=0;elsed1=1;}}或#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f ,0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71}; sbit d1=P1^0;sbit key1=P3^4;sbit dula=P2 ^6;sbit wela=P2^7;uchar num;void main(){wela=1;P0=0xfe;wela=0;P3=0xff;while(1){if(key1==0){d1=0;num++;if (num==10)num=0;}elsed1=1;dula=1;P0=table[num];dula=0;}} //用键盘点亮第一个流水灯按下16个矩阵键盘依次在数码管上显示0-15 #include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f ,0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71,0}; sbit dula=P2 ^6;sbit wela=P2^7;sbit key1=P3^4;uchar num,temp,num1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar keyscan();void main(){num= 17;dula=0;P0=0;dula=1;wela=1;P0=0xc0;wela=0;while(1){num1=keyscan();dula=1;P0=table[num1-1];dula=0;}}uchar keyscan(){P3=0xfe;//1temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xfd; //2temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xfb; //3temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xf7; //4temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14 ;break;case 0xb7:num=15 ;break;case 0x77:num=16;break;}while(1){temp=P3;temp=temp&0xf0;}}}return num;}。
13个简单的单片机程序
/************************************************************************ * LED闪烁的简单试验 * * * 连接方法: JP11(P2)和JP1用8PIN排线连接起 来 * * * ************************************************************************ #include <reg51.h> //此文件中定义了51的一些特殊功能寄存器
TH0=(65536-3000)/256; TL0=(65536-3000)%256; TR0=1; ET0=1; EA=1; cntb=0; while(1) {; } } //开启定时0 //开启中断
/************************************************* * * 定时中断 ********************************************************/ void t0(void) interrupt 1 using 0 { TH0=(65536-3000)/256; //定时器高位装载数据 TL0=(65536-3000)%256; //定时器低位装载数据 if(cntb<18) //红色 { P1=0xFF; P2=tab[cnta]; P0=digittab[cntb][cnta]; }
void delay(unsigned int i); //声明延时函数 main() { P2 = 0x00; //置P0口为低电平 delay(600); // 延时 P2 = 0xff; //置P0口为高电平 delay(600); // 延时
单片机程序汇总,大家参考一下
第八章4节支持手打!!#include<reg51.h>#include <math.h>#define PI 3.1415unsigned int num;void main() {while (1) {for (num = 0 ; num < 360 ; num++)P2= 127 +127 * sin((float)num / 180 * PI);}}#include<absacc.h>#define DAC0832 XBYTE[0xfeff] //设置DAC0832的访问地址unsigned char num;void main() {while (1) {for (num = 0 ; num < 255 ; num++) //上升段波形DAC0832=num;for (num = 255 ; num > 0 ; num--) //下降段波形DAC0832=num;//DAC0832转换输出}}#include<absacc.h>#include<reg51.h>#define DAC1 XBYTE[0xfeff] //设置1#DAC0832输入锁存器的访问地址#define DAC2 XBYTE[0xfdff] //设置2#DAC0832输入锁存器的访问地址#define DAOUT XBYTE[0xefff] //两个DAC0832的DAC寄存器访问地址void main (void){unsigned char num; //需要转换的数据while(1){for(num =0; num <=255; num++){DAC1 = num; //上锯齿送入1#DACDAC2 = 255-num; //下锯齿送入2#DACDAOUT = num; //两路同时进行D/A转换输出}}}/*发送程序*/#include<reg51.h>#define uchar unsigned charchar code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'void delay(unsigned int time){unsigned int j = 0;for(;time>0;time--)for(j=0;j<125;j++);}void main(void){uchar counter=0; //定义计数器TMOD=0x20; //T1定时方式2TH1 = TL1 = 0xf4; //2400b/sPCON=0; //波特率不加倍SCON = 0x50; //串口方式1,TI和RI清零,允许接收;TR1=1; //启动T1while(1){SBUF = counter; //发送联络信号while(TI==0); //等待发送完成TI = 0; //清TI标志位while(RI==0); //等待乙机回答RI = 0;if(SBUF ==counter){ //若返回值与发送值相同,组织新数据P2 = map[counter]; //显示已发送值if(++counter>9) counter=0;//修正计数器值delay(500);}}}/*接收程序*/#include<reg51.h>#define uchar unsigned charchar code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//'0'~'9'void main(void){uchar receiv; //定义接收缓冲TMOD=0x20; //T1定时方式2TH1=TL1=0xf4; //2400b/sPCON=0; //波特率不加倍SCON=0x50; //串口方式1,TI和RI清零,允许接收;TR1=1; //启动T1while(1){while(RI==1){ //等待接收完成RI = 0; //清RI标志位receiv = SBUF; //取得接收值SBUF = receiv; //结果返送主机while(TI==0); //等待发送结束TI = 0; //清TI标志位P2 = map[receiv];//显示接收值}}}第六章方式一。
单片机典型程序
1流水灯原理图程序1#include<reg52.h> void delay(int);void main(){while(1){P0=0xfe;delay(1000);P0=0xfd;delay(1000);P0=0xfb;delay(1000);P0=0xf7;delay(1000);P0=0xef;delay(1000);P0=0xdf;delay(1000);P0=0xbf;delay(1000);P0=0x7f;delay(1000);}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}程序2(库函数)#include<reg51.h>#include<intrins.h>#define N 400void delay(int);void main (){char a;a=0xfe;while(1){P0=a;delay(N);a=_crol_(a,1);delay(N);}}void delay(int c){int i,j;for(i=c;i>0;i--)for(j=100;j>0;j--);}程序3(数组)#include<reg52.h>void delay(int);int a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void main (){while(1){int m;for(m=0;m<8;m++){P0=a[m];delay(500);}}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}程序4(位移)include<reg51.h>#include<intrins.h>void delay(int);void main (){int m;while(1){char a=0xfe;P2=a;delay(400);a=a<<1;a=a+1;if(i++>6){a=0xfe;i=0;}}}void delay(int c){int i,j;for(i=c;i>0;i--)for(j=200;j>0;j--);程序5(前4亮后4灭)#include <reg51.h>#define SetTimeValue 500void DelayTime(int DelayValue) {int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1827;b++);}void main(){while(1){P0=0x0f;DelayTime(SetTimeValue);P0=0xf0;DelayTime(SetTimeValue);}2按键自加自减#include<reg51.h>int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbit key01=P3^4;sbit key02=P3^5;sbit wela=P2^7;sbit dula=P2^6;void delay(int z);void main(){ int i=0;while(1){P0=0;wela=1;wela=0;P0=a[i];dula=1;dula=0;if(i>9)i=0;if(key01==0){delay(5);if(key01==0)i++;while(key01==0);}if(key02==0){delay(5);if(key02==0){i--;if(i<0)i=9;}while(key02==0);}}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}3按键显示器void Display(int DisplayNumber) {P0=0;Seg_Position=1;Seg_Position=0;P0=Table[DisplayNumber];Seg_Code=1;Seg_Code=0;}void main(){int KeyValue=0;while(1){Display(KeyValue);if(key==0){DelayTime_10ms(2);if(key==0){KeyValue++;}while(key==0);}}}4矩阵按键#include <reg51.h>sbit Seg_Position=P2^7;sbit Seg_Code=P2^6;sbit key=P3^4;void DelayTime_10ms(unsigned int DelayValue) {unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1827;b++);}unsigned Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d}; void Display(int DisplayNumber){P0=0;Seg_Position=1;Seg_Position=0;P0=Table[DisplayNumber];Seg_Code=1;Seg_Code=0;}void main(){int KeyValue=5;unsigned char Temp=0;while(1){P3=0xfe;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xfe;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xe0:KeyValue=0;break;case 0xd0:KeyValue=1;break;}}}Display(KeyValue);}}5 6位数码管显示1-6#include <reg52.h> sbit dula=P2^6; sbit wela=P2^7; void delay(int); void main(){while(1){P0=0xfe;wela=1;wela=0;P0=0x06;dula=1;dula=0;delay(5);P0=0xfd;wela=1;wela=0;P0=0x5b;dula=1;dula=0;delay(5);P0=0xfb;wela=1;wela=0;P0=0x4f;dula=1;dula=0;delay(5);P0=0xf7;wela=1;wela=0;P0=0x66;dula=1;dula=0;delay(5);P0=0xef;wela=1;wela=0;P0=0x6d;dula=1;dula=0;delay(5);P0=0xdf;wela=1;wela=0;P0=0x7d;dula=1;dula=0;delay(5);}}void delay(int z) {int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}6,16键盘显示#include <reg51.h>sbit Seg_Position=P2^7;sbit Seg_Code=P2^6;sbit key=P3^4;void DelayTime_10ms(unsigned int DelayValue){unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1827;b++);}unsignedTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;void Display(int DisplayNumber){P0=0;Seg_Position=1;Seg_Position=0;P0=Table[DisplayNumber];Seg_Code=1;Seg_Code=0;}void main(){int KeyValue=15;unsigned char Temp=0;while(1){P3=0xfe;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xfe;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xe0:KeyValue=0;break;case 0xd0:KeyValue=1;break;case 0xb0:KeyValue=2;break;}}}Display(KeyValue);P3=0xfd;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xfd;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xe0:KeyValue=4;break;case 0xd0:KeyValue=5;break;case 0xb0:KeyValue=6;break;case 0x70:KeyValue=7;break;}}}Display(KeyValue);P3=0xfb;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xfb;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xd0:KeyValue=9;break;case 0xb0:KeyValue=10;break;case 0x70:KeyValue=11;break;}}}Display(KeyValue);P3=0xf7;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){DelayTime_10ms(2);P3=0xf7;Temp=P3;Temp=Temp&0xf0;if(Temp!=0xf0){switch(Temp){case 0xe0:KeyValue=12;break;case 0xd0:KeyValue=13;break;case 0xb0:KeyValue=14;break;case 0x70:KeyValue=15;break;}}}Display(KeyValue);}}7,共阳数码管1位#include<reg52.h>void delay(int);int a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void main(){int m;while(1){for(m=0;m<16;m++){P0=a[m];delay(500);}}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}8,共阳数码管2位#include<reg52.h>void delay(int);int a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int b[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void main(){int m,n;while(1){for(n=0;n<10;n++){P0=a[n];for(m=0;m<10;m++){P3=b[m];delay(500);}}}}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=100;j>0;j--);}9,定时器控制闪烁灯#include<reg52.h>void main(){TMOD=0x01;ET0=1;EA=1;TR0=1;TH0=65286/256;TL0=65286%256;while(1){;}}void INT() interrupt 1{TH0=65286/256;TL0=65286%256;P0=!P0;}10,计数器控制按键加1显示#include<reg52.h>int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit key01=P2^7;sbit key02=P2^6;sbit key=P3^4;int n=0;void main(){TMOD=0x05;ET0=1;EA=1;TR0=1;TH0=65535/256;TL0=65535%256;while(1){void Int1();P0=0;key01=1;key01=0;P0=a[n];key02=1;}}void INT() interrupt 1 {TH0=65535/256;TL0=65535%256;n++;}11,延时的闪烁灯#include<reg51.h>#include<intrins.h>#define N 400void delay(int);void main (){char a;a=0xfe;while(1){P0=a;delay(N);a=_crol_(a,1);delay(N);}}void delay(int c){int i,j;for(i=c;i>0;i--)for(j=100;j>0;j--);}12,脉冲4下灯亮#include<reg51.h>sbit led0=P0^0;void main(){TMOD=0x06;TH0=0;TL0=0;TR0=1;EA=1;ET0=1;while(1){led0=0;}}void Count_Timer0() interrupt 1 {led0=0;}13,用中断控制流水灯#include<reg51.h>#include<intrins.h>int num,aa;void main(){ TMOD=0X01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;aa=0xfe;P0=aa;while(1);}void t0_time() interrupt 1{ TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==20){num=0;aa=_crol_(aa,1);P0=aa;}}14,倒计时5分钟#include <reg51.h>sbit Seg_Position_Select=P2^7;sbit Seg_Code_Select=P2^6;unsigned char Display_One=0;unsigned char Display_Ten=0;unsigned char Second=0;unsigned char Minute=5;unsigned char Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;void DelayTime_10ms(unsigned int DelayValue){unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<182;b++);}void Display( ){unsigned char Dis_Second_High=0;unsigned char Dis_Second_Low=0 ;unsigned char Dis_Minute_High=0;unsigned char Dis_Minute_Low=0 ;Dis_Minute_High=Minute/10;Dis_Minute_Low=Minute%10;Dis_Second_Low=Second%10;Dis_Second_High=Second/10; P0=0xfe;Seg_Position_Select=1;Seg_Position_Select=0;P0=Table[Dis_Minute_High]; Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);P0=0xfd;Seg_Position_Select=1;Seg_Position_Select=0;P0=Table[Dis_Minute_Low]; Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);P0=0xFb;Seg_Position_Select=1;Seg_Position_Select=0;P0=0X40;Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);//////////////////////////////////P0=0xf7;Seg_Position_Select=1;Seg_Position_Select=0;P0=0X40;Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);P0=0xef;Seg_Position_Select=1;Seg_Position_Select=0;P0=Table[Dis_Second_High]; Seg_Code_Select=1;Seg_Code_Select=0; DelayTime_10ms(1);P0=0xdf;Seg_Position_Select=1;Seg_Position_Select=0;P0=Table[Dis_Second_Low]; Seg_Code_Select=1;Seg_Code_Select=0;DelayTime_10ms(1);}int Count=0;void main(){int i=0;TMOD=0x10;TH1=0x3c;TL1=0xb0;TR1=1;EA=1;ET1=1;while(1){Display();}}void Timer1_Irq() interrupt 3 {TH1=0x3c;TL1=0xb0;Count++;if(Count==20){Second--;if(Second==0xff){Second=59;if(Minute--==0){Second=Minute=0;}}Count=0;}}。
单片机程序集锦
4×4行列式键盘硬件电路图 × 行列式键盘硬件电路图
行列式(矩阵)键盘识别的常用方法有两种 行列式(矩阵)键盘识别的常用方法有两种: 列扫描法 线反转法
1) 列扫描法(逐列进行) 列扫描法(逐列进行) 行和列是人为认定的, 向某列线发出低电平信号 如该列线上所设置的 信号, 向某列线发出低电平 信号 如该 列线上所设置的 为此认定:通过上拉 键没有任何一个按下的话 的话, 键没有任何一个按下 的话 则 行线端口读回的是全 电阻接电源的口线对 应的是行线。 信号, 信号, “1”信号 否则,得到非全“1”信号,且为“0”位的 信号 否则,得到非全“ 信号 且为“ 位的 位置对应按键所在行的位置。 位置对应按键所在行的位置。 为防止多键同时按下, 为防止多键同时按下 往往从第 0 列一直扫描 到最后 1 列, 若只发现 1 个闭合键, 则为有效按键, 个闭合键 则为有效按键 否则,全部作废。 否则,全部作废。 找到闭合键后, 获取其键值, 找到闭合键后 获取其键值 据此转至该键对应的功能程 序。
//定义主函数 定义主函数 //定义字符型变量 用于控制循环和取数组元素 定义字符型变量i, 定义字符型变量 //循环取各数字字段码送 口显示 循环取各数字字段码送P0口显示 循环取各数字字段码送 //延时 延时
例5. 数码管动态显示原理与编程 数码管与单片机的接口方式有静态显示接口和 动态显示接口之分。 动态显示接口之分。 静态显示:静态显示接口是一个并行口接一个数码管, 静态显示 静态显示接口是一个并行口接一个数码管, 静态显示接口是一个并行口接一个数码管 优点是: 其优点是:被显示数据只要送入并行口后就不再需要 CPU干预,因而显示效果稳定。但该方法占用资源较 干预, 显示效果稳定。 干预 因而显示效果稳定 多 动态显示: 动态显示:动态显示接口是将所有数码管的个段码 线对应端并联起来分别接在8位并行口的对应口线上 位并行口的对应口线上, 线对应端并联起来分别接在 位并行口的对应口线上, 而每位数码管的公共端分别由另外一个口的不同I/O 而每位数码管的公共端分别由另外一个口的不同 线控制。 线控制。
单片机程序总结
write(table[2]);
write(table[3]);
write(table[4]);
delay_ms(10);
}}
-------------------------------------动态扫描数码显示实验----------------------------------------------”168168”--4----
for(;time>0;time--)
for(j=0;j<125;j++) ;
}
main()
{
while(1)
{
control=0;
delay(500);
control=1;
delay(500);
}
}
-------------------------
#include <reg51.h>
unsigned int i;
继电器的开合控制灯的亮灭。
-----------------------延时子程序方法------------------
#include<reg51.h>
unsigned char t;
sbit control=P1^0;
void delay(unsigned int time)
{
unsigned int j=0;
void delay(unsigned int z)
{
unsigned int j;
for(;z>0;z--)
for(j=0;j<10;j++);
}
main()
{
while(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
独立按键#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit P27=P2^7;sbit K5=P1^4;sbit fmq=P3^6;uchar num;unsigned char code s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x 90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++) //1ms基准延时程序{;}}}void beep() //产生1KHZ频率声音的函数{fmq=0;delay500us();fmq=1;delay500us();}void delay500us(){unsigned char j;for(j=0;j<57;j++) //500us基准延时程序 {; }}void main(){ uchar t;P27=0;while(1){if(K5==0){delay1ms(15);if(K5==0){for(t=0;t<100;t++){ beep();}num=num+1;if(num==16){num=0;}while(!K5);//等待按键释放}}P0=s8[num];}}#include<reg52.h>#define uchar unsigned char //数据类型的宏定义#define uint unsigned int //数据类型的宏定义sbit P27=P2^7;unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0 x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};//共阳数码管显示字型码数组 1011 1111 "-"void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++); //1ms基准延时程序}}void display(unsigned char i){P27=0; //选通最有端的数码管显示P0=table[i]; //显示i参数传来的字型码}void main(void){unsigned char temp;display(16); //初始显示 "-"while(1){P1=0xff; //先向P1口写1;端口读状态P1=0xf0;temp=P1;if(temp!=0xf0){delay1ms(15);if(temp!=0xf0){P1=0xfe;temp=P1;switch(temp){case(0xee):display(0);break;case(0xde):display(1);break;case(0xbe):display(2);break;case(0x7e):display(3);break;}P1=0xfd;temp=P1;switch(temp){case(0xed):display(4);break;case(0xdd):display(5);break;case(0xbd):display(6);break;case(0x7d):display(7);break; }P1=0xfb;temp=P1;switch(temp){case(0xeb):display(8);break;case(0xdb):display(9);break;case(0xbb):display(10);break;case(0x7b):display(11);break;}P1=0xf7;temp=P1;switch(temp){case(0xe7):display(12);break;case(0xd7):display(13);break;case(0xb7):display(14);break;case(0x77):display(15);break;}}}}}/*行线接P1.0-P1.3,列线接P1.4-P1.7。
根据线反转法扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。
开机时,数码管显示“-”。
*/#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit P27=P2^7;sbit fmq=P3^6;uchar key;unsigned char code disp_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};unsigned char code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++) //1ms基准延时程序{;}}}void delay500us(){unsigned char j;for(j=0;j<57;j++) //500us基准延时程序{ ;}}void beep() //产生1KHZ频率声音的函数{fmq=0;delay500us();fmq=1;delay500us();}/****************************************************** ****键盘扫描子函数******************************************************* ***/uchar keyscan(){uchar scan1,scan2,keycode,j;P1=0xf0;scan1=P1;if((scan1&0xf0)!=0xf0) //判键是否按下{delay1ms(20); //延时20msscan1=P1;if((scan1&0xf0)!=0xf0) //二次判键是否按下 {P1=0x0f; //线反转法的核心scan2=P1;keycode=scan1|scan2; //组合成键编码for(j=0;j<=15;j++){if(keycode== key_code[j]) //查表得键值{key=j;return(key);}}}}elseP1=0xff; //P1口写1 输入状态return (16);//"-"}main(){uchar tt;P0 = 0xbf;P27 =0; //数码管显示"-" P1 = 0xff;while(1){P1=0xf0;if((P1&0xf0)!=0xf0){keyscan();P0=disp_code[key];for(tt=0;tt<200;tt++){ beep();}fmq=1;delay1ms(200);}}}中断#include<reg52.h>#define uint unsigned int #define uchar unsigned char sbit dula=P2^6;sbit wela=P2^7;sbit d1=P1^0;uchar num;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(uint z);void main(){EA=1;//开总中断EX0=1;//开外部中断0//IT0=1;//TCON=0x01;wela=1;//11101010P0=0xea;wela=0;while(1){for(num=0;num<16;num++){d1=1;dula=1;P0=table[num];dula=0;delay(1000);}}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void exter0() interrupt 0 {d1=0;}定时器#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar aa,num;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void main(){num=0;aa=0;//TMOD=0X00;//设定定时器0为工作方式0 TMOD=0X01;//设定定时器0为工作方式1//TH0=(8192-5000)/32;//TL0=(8192-5000)%32;TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0 wela=1;P0=0x24;wela=0;dula=1;P0=0x3f;dula=0;while(1){if(aa==20){aa=0;num++;if(num==10)num=0;dula=1;P0=table[num];dula=0;}}}void timer0() interrupt 1{//TH0=(8192-5000)/32;//TL0=(8192-5000)%32;TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}中断控制LED//用定时器T0的中断控制1位LED闪烁#include<reg51.h> // 包含51单片机寄存器定义的头文件sbit D0=P0^0; //将D0位定义为P0.0引脚unsigned int i;/****************************************************** ********函数功能:主函数******************************************************* *******/void main(void)i=0;EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-50000)/256; //定时器T0的高8位赋初值TL0=(65536-50000)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0while(1);//无限循环等待中断}/****************************************************** ********函数功能:定时器T0的中断服务程序******************************************************* *******/void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{i=i+1;if(i==40){D0=~D0; //按位取反操作,将P0.0引脚输出电平取反 i=0;}TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值 }中断控制LED2#include<reg52.h> //包含52单片机寄存器定义的头文件/*******************************************函数功能:主函数******************************************/void main(void){EA=1; //开放总中断EX0=1; //允许使用外中断IT0=1; //选择负跳变来触发外中断P0=0xff; //关闭所有P0口的LED灯while(1); //无限循环,}/****************************************************** ********函数功能:外中断T0的中断服务程序******************************************************* *******/void it0(void) interrupt 0 using 0 //外中断0的中断编号为0{ P0=~P0; //每产生一次中断请求,P0取反一次。