写一写学习51之后总结得基本知识吧,单片机多练习多体会才能有进步,要不啥也得不到;
//先写一下我定义的引脚和用到的函数,虽然没啥用 #include <REGX52.H> #include<intrins.h> //定义LED灯 sbit led1=P1^0; sbit led2=P1^1; sbit led3=P1^2; sbit led4=P1^3; sbit led5=P1^4; sbit led6=P1^5; sbit led7=P1^6; sbit led8=P1^7; // //定义数码管 sbit W1 = P1^0; sbit W2 = P1^1; sbit W3 = P1^2; sbit W4 = P1^3; //定义蜂鸣器 sbit FM=P0^7; //定义按键 sbit K1=P3^3; sbit K2=P3^4; sbit K3=P3^5; sbit K4=P3^6; //定义软件延时函数 void delay(unsigned int x) { int a; int b; for(a=x;a>0;a--) for(b=110;b>0;b--); }
下面的话就是几个比较简单的程序,基本没有什么难度,记得把注释符号去掉
// 简单的点灯 // int main(void) // { // P1=0xfe; // while(1) // { // P1=_cror_(P1,1); // delay(100); // } // return 0; // } // 数码管静态显示521 //void main() //{ //unsigned int a; //W4=W1=W2=W3=0; //打开所有数码管 //while(1) //{ //P0=0x92; //delay(500); //P0=0xa4; //delay(500); //P0=0xf9; //delay(500); //} //}
//数码管静态显示 1-9 //unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // //int main() //{ //int a; // //W4=W1=W2=W3=0; //打开所有数码管 // while(1) // { // P0=table[a]; // delay(600); // if(a<9) // { // a++; // } // else // { // a=0; // } // } //return 0; //} //数码管动态显示5201314 // unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // //int main() //{ // ////W4=W1=W2=W3=0; //打开所有数码管 // while(1) // { // P0=table[5]; // W1=0; // delay(80); // W1=1; // // P0=table[2]; // W2=0; // delay(80); // W2=1; // // P0=table[0]; // W3=0; // delay(80); // W3=1; // // P0=table[1]; // W4=0; // delay(800); // W4=1; // // P0=table[0]; // W3=0; // delay(80); // W3=1; // // P0=table[2]; // W2=0; // delay(80); // W2=1; // } //return 0; //} //蜂鸣器 //int main() //{ // //while(1) //{ // // FM=0; // delay(3000); // FM=~FM; // delay(3000); //} //return 0; //} //基本按键的使用 // int main() // { // while(1) // { //if(K1==0) //{ //delay(10); //if(K1==0) //{ //led1=0; //} //} // // if(K2==0) //{ //delay(10); //if(K2==0) //{ //led2=0; //} //} // //if(K3==0) //{ //delay(10); //if(K3==0) //{ //led3=0; //} //} // //if(K4==0) //{ //delay(10); //if(K4==0) //{ //led4=0; //} //} // else // { // P1=0xff; // } // } // }
中断 定时器 通信得话就比较重要了,得自习看看了
// 简单的中断 /*我用的这个单片机得K1按键可以触发中断*/ // int main() // { // // EA=1; // 全局中断打开 // EX1=1; //外部中断1 打开 // IT1=0; //低电平触发 // P1=0xB7; // while(1) // { // P1=_crol_(P1,1); // delay(400); // } // return 0; // } // // void zhonduan() interrupt 1 //中断函数 // { // P1=0; // }
然后写定时器。定时器的话应该有这么几个元素,用来初始化
【EA=1;打开总中断;
ET0=1;定时器0的中断打开;
TR0=1;定时器0的开关打开;
TMOD;工作反射光hi
TH0;高八位;
TL0;低八位;】
// 定时器的基本应用 1微妙的使用 实现led灯的简短闪烁 //void Timer_0Init(void) //1微秒@11.0592MHz //{ // TMOD &= 0xF0; //设置定时器模式 // TMOD |= 0x01; //设置定时器模式 // TL0 = 0xF5; //设置定时初值 // TH0 = 0xFF; //设置定时初值 // TF0 = 0; //清除TF0标志 // TR0 = 1; //定时器0开始计时 // EA=1; // 打开总中断 // ET0=1; //定时器0中断打开 //} // //void timer() interrupt 1 //{ // TL0 = 0xF5; //设置定时初值 // TH0 = 0xFF; //设置定时初值 //led4=~led4; //} //int main() //{ //led4=0; //Timer_0Init(); //while(1); //return 0; //}
// LED以1000ms的时间闪烁 定时器的使用 // int i=0; //void Timer0Init(void) //1毫秒 //{ // EA=1; // ET0=1; // TR0 = 1; //定时器0开始计时 // TMOD = 0x01; //设置定时器模式 // TL0 = 0xCD; //设置定时初值 // TH0 = 0xD4; //设置定时初值 // //} // // // void time()interrupt 1 // { // // TL0 = 0xCD; //设置定时初值 // TH0 = 0xD4; //设置定时初值 // i++; // } // // // int main() // { // P1=0xfe; // Timer0Init(); // while(1) // { // if(i==10) // { // P1=_crol_(P1,1); // i=0; // } // } // }
然后就是串口通讯,这也是比较重要的,同样他也是包含很多元素的
【SCON 或 SMO SM1
TMOD
TH0
TL0
TR0
EA=1;
ES=1;
REN=1】
// 串口通信 接收发送数据 // void USART() // { // SCON=0x50; // // SM0=0 ;SM1=1; // // 串口的工作方式 上面的都是写法 // REN=1; //启动串口接收数据 // TMOD=0x20; // PCON=0x00; // TH1=0xfd; // TL1=0xfd; // ES=1; // EA=1; // TR1=1; // } // // void main() // { //USART(); //while(1); //} // //void uuu() interrupt 4 //{ //unsigned char date; // //date = SBUF; //取出接受的数据 // RI = 0; //清处接受中断标志位 // SBUF = date; // while(!TI); // TI=0; //清除发送中断位 // }
然后下面就是PWM
先写个软件延时,体会内涵
//最简单的PWM写法 软件延时 //sbit LED=P1^4; //LED // //void delay(unsigned int i) //{ // while(i--); // } // //void main() //{ // while(1) // { // int i; // for(i=10;i<=1000;i=i+5) // { // LED=0; //低电平点亮 // delay(i); // LED=1; //高点平灭 // delay(1000); // } // for(i=1000;i>=10;i=i-20) // { // LED=0; //低电平点亮 // delay(i); // LED=1; //高点平灭 // delay(1000); // } // } //}
然后写一个以特定亮度运行的LED灯
//unsigned int time=0; //unsigned int PWM=20; // void Timer0Init(void) // 100微秒@11.0592MHz //{ // TMOD = 0xF0; //设置定时器模式 // TL0 = 0xAE; //设置定时初值 // TH0 = 0xFB; //设置定时初值 // TF0 = 0; //清除TF0标志 // TR0 = 1; //定时器0开始计时 // ET0=1; // EA=1; // //} // // void timer()interrupt 1 // { // TL0 = 0xAE; // TH0 = 0xFB; // time++; // } // // //int main() //{ // Timer0Init(); // while(1) // { // if(time>100) // { // time=0; // } // if(time<PWM) // { // led5=0; // } // if(time>=PWM) // { // led5=1; // } // } // return 0; // }
最后是必须会的呼吸灯
120毫秒更新占空比 2000微秒的周期 50%-95%的循环,每次增加5%亮度
unsigned int N=0; unsigned int T=0; unsigned int PWM_V=10; bit BZW=0; void Timer0Init(void) //100微秒@11.0592MHz { // AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x02; //设置定时器模式 TL0 = 0xA4; //设置定时初值 TH0 = 0xA4; //设置定时重载值 // TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 EA=1; ET0=1; } int main() { Timer0Init(); while(1); return 0; LED=1; } void uuuu() interrupt 1 { T++; N++; if(N==PWM_V) { LED=0; } if(N==20) { N=0; LED=1; } if((T==12000)&&(BZW==00)) { PWM_V++; T=0; if(PWM_V==19) { BZW=1; } } if((T==12000)&&(BZW==1)) { PWM_V--; T=0; if(PWM_V==10) { BZW=0; } } }
然后是串口通信控制LED,为以后的2.4G 蓝牙做基础
unsigned char ui; void UartInit(void) //9600bps@11.0592MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 // AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T // AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFD; //设定定时初值 TH1 = 0xFD; //设定定时器重装值 // ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 EA=1; ES=1; REN=1; } int main() { UartInit(); while(1) { if(ui=='1') { led5=0; } if(ui=='2') { led5=1; } } return 0; } void uuu()interrupt 4 { unsigned char date; date = SBUF; ui = SBUF; RI=0; SBUF=date; while(!TI); TI=0; }
51单片机的话就这么多的基础知识了,多练习才会有进步