51单片机编程:sbit位操作与LED闪烁实例

需积分: 1 0 下载量 68 浏览量 更新于2024-08-24 收藏 3.63MB PPT 举报
"sbit可寻址位是在单片机编程中用于访问特殊功能寄存器特定位的关键字,常用于控制硬件设备。通过sbit定义的位变量可以直接操作寄存器的某一位,使得编程更加方便。" 在单片机编程中,sbit可寻址位是一个重要的概念,它允许程序员直接对单片机内部特殊功能寄存器(SFR)的某个位进行读写操作。使用sbit定义的位变量,可以更高效地控制硬件接口,例如LED、按键等。以下是对sbit的详细解释和应用实例: 1. **sbit定义方式**: - sbit 位变量名 = 位地址:这种方式需要指定位的绝对地址,该地址通常位于0x80H到0xFFH之间。例如,`sbit CY=0xD7;` 这行代码定义了一个名为CY的位变量,它对应于特殊功能寄存器中的D7位。 2. **单片机系统开发过程**: - 系统功能明确:定义系统的具体行为,如让LED闪烁5次。 - 硬件设计:选择所需的外围设备,如LED、电阻、电容和按钮开关,并进行电路设计。 - 搭建硬件平台:在面包板上构建硬件电路,确保电气连接正确。 - 软件设计:编写单片机程序,包括初始化、主循环、子程序等。例如,使用sbit来控制LED的亮灭,如`MOVP1,#00H;` 点亮LED,`MOVP1,#0FFH;` 熄灭LED。 - 下载与调试:将程序编译、连接后生成HEX文件,通过下载线下载到单片机,并观察运行结果,根据需要调整程序或检查硬件问题。 3. **μVision软件的使用**: - 创建工程:选择合适的CPU型号(如AT89S51),保存工程。 - 设置工程选项:配置生成HEX文件,以便于下载到单片机。 - 新建源文件:创建汇编或C语言源程序,输入控制LED闪烁的代码。 - 添加源文件到工程:将源程序添加到工程文件夹,确保编译时被包含在内。 在实际应用中,sbit不仅可以用于控制LED,还可以用来处理中断标志位、波特率设置等,极大地提高了编程的灵活性和效率。在调试过程中,通过μVision这样的集成开发环境,可以方便地进行代码编辑、编译、调试,从而优化程序,确保单片机系统功能的正确实现。

#include "reg52.h" #include "func.h" #include "timer.h" //定义独立按键控制脚 sbit KEY1=P3^0; sbit KEY2=P3^1; sbit LED_heng_ren_lv = P1^1; sbit LED_heng_ren_hong = P1^0; sbit LED_heng_che_lv = P2^0; sbit LED_heng_che_huang = P2^1; sbit LED_heng_che_hong = P2^2; sbit LED_zong_che_lv = P2^3; sbit LED_zong_che_huang = P2^4; sbit LED_zong_che_hong = P2^5 ; sbit LED_zong_ren_lv = P2^6; sbit LED_zong_ren_hong = P2^7; void Delay100ms() //@11.0592MHz { unsigned char i, j; i = 180; j = 73; do { while (--j); } while (--i); } void Zong() { LED_Zong_Che(1); LED_Zong_Ren(1); LED_Heng_Che(3); LED_Heng_Ren(3); } void Heng() { LED_Zong_Che(3); LED_Zong_Ren(3); LED_Heng_Che(1); LED_Heng_Ren(1); } void Wait0() { LED_Zong_Che(2); LED_Zong_Ren(3); LED_Heng_Che(3); LED_Heng_Ren(3); } void Wait1() { LED_Zong_Che(3); LED_Zong_Ren(3); LED_Heng_Che(2); LED_Heng_Ren(3);} void Urgent() { LED_Heng_Che(3); LED_Heng_Ren(3); LED_Zong_Che(3); LED_Zong_Ren(3); } void LED_Heng_Che(unsigned char i) { if(i) { LED_heng_che_lv = 1 ; LED_heng_che_huang = 1; LED_heng_che_hong = 1; if(i == 1) {LED_heng_che_lv = 0 ;} else if(i == 2 ) {LED_heng_che_huang = 0;} else if(i == 3) {LED_heng_che_hong = 0;}} } void LED_Heng_Ren(unsigned char i) { if(i) { LED_heng_ren_lv = 1; LED_heng_ren_hong = 1; if(i == 1) { LED_heng_ren_lv = 0; } else if(i == 3) { LED_heng_ren_hong = 0; } } } void LED_Zong_Che(unsigned char i) { if(i) { LED_zong_che_lv = 1; LED_zong_che_huang = 1; LED_zong_che_hong = 1; if(i == 1) {LED_zong_che_lv = 0; } else if(i == 2) {LED_zong_che_huang = 0; } else if(i == 3) {LED_zong_che_hong = 0; } } } void LED_Zong_Ren(unsigned char i) { if(i) { LED_zong_ren_lv = 1; LED_zong_ren_hong = 1; if(i == 1) { LED_zong_ren_lv = 0; LED_zong_ren_hong = 1; } else if(i == 3) { LED_zong_ren_hong = 0; LED_zong_ren_lv = 1; } } } char KEY_Scan() { if(KEY1 == 0) { Delay100ms(); if(KEY1 == 0) { return 1; } } else if(KEY2 == 0) { Delay100ms(); if(KEY2 == 0) { return 2; } } else return 0; }

2023-06-12 上传