单片机程序大全(三)
- 格式:doc
- 大小:38.00 KB
- 文档页数:4
单片机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后再开方,如果开方后的结果满足如下条件,即是结果。
单片机程序源代码第二章任务一:闪烁广告灯的设计利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。
#include<>#define uint unsigned int#define uchar unsigned charsbit LED1=P0^0;sbit LED2=P0^1;void delayms(uint ms){uint i;while(ms--){for(i=0;i<120;i++);}}void main(){while(1){LED1=0;LED2=1;delayms(500);LED1=1;LED2=0;delayms(500);}}任务二:流水广告灯的设计利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->D0,重复循环。
#include<>#include <>#define uint unsigned int#define uchar unsigned charuint i;uchar temp;uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void delayms(uint ms){while(ms--){ uint j;for(j=0;j<120;j++);}}void main(){while(1){P0=0xfe;while(P0!=0x7f){7f89c89c0f89c0a0f7f0f0f0f7f7f2L3f4f7f6f7fDelay==0) break;else{sound(&music[n]);n++ ;}}}void main(){init();while(1){if(key==0){delayms(5);play(table1);}SPEAKER=1;}}void inter() interrupt 1{TH0 = ReloadH;TL0 = ReloadL;SPEAKER = !SPEAKER; //音乐声频的半个波}(3)#include<>//头文件#define uint unsigned int#define uchar unsigned char//宏定义sbit beep=P1^0;//按键位声明void Beep() //“叮咚”子函数{uint i,j;for(i=300;i;i--)//持续时间{beep=~beep;for(j=240;j;j--);//频率}for(i=200;i;i--)//持续时间{beep=~beep;for(j=180;j;j--);//频率}}void init() //初始化子函数{EA=1; //打开总中断TMOD=0x05;//设置计数器0 工作方式1ET0=1; //打开计数器0中断TR0=1;//启动定时器0TH0=0xff;TL0=0xff;//计数器赋初值}void beep_interrupt() interrupt 1 //计数器0中断服务子程序{TH0=0xff;TL0=0xff;//计数器初值Beep();//调用“叮咚”子函数}void main()//主函数{init();//调用初始化函数while(1);//等待按键按下}任务七:速度可调流水灯控制假设单片机晶振频率为12MHz,单片机P0口外接8只LED,外接按键K1,外接按键K2。
独立按键#include<>#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,0x90,0x88,0 x83,0xc6,0xa1,0x86,0x8e};void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++) ,'0',0x0d,0x0a,0x00};sbit K1=P3^2; 592MHzTL1 = 0xfd;ES = 1; //开串口中断TR1 = 1; //允许定时器1工作EA = 1; //开总中断}void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++) //1ms基准延时程序{;}}}/*-------------------------------------------------------------*/ //串口发送一个字节void Uart_SendChar(unsigned char dat){SBUF = dat; //待发送的数据写入缓冲区while(!TI); //等待发送完成TI = 0; //清零发送标志位}/*-------------------------------------------------------------*/ //串口发送一个字符串void Uart_SendString(){ uchari=0;while(trdata[i]!=0x00){SBUF=trdata[i];while(!TI);TI=0;i++;}}/*-------------------------------------------------------------*/ //主函数void main(void){UART_Init(); //初始化串口while(1){if(K1==0){delay1ms(20);if(K1==0){Uart_SendString(); //发送数据while(!K1); //等待按键释放}}}}/*-------------------------------------------------------------*///串口接收中断函数void INT_UartRcv(void) interrupt 4{unsigned char Rcv = 0;if(RI) //查询接收标志位(有数据发送过来时置为1){RI = 0; //接收标志位清零Rcv = SBUF; //存储缓冲区的数据P0=SBUF;Uart_SendChar(Rcv); //让从计算机上传到单片机的数据,传回的计算机显示}}//用LED数码管显示计数器对T0的计数值#include<> //包含52单片机寄存器定义的头文件unsigned charTab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码表unsigned char x;sbit P34=P3^4;void delay1ms(unsigned int i){unsigned char j;while(i--){for(j=0;j<115;j++) //1ms基准延时程序{;}}}void Display(unsigned char x){P2=0xdf; //引脚输出低电平,DS6点亮P0=Tab[x/100]; //显示十位delay1ms(5);P2=0xbf; //引脚输出低电平,DS6点亮P0=Tab[x%100/10]; //显示十位delay1ms(5);P2=0x7f; //引脚输出低电平,DS7点亮P0=Tab[x%10]; //显示个位delay1ms(5);P2=0xff;}/*******************************************函数功能:主函数******************************************/void main(void){TMOD=0x06; // TMOD=0000 0110B,使用计数器T0的模式2EA=1; //开总中断ET0=1; //允许定时器T0的中断EX0=1; //允许外中断INT0IT0=1; //INT0为下负脉冲触发方式TR0=1; //启动T0TH0=TL0=256-1; //计数器T0高8位赋初值255while(1) //无限循环,不停地将TL0计数结果送P1口{//x=TL0;Display(x);}}//INT0终端函数void clear0() interrupt 0{ x=0;}//T0 计数器中断void Key_counter() interrupt 1{if(P34==0){delay1ms(20);if(P34==0){x=(x+1)%1000; //因为是3位数码管显示所以要把计的数控制在1000以内(000~999)}}}外中断字符查询#include <>#define uchar unsigned char#define uint unsigned intuchar code trdata[]={'R','I','C','H','M','C','U',0x0d,0x0a,0x00};void delay1ms(uint i){uchar j;while(i--){for(j=0;j<115;j++) //1ms基准延时程序{;}}}main(){uchar i;SCON= 0x40; //串口方式1不允许接收//SM0=0;//SM1=1;//REN=0;PCON=0x80; //SMOD=0TMOD= 0x20; //定时器1定时方式2 TH1= 0xff; // 57600波特率TL1= 0xff;TR1= 1; //启动定时器while(1){i=0;while(trdata[i]!=0x00){SBUF=trdata[i];while(!TI);TI=0;i++;}delay1ms(1000);}}。
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。
第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.用C51实现片内RAM的30H和31H地址单元中的数据相加,保存到32H单元中。
#include <absacc.h>#define a DBYTE[0x30]#define b DBYTE[0x31]#define c DBYTE[0x32]void main( ){c=a+b;}2.用C51语言实现给片内RAM的30H地址单元赋值为CDH(内存赋值)。
#include <absacc.h>#define a DBYTE[0x30]void main( ){a=0xCD;}3.编写程序,将单片机片外2000H为首地址的连续10个单元的内容,读入到片内RAM的40H~49H单元中。
#include <absacc.h>.void main( ){unsigned char i;for(i=0;1<10;i++){XBYTE[0x2000+i]=i;DBYTE[0x40+i]=XBYTE[0x2000+i];}}4.有符号数比较大小假设在片内RAM的30H单元中,储存的有符号数据是m,在片内RAM的30H 中存储的有符号数是n,比较这两个数的大小,并将较大的数保存在片内RAM的30H单元中,较小的数保存在片内RAM的31H单元中。
#incliude <absacc.h>#define m DBYTE[0x30]#define n DBYTE[0x31]#define a DBYTE[0x32]void main( ){m=-6;n=-5;if(m<n){a=m;m=n;n=a;}5.比较大小将片内RAM的30H~39H单元中的数据分别赋值成0~9,然后对其进行比较,将最大值存入片内3AH的单元中。
#include <absacc.h>void main( ){unsigned char i;for(i=0;i<10;i++)DBYTE[0x30+i]=i;DBYTE[0x3a]= DBYTE[0x30];for(i=0;i<10;i++)if(DBYTE[0x3a]<DBYTE[0x30+i])DBYTE[0x3a]=DBYTE[0x30+i];}6.ASCII码16进制数若一个十六进制数的ASCII码,存于片内RAM的30H单元,请把该ASCII码对应十六进制数,存于片内RAM的31H单元中。
单片机程序大全(以下是一个以“单片机程序大全”为题目的文章范例,依据题目性质并非一个合同或作文的格式。
请注意,这个范例只是为了明示写作格式的变化,并非提供一个实际的单片机程序大全。
)单片机程序大全本文将为大家提供一个全面的单片机程序大全,涵盖了各种常见的单片机应用。
希望本文能够对单片机程序的学习和实践有所帮助。
一、LED灯程序LED灯是一个常见的单片机实验项目。
以下是一个基本的LED灯闪烁程序的代码,使用C语言编写:```c#include <reg51.h>#define LED P0void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {LED = 0xFF; // 所有LED灯亮delay(1000); // 延时1秒LED = 0x00; // 所有LED灯灭delay(1000); // 延时1秒}}```二、温度监测程序单片机可以用于温度监测,以下是一个简单的温度监测程序的代码示例,使用C语言编写:```c#include <reg51.h>#define TEMP P1void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {if (TEMP > 30) {P0 = 0x01; // 温度过高,亮起警示灯 } else {P0 = 0x00; // 温度正常,灭掉警示灯 }delay(100); // 延时0.1秒}}```三、电机控制程序单片机常用于电机控制,以下是一个电机正反转控制程序的代码示例,使用C语言编写:```c#include <reg51.h>#define MOTOR P2void delay(int time) {int i, j;for (i = 0; i < time; i++) {for (j = 0; j < 10000; j++) {; // 空循环,用于延时}}}void main() {while (1) {MOTOR = 0x01; // 电机正转delay(1000); // 延时1秒MOTOR = 0x02; // 电机反转delay(1000); // 延时1秒}}```以上仅是三个简单的单片机程序示例,单片机的应用非常广泛,包括但不限于LED灯闪烁、温度监测、电机控制等。
1)设变量X存放于R2,函数值y存放在R3。
试按照下式的要求给y赋值。
设X,Y均为带符号数,编程计算。
1 X>0y = 0 X=0-1 X<0ORG 0000HLJMP MAINORG 0080HMAIN:MOV R0,#30HMOV 40H,#0MOV 41H,#0MOV 42H,#0MOV R2,#10LOOP:MOV A,@R0JNZ NEXT1INC 41HSJMP DONENEXT1:JB ACC.7,NEXT2INC 40HSJMP DONENEXT2:INC 42HDONE: INC R0DJNZ R2,LOOPSJMP $END 3)参考程序(单片机P1端口接8只LED,每次点亮一只,向左移动点亮,重复循环。
)ORG 0000HSTART: MOV R0, #8 ;设左移8次MOV A, #11111110B ;存入开始点亮灯位置LOOP: MOV P1, A ;传送到P1并输出ACALL DELAY ;调延时子程序RL A ;左移一位DJNZ R0, LOOP ;判断移动次数JMP START ;重新设定显示值DELAY: MOV R5,#50 ;延时子程序DLY1: MOV R6,#100DLY2: MOV R7,#100DJNZ R7,$DJNZ R6,DLY2DJNZ R5,DLY1RET ;子程序返回END ;程序结束1)采用中断和查询方式编程,利用单片机内部定时器/计数器T0定时50ms,工作于方式1,使连接到I/O口线上的LED状态发生一次反转,一直循环。
3)长时间定时程序设计:完成定时1秒I/O口线状态反转;P1口所接的LED轮流点亮,点亮时间50ms(若为2s呢?)3)参考程序;定时50ms信号反转CSEG AT 0000HLJMP START ;查询方式CSEG AT 4100HSTART: MOV TMOD,#_____MOV TH1,#______MOV TL1,#______SETB TR1WAIT:JBC TF1,NEXTSJMP WAITNEXT:CPL P1.____MOV TH1,#_____MOV TL1,#_____SJMP WAITEND 3)参考程序;用定时器延时60ms后,LED轮流点亮。
单片机程序大全(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`变量中。
51单片机程序全集(三)
很多人学习单片机可能就只是用开发板跑跑程序,如果只是这样学的话,那以后很难找到一份好的工作的。
一名合格的电子工程师不仅要会跑程序,更重要的是要懂硬件!所以学习单片机的朋友一定要注意软硬件的协调学习。
这里我建议在校的学生主动去找相关的老师,跟着老师后面做项目对你的学习会有非常大的益处。
跟老师混熟了便可以充分利用实验室的资源,例如示波器,信号发生器,万用表等等。
要知道对于大多数学生来讲这些器件现阶段是买不起的。
自己想做个实物时,也可以用实验室的元器件,省的为一两个电容电阻还要往电子市场跑。
不要羞于找老师,对于主动找他的学生,老师会很欢迎的。
当然前提是你要真的想学东西,而不是去打酱油就为了某个比赛的证书。
在实验室用实验箱多搭搭电路,找找那种特别的感觉。
比如可以去验证模电里的一些结论,要知道实践一次要比看10遍书都强。
当你搭个一两个月后你会突然发现你对那些只在书上见过的电容,电感,稳压管之类的器件了如指掌。
在这里向大推荐一款仿真软件“Multisim”,这款软件几乎可以仿真一切电力电子方面的内容。
没太多时间去实验室的同学用这款软件来验证一些理论也是不错的选择。
好的,今天先闲谈这么多,下面开始写程序。
程序1:不同频率闪烁多个led
/*-----------------------------------------------
文件名:IO口高低电平控
功能:点亮P1口的多个LED灯闪烁,以不同频率闪烁
通过程序了解如何控制端口的高低电平
说明:无
日期:2012-8-4
单片机交流QQ:1278088276
------------------------------------------------*/
#include<reg52.h> //包含头文件,不需要改动,
sbit LED0=P1^0; // 将P1^0取名为LED0,方便程序的编写与阅读
sbit LED1=P1^1; //同上
sbit LED2=P1^2; //同上
sbit LED3=P1^3; //同上
sbit LED4=P1^4; //同上
sbit LED5=P1^5; //同上
sbit LED6=P1^6; //同上
sbit LED7=P1^7; //同上
void Delay(unsigned int t); //函数声明,主函数中调用了该函数,而该函数又在
主函数的后面,所以这里的函数声明不可少
/*------------------------------------------------
函数名:main
功能:LED不同频率闪烁
说明:注意LED是共阴还是共阳
------------------------------------------------*/
void main (void)
{
unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255 while (1) //主循环
{
for(i=0;i<10;i++) //加入for循环,表明for循环大括号中
//的程序循环执行10次
{
LED0=0; //将P1.0口赋值0,对外输出低电平
LED2=1; //将P1.1口赋值1,对外输出高电平
LED4=0;
Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;
// Delay(t )括号中的t取不同值LED闪烁的频率就不同LED0=1; //将P1.0口赋值1,对外输出高电平
LED2=0;
LED4=1;
Delay(5000);
}
for(i=0;i<10;i++)
{
LED0=0; //将P1.0口赋值0,对外输出低电平
LED2=1;
LED4=0;
Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;
// Delay(t )括号中的t取不同值LED闪烁的频率就不同LED0=1; //将P1.0口赋值1,对外输出高电平
LED2=0;
LED4=1;
Delay(60000);
}
//主循环中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
函数名:Delay
功能:延时时间
说明:无
参数:t---这里的t是形参,具体大小有调用时括号里的值决定。
返回值:无
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
程序2:LED由右到左全部点亮
/*-----------------------------------------------
文件名:IO口高低电平控
功能:LED由右到左全部点亮
说明:这里是LED由右到左全部点亮,注意与流水灯的区别
日期:2012-8-4
单片机交流QQ:1278088276
------------------------------------------------*/
#include<reg52.h> //包含头文件,不需要改动
void Delay(unsigned int t); //函数声明
/*------------------------------------------------
函数名:main
功能:LED由右到左全部点亮
说明:注意LED是共阴还是共阳
------------------------------------------------*/
void main (void)
{
unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255 Delay(50000); //调用延时函数
P1=0xfe; //赋初始值,即点亮第一个LED
for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8
次,8次循环后,8个LED全被点亮
{
Delay(50000);
P1<<=1;
}
while (1) //主循环,里面是空操作
{
}
}
/*------------------------------------------------
函数名:Delay
功能:延时时间
说明:无
参数:t---这里的t是形参,具体大小有调用时括号里的值决定。
返回值:无
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
51单片机程序全集(一)地址:/view/405c23d3b14e852458fb5790.html 51单片机程序全集(二)地址:/view/addf7aeb0975f46527d3e154.html。