Keil uVision5的认识和操作
软件操作硬件的驱动原理
新的 Keil 里 AT89C51 系列都在 Microchip目录下
新建代码库
编译
建立工程
所有文件全部建立、编译一遍
更改字体
生成编译文件:
1
2
实践操作
点亮一个LED
STC89C52 的P2端口连接着LDE模块,1标识不亮,0标识亮。
一共8个灯对应:1111 1111
亮最后一个:1111 1110
#include <REGX52.H> void main() { P2=0xFE; //1111 1110 while(1) { } }
LED闪烁:
void Delay500ms() 是自定义函数用于延时(我从stc-isp软件里复制的代码)
P2=0xFF; //1111 1111和P2=0xFE; //1111 1110
分别表示最后一个灯的关和灭。
#include <REGX52.H> #include <INTRINS.H> void Delay500ms() //@12.000MHz { unsigned char i, j, k; _nop_(); i = 4; j = 205; k = 187; do { do { while (--k); } while (--j); } while (--i); } void main() { while(1) { P2=0xFE; //1111 1110 Delay500ms(); P2=0xFF; //1111 1111 Delay500ms(); } }
LED流水灯:
用P2端口控制的LED的关系(1标识不亮,0标识亮)
叠加闪烁的延时达到流水灯的效果
#include <REGX52.H> #include <INTRINS.H> void Delay500ms() //@12.000MHz { unsigned char i, j, k; _nop_(); i = 4; j = 205; k = 187; do { do { while (--k); } while (--j); } while (--i); } void main() { while(1) { P2=0xFE;//1111 1110 Delay500ms(); P2=0xFD;//1111 1101 Delay500ms(); P2=0xFB;//1111 1011 Delay500ms(); P2=0xF7;//1111 0111 Delay500ms(); P2=0xEF;//1110 1111 Delay500ms(); P2=0xDF;//1101 1111 Delay500ms(); P2=0xBF;//1011 1111 Delay500ms(); P2=0x7F;//0111 1111 Delay500ms(); } }
LED流水灯Plus:
用延时来把前两个LED灯将其减慢闪烁后面加快。
#include <REGX52.H> void Delay1ms(unsigned int xms); //@12.000MHz void main() { while(1) { P2=0xFE;//1111 1110 Delay1ms(1000); P2=0xFD;//1111 1101 Delay1ms(1000); P2=0xFB;//1111 1011 Delay1ms(100); P2=0xF7;//1111 0111 Delay1ms(100); P2=0xEF;//1110 1111 Delay1ms(100); P2=0xDF;//1101 1111 Delay1ms(100); P2=0xBF;//1011 1111 Delay1ms(100); P2=0x7F;//0111 1111 Delay1ms(100); } } void Delay1ms(unsigned int xms) //@12.000MHz { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } }
独立按键控制LED亮灭
STC89C52 的P3端口连接着按钮模块
用按钮控制
#include <REGX52.H> void main() { while(1) { if(P3_1==0 || P3_0==0) //如果K1按键或K2按键按下 { P2_0=0; //LED1输出0,点亮 } else { P2_0=1; //LED1输出1,熄灭 } } }
独立按键控制LED状态
#include <REGX52.H> void Delay(unsigned int xms) { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } } void main() { while(1) { if(P3_1==0) //如果K1按键按下 { Delay(20); //延时消抖 while(P3_1==0); //松手检测 Delay(20); //延时消抖 P2_0=~P2_0; //LED1取反 } } }
独立按键控制LED显示二进制
#include <REGX52.H> void Delay(unsigned int xms) { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); } } void main() { unsigned char LEDNum=0; while(1) { if(P3_1==0) //如果K1按键按下 { Delay(20); //延时消抖 while(P3_1==0); //松手检测 Delay(20); //延时消抖 LEDNum++; //变量自增 P2=~LEDNum; //变量取反输出给LED } } }
独立按键控制LED移位
#include <REGX52.H> void Delay(unsigned int xms); unsigned char LEDNum; void main() { P2=~0x01; //上电默认LED1点亮 while(1) { if(P3_1==0) //如果K1按键按下 { Delay(20); while(P3_1==0); Delay(20); LEDNum++; //LEDNum自增 if(LEDNum>=8) //限制LEDNum自增范围 LEDNum=0; P2=~(0x01<<LEDNum); //LED的第LEDNum位点亮 } if(P3_0==0) //如果K2按键按下 { Delay(20); while(P3_0==0); Delay(20); if(LEDNum==0) //LEDNum减到0后变为7 LEDNum=7; else //LEDNum未减到0,自减 LEDNum--; P2=~(0x01<<LEDNum); //LED的第LEDNum位点亮 } } } void Delay(unsigned int xms) { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); } }