51单片机程序 上师大 单片机课程
- 格式:doc
- 大小:91.00 KB
- 文档页数:9
1、LED闪烁C语言:#include <REG51.H>sbit LED=P1^0;#define uint unsigned int#define uchar unsigned char void Delay (unsigned int ms) {uchar t;while(ms--)for(t=0;t<123;t++);}void main(){while(1){LED=0;Delay (500);LED=1;Delay(500);}}汇编:ORG 0000HJMP STARTORG 0030H START:MOV P1,#0MOV R2,#5CALL DELAYMSMOV P1,#1MOV R2,#5CALL DELAYMSJMP STARTDELAYMS:MOV R0,#100 LOOP1: MOV R1,#248DJNZ R1,$DJNZ R0,LOOP1DJNZ R2,DELAYMSRETEND 2、八位流水灯#include <REG51.H>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid Delayms(uint ms){uchar t;while(ms--) for(t=0;t<123;t++);}void main(){P1=0xFE;while(1){P1=_crol_(P1,1);//左循环P1Delayms(200);}}3、十六位流水灯#include <REG51.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint ms){uchar twhile(--ms)for(t=0;t<123;t++);}void main(){ uint i;while(1){P0=0xFE;P1=0xFF;delay(25);for(i=0;i<7;i++){P0=_crol_(P0,1); //左移delay(25);}P0=0xFF;P1=0x7F;delay(25);for(i=0;i<7;i++){P1=_cror_(P1,1); //右移delay(25);}}4、一位数码管#include <REG51.H>#define uchar unsigned char#define uint unsigned int#define D P1uchar code Duan_code[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极(CA)void delay(uint ms){uchar t;while(ms--)for(t=0;t<123;t++);}void main(){ uchar i=0;D=0xFF;while(1){D=Duan_code[i];i=(i+1)%10;delay(300);}}}5、八位数码管#include <REG51.H>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define Duan P0#define Wei P2uchar code Dc[]= //共阳极(CA){0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay(uint ms){uchar t;while(ms--)for(t=0;t<123;t++);}void main(){uchar j,i,k=0xFE;Wei=0xFF;while(1){for(j=0;j<30;j++) //刷新30次for(i=8;i>0;i--) //移位显示开始{Duan=Dc[i];Wei=k;k=_crol_(k,1); //左移一位delay(3); //每次移位显示3ms}}Wei=0xFF;delay(700);}}6、开关控制LED灯#include<reg51.h>#define uchar unsigned char#define uint unsigned int//以下部分为位定义sbit LED0=P0^0;sbit LED1=P0^1;sbit LED2=P0^2;sbit LED3=P0^3;sbit B0=P1^0; sbit B1=P1^1;sbit B2=P1^2;sbit B3=P1^3;void delay(uint ms){uchar i;while(ms--)for(i=0;i<123;i++);}void main(){P0=0xFF;P1=0xFF;while(1){LED0=B0;LED1=B1;//按键0和1按下灯亮,松开灯灭if(B2==0){delay(20);//延时20ms防止按键抖动if(B2==0){while(B2==0){;//一直按下时执行空操作}LED2=~LED2; //松开后灯取反}}//以下与B2的程序意义相同if(B3==0){ delay(20);if(B3==0){while(B3==0);LED3=~LED3;}}}}7、开关分组控制LED要求:K1按下时递增点亮LEDK2控制低四位K3控制高四位K4清零,灯全灭#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit K1=P1^4;sbit K2=P1^5;sbit K3=P1^6;sbit K4=P1^7;sbit L1=P0^0;sbit L2=P0^1;sbit L3=P0^2;sbit L4=P0^3;sbit L5=P0^4;sbit L6=P0^5;sbit L7=P0^6;sbit L8=P0^7;void delay(uchar ms){uchar i;while(ms--)for(i=0;i<123;i++);}uchar code LED_A[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xFF};//流水灯状态表uchar code LED_B[]={0xF0,0x0F};uchar code LED_C[]={0x0F,0xF0};//分组控制所需void main(){uint a=0,i=0,j=0;P0=0xFF;P1=0xFF;while(1){if(K1==0){delay(20);if(K1==0){while(K1==0);if(a==9){a=0;}P0=LED_A[a];a++;}//k1按下后逐次点亮LED}if(K2==0){a=0;delay(20);if(K2==0){while(K2==0);if(i==0)P0=P0&LED_B[i];//高四位不变,低四位置0(亮)elseP0=P0|LED_B[i];//高四位不变,低四位置1(灭)i=!i; // i取反}}if(K3==0){a=0;delay(20);if(K3==0){while(K3==0);if(j==0)P0=P0&LED_C[j];//低四位不变,高四位置0(亮)elseP0=P0|LED_C[j];//低四位不变,高四位置1(灭)j=!j;}}if(K4==0){delay(20);if(K4==0);{while(K4==0);P0=0xFF;a=0;i=0;j=0;} //K4用于清零}}}8、4*4按键控制扫描法:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit Wei8=P2^7;uchar code Duan_Code[]={0xC0,0xF9,0xA4,0xB0,//共阳极0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF};void delay(uint x){uchar t;while(x--) for(t=0;t<123;t++);}void Display(uchar num){P0=Duan_Code[num];Wei8=0;}void main(){uchar Temp;Display(16);while(1){P1=0xFF;P1=0xF0;Temp=P1;if(Temp!=0xF0){delay(20);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; }}}}}线反转法:#include<reg51.h>#define uchar unsigned char #define uint unsigned int sbit Wei8=P2^7;uchar Key_Num;uchar code Duan_Code[]={0xC0,0xF9,0xA4,0xB0, //共阳极0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF}; uchar code Key_Code[]={0xEE,0xDE,0xBE,0x7E,0xED,0xDD,0xBD,0x7D,0xEB,0xDB,0xBB,0x7B,0xE7,0xD7,0xB7,0x77};void delay(uint x){uchar t;while(x--) for(t=0;t<123;t++); }void Display(uchar num){P0=Duan_Code[num];Wei8=0;}uchar Key_Scan(){ uchar k1,k2,k,i;P1=0xF0;//初始扫描横向(纵向)k1=P1;if((k1&0xF0)!=0xF0){delay(20);k1=P1;if((k1&0xF0)!=0xF0){P1=0x0F;//线反转后扫描纵向(横向)k2=P1;k=k1|k2;for(i=0;i<16;i++){if(k==Key_Code[i]){Key_Num=i;return (Key_Num);}}}elseP1=0xFF;return(16);//无按键按下时显示“-”}}void main(){P0=0xBF;Wei8=0;P1=0xFF;while(1){P1=0xF0;if((P1&0xF0)!=0xF0){Key_Scan();P0=Duan_Code[Key_Num];Wei8=0;}}}9、定时器中断控制LED定时器:有T1和T0两个定时器,由TMOD控制如TMOD=0000 0001高四位为定时器1,低四位为定时器0。