文档库 最新最全的文档下载
当前位置:文档库 › TI CC2530组网演练(BasicRF——无线控制灯的亮灭)

TI CC2530组网演练(BasicRF——无线控制灯的亮灭)

TI CC2530组网演练(BasicRF——无线控制灯的亮灭)
TI CC2530组网演练(BasicRF——无线控制灯的亮灭)

TI CC2530组网演练(BasicRF——无线控制灯的亮灭)

本文将从两个方面着手,一方面分析TI官网下载的CC2530 BasicRF源码中的无线发送,另一方面根据自己的板子来修改实现无线发送控制灯的亮灭。

一、CC2530 BasicRF

Basic RF由TI公司提供,它包含了IEEE 802.15.4标准的数据包的收发功能但并没有使用到协议栈,它仅仅是让两个节点进行简单的通信,也就是说Basic RF仅仅是包含着IEEE 802.15.4标准的一小部分而已。其主要特点有:

1、不会自动加入协议、也不会自动扫描其他节点、同时也没有组网指示灯(LED3)

2、没有协议栈里面所说的协调器、路由器或者终端的区分,节点的地位都是相等的

3、没有自动重发的功能

Basic RF layer为双向无线通信提供了一个简单的协议,通过这个协议能够进行数据的发送和接收。Basic RF还提供了安全所使用的CCM-64身份验证和数据加密,它的安全性在工程文件里定义SECURITY_CCM了。在Project->Option->C/C++

Compiler->Preprocess里面就选择,本次实验并不是什么高度机密,所有在SECURITY_CCM前面带X了。

Basic RF的工作过程:启动、发射、接收

工程文件分析

宏:

MCU_IO_DIR_OUTPUT(port, pin);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_DIR_OUTPUT(port, pin);将端口port对应的pin位设置为输出(高电平)

3. * ##为连接符,如port=0,pin=1,即P0DIR |= BM(1);

4. **********************************************************************/

5.#define MCU_IO_DIR_OUTPUT(port, pin) MCU_IO_DIR_OUTPUT_PREP(port, pin)

6.#define MCU_IO_DIR_OUTPUT_PREP(port, pin) st( P##port##DIR |= BM(pin); )

7.#define st(x) do { x } while (__LINE__ == -1)

8.#define BM(n) (1 << (n))

MCU_IO_DIR_INPUT(port, pin);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_DIR_INPUT(port, pin);将端口port对应的pin位设置为输入(低电平)

3. **********************************************************************/

4.#define MCU_IO_DIR_INPUT(port, pin) MCU_IO_DIR_INPUT_PREP(port, pin)

5.#define MCU_IO_DIR_INPUT_PREP(port, pin) st( P##port##DIR |= ~BM(pin); )

6.#define st(x) do { x } while (__LINE__ == -1)

7.#define BM(n) (1 << (n))

MCU_IO_GET(port, pin);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_GET(port, pin);获取端口port的对应位pin的电平值

3. **********************************************************************/

4.#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin)

5.#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin))

6.#define BM(n) (1 << (n))

MCU_IO_TGL(port, pin);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_TGL(port, pin);将端口port的对应位pin的电平值设置为相反电平

3. **********************************************************************/

4.#define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin)

5.#define MCU_IO_TGL_PREP(port, pin) st( P##port##_##pin## ^= 1; )

6.#define st(x) do { x } while (__LINE__ == -1)

MCU_IO_SET_LOW(port, pin);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_SET_LOW(port, pin);将端口port的对应位pin设置为低电平

3. **********************************************************************/

4.#define MCU_IO_SET_LOW(port, pin) MCU_IO_SET_LOW_PREP(port, pin)

5.#define MCU_IO_SET_LOW_PREP(port, pin) st( P##port##_##pin## = 0; )

6.#define st(x) do { x } while (__LINE__ == -1)

MCU_IO_SET_HIGH(port, pin);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_SET_HIGH(port, pin);将端口port的对应位pin设置为高电平

3. **********************************************************************/

4.#define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin)

5.#define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; )

6.#define st(x) do { x } while (__LINE__ == -1)

MCU_IO_SET(port, pin, val);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_SET(port, pin, val);将端口port的对应位pin的电平值设置为val

3. **********************************************************************/

4.#define MCU_IO_SET(port, pin, val) MCU_IO_SET_PREP(port, pin, val)

5.#define MCU_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; )

6.#define st(x) do { x } while (__LINE__ == -1)

MCU_IO_OUTPUT(port, pin, val);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_OUTPUT(port, pin, val);将端口port的对应位pin的电平值设置为val

3. * 并且将此IO设置为通用IO,以及设置为输出

4. **********************************************************************/

5.#define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val)

6.#define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BM(pin); \

7. P##port##_##pin## = val; \

8. P##port##DIR |= BM(pin); )

9.#define st(x) do { x } while (__LINE__ == -1)

MCU_IO_OUTPUT(port, pin, func);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_INPUT(port, pin, func);将端口port的对应位pin的设置为通用IO

3. * 并将此IO口设置为func输入模式:上拉、下拉、默认模式(三态)

4. * func指的是IO口的输入模式:MCU_IO_PULLUP、MCU_IO_PULLDOWN、默认模

5. **********************************************************************/

6.#define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func)

7.#define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BM(pin); \

8. P##port##DIR &= ~BM(pin); \

9.switch (func) { \

10.case MCU_IO_PULLUP: \

11. P##port##INP &= ~BM(pin)

; \

12. P2INP &= ~BM(port + 5);

\

13.break; \

14.case MCU_IO_PULLDOWN: \

15. P##port##INP &= ~BM(pin)

; \

16. P2INP |= BM(port + 5); \

17.break; \

18.default: \

19. P##port##INP |= BM(pin);

\

20.break; } )

21.#define st(x) do { x } while (__LINE__ == -1)

MCU_IO_PERIPHERAL(port, pin);

[cpp]view plaincopyprint?

1./***********************************************************************

2. * MCU_IO_PERIPHERAL(port, pin);将端口port的对应位pin的设置为外设功

3. **********************************************************************/

4.#define MCU_IO_PERIPHERAL(port, pin) MCU_IO_PERIPHERAL_PREP(port, pin)

5.#define MCU_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BM(pin); )

6.#define BM(n) (1 << (n))

light_switch.c——main函数

[cpp]view plaincopyprint?

1.

void main(void)

2.{

3. uint8 appMode = LIGHT;

4.

5.// Config basicRF

6. basicRfConfig.panId = PAN_ID; //网络地址,0x2007

7. basicRfConfig.channel = RF_CHANNEL; //通道,25 // 2.4 GHz RF channel

8. basicRfConfig.ackRequest = TRUE; //是否应当, 1

9.#ifdef SECURITY_CCM

10. basicRfConfig.securityKey = key;

11.#endif

12.

13.// Initalise board peripherals

14./*

15. * 一些GPIO口初始化,包括以下LEDs和Buttons初始化

16. * 将LEDs(P0_0、P1_1、P1_4、P0_1)设置为输出、Buttons(P0_1)设置为输入模式且为

三态输入模式

17. */

18. halBoardInit();

19./*

20. * 多方向按键初始化,不用管

21. */

22. halJoystickInit();

23.

24.// Initalise hal_rf 硬件抽象层rf初始化

25.if(halRfInit()==FAILED) {

26. HAL_ASSERT(FALSE);

27. }

28.

29.// Indicate that device is powered 将按键1设置为高电平,并将状态设置为1

30./*

31. switch (id)

32. {

33. case 1: HAL_LED_SET_1(); break;

34. case 2: HAL_LED_SET_2(); break;

35. case 3: HAL_LED_SET_3(); break;

36. case 4: HAL_LED_SET_4(); led4State=1; break;

37.

38. default: break;

39. }

40.

41. #define HAL_LED_SET_1() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED

_1_PORT, HAL_BOARD_IO_LED_1_PIN)

42. #define HAL_LED_SET_2() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED

_2_PORT, HAL_BOARD_IO_LED_2_PIN)

43. #define HAL_LED_SET_3() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED

_3_PORT, HAL_BOARD_IO_LED_3_PIN)

44. #define HAL_LED_SET_4() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED

_4_PORT, HAL_BOARD_IO_LED_4_PIN)

45.

46. #define HAL_BOARD_IO_LED_1_PORT 1 // Green

47. #define HAL_BOARD_IO_LED_1_PIN 0

48. #define HAL_BOARD_IO_LED_2_PORT 1 // Red

49. #define HAL_BOARD_IO_LED_2_PIN 1

50. #define HAL_BOARD_IO_LED_3_PORT 1 // Yellow

51. #define HAL_BOARD_IO_LED_3_PIN 4

52. #define HAL_BOARD_IO_LED_4_PORT 0 // Orange

53. #define HAL_BOARD_IO_LED_4_PIN 1

54. */

55. halLedSet(1);

56.

57.// Print Logo and splash screen on LCD

58. utilPrintLogo("Light Switch"); //有关LCD的函数不管

59.

60.// Wait for user to press S1 to enter menu

61.while (halButtonPushed()!=HAL_BUTTON_1);

62. halMcuWaitMs(350);

63. halLcdClear(); //lcd清屏,不用管

64.

65.// Set application role

66. appMode = appSelectMode(); //模式选择

67. halLcdClear();

68.

69.// Transmitter application

70.if(appMode == SWITCH) {

71.// No return from here

72. appSwitch();

73. }

74.// Receiver application

75.else if(appMode == LIGHT) {

76.// No return from here

77. appLight();

78. }

79.// Role is undefined. This code should not be reached

80. HAL_ASSERT(FALSE);

81.}

hal_board.c——halBoardInit()函数实现

[cpp]view plaincopyprint?

1.void halBoardInit(void)

2.{

3.//mcu初始化,设置系统时钟

4. halMcuInit();

5.

6.// LEDs

7.#ifdef SRF05EB_VERSION_1_3

8.// SmartRF05EB rev 1.3 has only one accessible LED

9. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN);

10. HAL_LED_CLR_1();

11.#else

12./*

13. * LEDs(P0_0、P1_1、P1_4、P0_1)设置为输出

14. */

15. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN);

16. HAL_LED_CLR_1();

17. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN);

18. HAL_LED_CLR_2();

19. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN);

20. HAL_LED_CLR_3();

21. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN);

22. HAL_LED_CLR_4();

23.#endif

24.

25.// Buttons

26./*

27. * Buttons(P0_1)设置为输入模式且为三态输入模式

28. */

29. MCU_IO_INPUT(HAL_BOARD_IO_BTN_1_PORT, HAL_BOARD_IO_BTN_1_PIN, MCU_IO_TRI

STATE);

30.

31.// Joystick push input 多方向按键三态输入模式

32. MCU_IO_INPUT(HAL_BOARD_IO_JOY_MOVE_PORT, HAL_BOARD_IO_JOY_MOVE_PIN, \

33. MCU_IO_TRISTATE);

34.

35.// Analog input adc模拟,设置对应引脚为外部功能

36. MCU_IO_PERIPHERAL(HAL_BOARD_IO_JOYSTICK_ADC_PORT, HAL_BOARD_IO_JOYSTICK_

ADC_PIN);

37.

38.//lcd初始化

39. halLcdSpiInit();

40. halLcdInit();

41.

42./*

43. * halIntOn:开启全局中断-->HAL_INT_ON-->st( EA = 1; )

44. */

45. halIntOn();

46.}

hal_rf.c——halRfInit()函数实现

[cpp]view plaincopyprint?

1.uint8 halRfInit(void)

2.{

3.// Enable auto ack and auto crc

4./*

5. * #define FRMCTRL0 XREG( 0x6189 )

6. * #define XREG(addr) ((unsigned char volatile __xdata *) 0)[addr]

7. * 即往寄存器FRMCTRL0(0x6189)写数据

8. * #define AUTO_ACK 0x20

9. * #define AUTO_CRC 0x40

10. */

11. FRMCTRL0 |= (AUTO_ACK | AUTO_CRC);

12.

13.// Recommended RX settings

14./*

15. * #define TXFILTCFG XREG( 0x61FA )

16. * #define AGCCTRL1 XREG( 0x61B2 )

17. * #define FSCAL1 XREG( 0x61AE )

18. */

19. TXFILTCFG = 0x09; //调整AGC目标值

20. AGCCTRL1 = 0x15; //设置 TX 抗混叠过滤器以获得合适的贷款

21. FSCAL1 = 0x00; //和默认设置比较,降低VCO泄露大约3dB。推荐默认设置以

获得最佳 EVM

22.

23.// Enable random generator -> Not implemented yet

24.

25.// Enable CC2591 with High Gain Mode

26. halPaLnaInit();//在CC2530中此函数没有做任何操作

27.

28.// Enable RX interrupt 使能接收中断

29./*

30. * RFIRQM0 |= BV(6);

31. * IEN2 |= BV(0);

32. * #define BV(n) (1 << (n))

33. */

34. halRfEnableRxInterrupt();

35.

36.return SUCCESS;

37.}

light_switch.c——appSwitch()、appLight()函数实现

[cpp]view plaincopyprint?

1.static void appSwitch()

2.{

3.//lcd有关操作不用管

4. halLcdWriteLine(HAL_LCD_LINE_1, "Switch");

5. halLcdWriteLine(HAL_LCD_LINE_2, "Joystick Push");

6. halLcdWriteLine(HAL_LCD_LINE_3, "Send Command");

7.#ifdef ASSY_EXP4618_CC2420 //没有定义

8. halLcdClearLine(1);

9. halLcdWriteSymbol(HAL_LCD_SYMBOL_TX, 1);

10.#endif

11.

12. pTxData[0] = LIGHT_TOGGLE_CMD; // #define LIGHT_TOGGLE_CMD 0 //被传输

的开关命令

13.

14.// Initialize BasicRF

15. basicRfConfig.myAddr = SWITCH_ADDR; //#define SWITCH_ADDR 0x2520 //开关

节点的地址

16.if(basicRfInit(&basicRfConfig)==FAILED) {

17. HAL_ASSERT(FALSE);

18. }

19.

20.// Keep Receiver off when not needed to save power 关闭接收

21. basicRfReceiveOff();

22.

23.// Main loop

24.while (TRUE) {

25.if( halJoystickPushed() ) { //判断多方向按键是否按下

26.

27. basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);//发送

命令

28.

29.// Put MCU to sleep. It will wake up on joystick interrupt

30. halIntOff();

31. halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global

32.// interrupt enable

33. halIntOn();

34.

35. }

36. }

37.}

[cpp]view plaincopyprint?

1.static void appLight()

2.{

3. halLcdWriteLine(HAL_LCD_LINE_1, "Light");

4. halLcdWriteLine(HAL_LCD_LINE_2, "Ready");

5.

6.#ifdef ASSY_EXP4618_CC2420

7. halLcdClearLine(1);

8. halLcdWriteSymbol(HAL_LCD_SYMBOL_RX, 1);

9.#endif

10.

11.// Initialize BasicRF

12. basicRfConfig.myAddr = LIGHT_ADDR; //#define LIGHT_ADDR 0xBEEF //电灯

节点的地址

13.if(basicRfInit(&basicRfConfig)==FAILED) {

14. HAL_ASSERT(FALSE);

15. }

16.//使能接收

17. basicRfReceiveOn();

18.

19.// Main loop

20.while (TRUE) {

21.while(!basicRfPacketIsReady());//检查是否收到一个新数据包

22.

23.if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) { //收到的数

据复制到pRxData中

24.if(pRxData[0] == LIGHT_TOGGLE_CMD) {

25. halLedToggle(1); //将其对应的LED1设置相反电平

26. }

27. }

28. }

29.}

basic_rf.h——basicRfCfg_t结构体定义

[cpp]view plaincopyprint?

1.typedef struct {

2. uint16 myAddr; //16位短地址(就是节点地址)

3. uint16 panId; //节点的PAN(个人局域网) ID

4. uint8 channel; //RF通道(必须在11-26之间)

5. uint8 ackRequest; //目标确定就置true

6. #ifdef SECURITY_CCM //是否加密

7. uint8* securityKey;

8. uint8* securityNonce;

9. #endif

10.} basicRfCfg_t;

basic_rf.c——basicRfPacketIsReady()、basicRfReceive()、basicRfSendPacket()函数实现

[cpp]view plaincopyprint?

1.uint8 basicRfPacketIsReady(void)

2.{

3./*

4. * static basicRfRxInfo_t rxi= { 0xFF }; // Make sure sequence numbers

are

5. * 确保数据序列号为0xFF

6. */

7.return rxi.isReady;

8.}

[cpp]view plaincopyprint?

1.uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi)

2.{

3.// Accessing shared variables -> this is a critical region

4.// Critical region start

5. halIntOff();

6. memcpy(pRxData, rxi.pPayload, min(rxi.length, len));

7.if(pRssi != NULL) {

8.if(rxi.rssi < 128){

9. *pRssi = rxi.rssi - halRfGetRssiOffset();

10. }

11.else{

12. *pRssi = (rxi.rssi - 256) - halRfGetRssiOffset();

13. }

14. }

15. rxi.isReady = FALSE;

16. halIntOn();

17.

18.// Critical region end

19.

20.return min(rxi.length, len);

21.}

[cpp]view plaincopyprint?

1.uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)

2.{

3. uint8 mpduLength;

4. uint8 status;

5.

6.// Turn on receiver if its not on

7.if(!txState.receiveOn) {

8. halRfReceiveOn();

9. }

10.

11.// Check packet length

12. length = min(length, BASIC_RF_MAX_PAYLOAD_SIZE);

13.

14.// Wait until the transceiver is idle

15. halRfWaitTransceiverReady();

16.

17.// Turn off RX frame done interrupt to avoid interference on the SPI int

erface

18. halRfDisableRxInterrupt();

19.

20. mpduLength = basicRfBuildMpdu(destAddr, pPayload, length);

21.

22. #ifdef SECURITY_CCM

23. halRfWriteTxBufSecure(txMpdu, mpduLength, length, BASIC_RF_LEN_AUTH, BAS

IC_RF_SECURITY_M);

24. txState.frameCounter++; // Increment frame counter field

25. #else

26. halRfWriteTxBuf(txMpdu, mpduLength);

27. #endif

28.

29.// Turn on RX frame done interrupt for ACK reception

30. halRfEnableRxInterrupt();

31.

32.// Send frame with CCA. return FAILED if not successful

33.if(halRfTransmit() != SUCCESS) {

34. status = FAILED;

35. }

36.

37.// Wait for the acknowledge to be received, if any

38.if (pConfig->ackRequest) {

39. txState.ackReceived = FALSE;

40.

41.// We'll enter RX automatically, so just wait until we can be sure t

hat the ack reception should have finished

42.// The timeout consists of a 12-symbol turnaround time, the ack pack

et duration, and a small margin

43. halMcuWaitUs((12 * BASIC_RF_SYMBOL_DURATION) + (BASIC_RF_ACK_DURATIO

N) + (2 * BASIC_RF_SYMBOL_DURATION) + 10);

44.

45.// If an acknowledgment has been received (by RxFrmDoneIsr), the ack

Received flag should be set

46. status = txState.ackReceived ? SUCCESS : FAILED;

47.

48. } else {

49. status = SUCCESS;

50. }

51.

52.// Turn off the receiver if it should not continue to be enabled

53.if (!txState.receiveOn) {

54. halRfReceiveOff();

55. }

56.

57.if(status == SUCCESS) {

58. txState.txSeqNumber++;

59. }

60.

61.#ifdef SECURITY_CCM

62. halRfIncNonceTx(); // Increment nonce value

63.#endif

64.

65.return status;

66.

67.}

二、无线控制灯的亮灭

实现:通过按S1键来控制另一个板子上的LED1灯的亮灭

1、电路原理图

2、分析

既然要实现通过按S1键来控制另一个板子上的LED1灯的亮灭,那么首先需要将被控制版上的LED1对应的P1_0设置为输出模式,且当P1_为低电平时LED1等亮,为高电平时LED1等灭。以及将控制板上的S1对应的P0_4设置为输入模式,当检测到P0_4引脚为低电平表示按键S1被按下,反之为高电平时表示按键S1没有被按下。由于

CC2530中的无线发送功能是内置的,不是外设,即TI官网下载的CC2530 BasicRF中的无线发送代码仍然适合我的板子,不需要怎么修改。这样,将按键S1端作为无线发送的发送端,而LED1端作为无线发送的接收端。

根据上面的代码分析,来实现自己的无线点灯,代码修改如下:

(1)、首先根据上面的分析,可以知道TI官网的CC2530 BasicRF中有4个LED,其分别是P0_0、P1_1、P1_4、P0_1,而我的板子中有个两个LED灯,分别是LED1(P1_0)、LED2(P1_1)。所有需要修改LED1的引脚定义,修改hal_board.h对应LEDs的引脚定义处。

修改前:

[cpp]view plaincopyprint?

1.// LEDs

2.#define HAL_BOARD_IO_LED_1_PORT 0 // Green

3.#define HAL_BOARD_IO_LED_1_PIN 0

4.#define HAL_BOARD_IO_LED_2_PORT 1 // Red

5.#define HAL_BOARD_IO_LED_2_PIN 1

6.#define HAL_BOARD_IO_LED_3_PORT 1 // Yellow

7.#define HAL_BOARD_IO_LED_3_PIN 4

8.#define HAL_BOARD_IO_LED_4_PORT 0 // Orange

9.#define HAL_BOARD_IO_LED_4_PIN 1

第05课,标记的用法,用一个按键控制1个LED灯的亮灭

第5课,标记的用法,用一个按键控制1个LED灯的亮灭,按键去抖 这一课,我们学习怎么用一个按键K1控制1个LED灯的亮和灭两种状态。按一次K1灯亮,再按一次K1灯灭。再按一次又亮,再按一次又灭。 我们学习一下用一个bit变量来做一个标记,然后在按键的控制下,这个标记会变化,再根据这个标记的值,LED也输出不同的状态。 因为按键按下时可能会有抖动的情况,每次按下时,可能会发生了人难以觉察到的多次抖动,相当于一下子按下了很多次。这会导致程序无法识别出您真正的按键意图。 但是抖动一般都是发生在刚按下键和松开键的时候,所以,我们只要避开这一段时间,等键稳定按下或者松开时,再去读它的值,一般就可以正确读取了。 所以,当读到第一次按键的值时,要延时等待一会,再处理。在松开后,也延时一会,免得检测到松开的抖动以为又有按键。(注,更复杂的应用,需要在按下延时之后重新验证按键,为了简化和方便理解,这个例程里没有这样做。) 另外,因为程序是循环运行的,当一次按键处理后,又会再循环回来继续检测,如果您的按键这时还没有松开,又会被读到一次新的按键,并做处理。所以我们还要做一个特殊的处理,识别到一个按键并处理完成之后,还要等待这个按键松开后,再继续循环运行。 看程序:

请根据例程里的注释理解程序。 请编译,进入仿真,全速运行,看结果。 全速后,由于light变量初始化时默认为0,所以灯是亮的。按下K1,松开后,灯灭了;再按一次K1,松开后,灯灭了。 这个例子里,我们只用一个按键就控制了灯的亮灭,这种方法可以节省了硬件资源,也就是节省了硬件成本。在实际项目设计中,有成本优势,产品就更具竞争力。所以我们应该多学习类似的可以节省资源的方法。 作业: 改为4个按键,分别控制4个LED的亮和灭。相当应用到多个房间的单键开关灯共用一个cpu处理。

粤教粤科版小学科学四年级上册科学《控制灯泡的亮与灭》练习

4.4 控制灯泡的亮与灭 一、填空题。 1、在电路中接入()就可以控制灯泡的亮与灭。 2、在串联电路中,一个开关可以控制()灯泡的亮与灭。 3、在并联电路中,一个开关可以控制()灯泡的亮与灭。 4、开关的功能是()和()电路。 5、开关安装在电路的不同位置,控制用电器的结果有可能()。 二、判断题。 1、开关是电路中控制电流通断的元件。() 2、在同一个电路中,一个开关只能控制一个灯泡的亮与灭。() 3、控制灯泡的亮与灭,只有串联电路可以。() 4、生活中常见的漏电保护开关是控制开关。() 5、遥控器不是开关。() 三、单选题。 1、一旦电器发生事故,首先利用()断开电路。 A、开关 B、电线 C、灯泡 2、下列材料能用来制作小开关的是()。 A、塑料和铁片 B、塑料盒铜片 C、铜片和铝片 3、为了使电筒的亮度增大,可以让电池的连接方式为()。 A、串联 B、并联 4、我们教室里的灯管,一个开关控制一个灯管,请问这是()连接方式。 A、串联 B、并联 C、无法判断 四、简答题。 1、生活中的电路开关有哪些类型? 2、电路中的开关有什么作用? 4.4 控制灯泡的亮与灭答案

一、填空题。 1、开关 2、多个 3、一个 4、连接断开 5、不同 二、判断题。 1、√ 2、× 3、× 4、√ 5、× 三、单选题。 1、A 2、B 3、A 4、B 四、简答题。 1、答:除了我们常见的手动开关外,还有声控开关、触摸开关、光控开关、和红外线开关等。 2、答:开关是用来接通或切断电路的,是电路中不可缺少的控制部件;开关给人们生活带来很大便利,并能有效地节约能源。 粤教版四上科学

控制一个LED灯的亮和灭

江苏省盐城技师学院 教案首页 编号:YJQD-0507-07 版本:B/O 流水号:编制:审核:批准:授课日期 班级 课题:控制一个LED灯的亮和灭 教学目的、要求:1、学习用查表方法使端口P1作单一灯变化。 2、熟练掌握延时子程序的编写与调用。 教学重点、难点:查表程序的使用。 授课方法:任务驱动型教学、启发式教学、实验教学 教学参考及教具(含电教设备):多媒体设备、高职高专规划教材《单片机原理与控制技术》、DVCC系列单片机微机仿真实验系统实验指导书。 授课执行情况及分析: 板书和教学设计: 课题:控制一个LED灯的亮和灭 一、知识回顾 二、任务引入 三、任务分析 四、相关知识 (1)查表程序的使用 (2)89C51单片机各引脚功能(3)流程图的绘制方法五、任务实施 六、任务拓展 七、巡回指导 八、结束指导

课题:控制一个LED灯的亮和灭 课前准备: 1、DVCC系列单片机微机仿真实验系统; 2、安装有DVCC实验系统软件的计算机。 3、万用表及常用电工工具,通用检测电源。 组织教学: 检查学生人数、标志牌佩戴、工作服及工具准备情况。 知识回顾(复习提问): 1、P1口的作用? 2、软件延时程序的编写方法? 任务引入: 在P1端口上接8个发光二极管L1~L8,左移2次,右移2次,闪烁2次(延时0.2S)。 任务分析: 1、硬件图

2、流程图 开始 置DPTR 取码值 是否结束 输到P1 DPTR+1=DPTR 延时0.2S 相关知识: 1、查表程序的使用 2、89C51的各引脚功能 3、流程图的绘制方法 任务实施:(示范操作) 1、查表指令功能说明 (1)利用MOV DPTR,#DATA16的指令来使数据指针寄存器指到表的开头。

open,close控制小灯亮灭

实验名称:open/close控制小灯亮灭 一.实验目的 通过该实验实习,进一步熟悉KDS嵌入式开发系统环境和C语言以及调试方式;加强串口通信(SCI)基本原理及编程原理;理解课本中的程序代码;分别运用查询方式、中断方式实现通信。 二.实验内容 通过串口调试器发送open/close控制小灯亮灭 三.实验过程 1.m ain.c函数 //说明见工程文件夹下的Doc文件夹内Readme.txt文件 //========================================================= #include "includes.h" //包含总头文件 int main(void) { //1. 声明主函数使用的变量 uint_32 mRuncount; //主循环计数器 //2. 关总中断 DISABLE_INTERRUPTS; //3. 初始化外设模块 light_init(RUN_LIGHT_BLUE, LIGHT_OFF); //蓝灯初始化 light_init(RUN_LIGHT_RED, LIGHT_OFF); //蓝灯初始化 uart_init(UART_0,MCGIRCLK, 9600); //串口0时钟MCGIRCLK(4000Khz) uart_init (UART_1,BUSCLK, 9600); //串口1、2使用总线时钟24000Khz uart_init (UART_2,BUSCLK, 9600); //波特率使用9600 uart_send_string(UART_0, "Hello Uart_0!\r\n"); //串口发送初始化提示 uart_send_string(UART_1, "Hello Uart_1!\r\n"); uart_send_string(UART_2, "Hello Uart_2!\r\n");//只插了串口2,所以在串口调试器中只有Hello Uart_2! //4. 给有关变量赋初值 mRuncount=0; //主循环计数器 //5. 使能模块中断 uart_enable_re_int(UART_0); //使能串口0接收中断

第四单元第21课控制灯泡的亮与灭教学设计

第四单元第21课控制灯泡的亮与灭教学设计 第21课《控制灯泡的亮与灭》教 学设计 一、教材分析 本课是粤教科技版《科学》四年级上册第4单元“简单电路” 的第3课。本课活动是通过研究开关的作用,让学生认识到开关可 以连接和断开闭合电路,知道开关是控制电路的元件。 本课共由2个活动组成。活动1“开关的作用”,主要是把开关接入一个简单电路中,控制灯泡的亮与灭,认识到开关的作用 是连接和断开电路。活动2“开关加在哪里”是让学生在有两个灯 泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时需要 把开关安装在不同位置。 二、学情分析 四年级的学生已经在生活中对开关有了比较多的了解,有动手操作开关的基础,对开关的作用有了基本的感性认识,但开关 控制电路的原理是什么,这一点学生一般没有去了解。对于在只 有一个灯泡的简单电路中接入开关,学生能很快理解并掌握。但

是增加一个灯泡后变成两个灯泡的电路,如何同时控制两个灯泡 的亮与灭,或者分别控制每个灯泡的亮与灭,这需要教师引导学 生根据前一课的学习基础进行思考,激发他们从闭合回路方面去 寻找连接方法。同时在前面的学习中经历过画电路图,学生有能 力将连接的方法用简图画出来。 三、教学目标 1.知道开关能连通和断开电路。 2.观察常用的各种开关,了解控制电路的方法。 3.养成节约用电的习惯。 四、教学重、难点 教学重点:通过用开关来控制电路的探究活动,认识开关如何 控制电路。 教学难点:在有两个灯泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时开关加在哪里。

2 粤教科技版《科学》四年级上册教学设计 五、教学准备 教具准备:多媒体教学仪器、实物投影、教学课件等。学 具准备:灯泡、导线、电池、开关、学生活动册等。 六、教学过程 (一)任务驱动 设置情境:几个小朋友在玩电灯笼,其中波波自己制作的电灯笼中的灯泡一直在亮着。 问题:能不能在这个电灯笼加一个开关? 交流:对教科书中妍妍提出的问题进行思考。 任务:在电路中接入开关,控制电路中灯泡的亮与灭。 (二)活动探究 1.活动1:开关的作用 出示:没有开关的电路图。 提示:在电路中接入开关,通过开关可以控制开关的亮与灭。任 务:尝试将开关接入电路中,了解控制电路的方法。 活动:以小组为单位将开关接入电路中。 汇报:可以在电路中接入开关控制灯泡的亮与灭。开关处于“开”的状态,灯泡不亮; 开关处于“闭”的状态,灯泡就亮。 小结:开关能通过让电路形成闭合或断开的状态来控制电路。 2.活动2:开关加在哪里 提示:电源、灯泡、开关连接好后,当开关处于闭合状态时,电路构成了闭合回路,当开关处于打开状态时,电路就断开了。 任务:若要控制同一电路中的两个灯泡的亮与灭,如何在电路中连接开关?出 示:电路元件图。 要求:先在图上画一画连接起来方法再尝试动手操作,可以最后把电路是怎么连接的用简图画下来。完成学生活动手册内容。 活动:学生以小组为单位研究怎么连接导线。 汇报:利用实物和电路的连接简图这两个内容,分别从不同的连接方法汇报如何连接导线。 评价:根据学生是否能说明白怎么控制两个灯泡是否能同时发光进行评价。根据学

第21课控制灯泡的亮与灭教案教学设计

第21课控制灯泡的亮与灭教案教学设计 第21课《控制灯泡的亮与灭》教 学设计 一、教材分析 本课是粤教科技版《科学》四年级上册第4单元“简单电路” 的第3课。本课活动是通过研究开关的作用,让学生认识到开关可 以连接和断开闭合电路,知道开关是控制电路的元件。 本课共由2个活动组成。活动1“开关的作用”,主要是把开关接入一个简单电路中,控制灯泡的亮与灭,认识到开关的作用 是连接和断开电路。活动2“开关加在哪里”是让学生在有两个灯 泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时需要 把开关安装在不同位置。 二、学情分析 四年级的学生已经在生活中对开关有了比较多的了解,有动手操作开关的基础,对开关的作用有了基本的感性认识,但开关 控制电路的原理是什么,这一点学生一般没有去了解。对于在只 有一个灯泡的简单电路中接入开关,学生能很快理解并掌握。但

是增加一个灯泡后变成两个灯泡的电路,如何同时控制两个灯泡 的亮与灭,或者分别控制每个灯泡的亮与灭,这需要教师引导学 生根据前一课的学习基础进行思考,激发他们从闭合回路方面去 寻找连接方法。同时在前面的学习中经历过画电路图,学生有能 力将连接的方法用简图画出来。 三、教学目标 1.知道开关能连通和断开电路。 2.观察常用的各种开关,了解控制电路的方法。 3.养成节约用电的习惯。 四、教学重、难点 教学重点:通过用开关来控制电路的探究活动,认识开关如何 控制电路。 教学难点:在有两个灯泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时开关加在哪里。

2 粤教科技版《科学》四年级上册教学设计 五、教学准备 教具准备:多媒体教学仪器、实物投影、教学课件等。学 具准备:灯泡、导线、电池、开关、学生活动册等。 六、教学过程 (一)任务驱动 设置情境:几个小朋友在玩电灯笼,其中波波自己制作的电灯笼中的灯泡一直在亮着。 问题:能不能在这个电灯笼加一个开关? 交流:对教科书中妍妍提出的问题进行思考。 任务:在电路中接入开关,控制电路中灯泡的亮与灭。 (二)活动探究 1.活动1:开关的作用 出示:没有开关的电路图。 提示:在电路中接入开关,通过开关可以控制开关的亮与灭。任 务:尝试将开关接入电路中,了解控制电路的方法。 活动:以小组为单位将开关接入电路中。 汇报:可以在电路中接入开关控制灯泡的亮与灭。开关处于“开”的状态,灯泡不亮; 开关处于“闭”的状态,灯泡就亮。 小结:开关能通过让电路形成闭合或断开的状态来控制电路。 2.活动2:开关加在哪里 提示:电源、灯泡、开关连接好后,当开关处于闭合状态时,电路构成了闭合回路,当开关处于打开状态时,电路就断开了。 任务:若要控制同一电路中的两个灯泡的亮与灭,如何在电路中连接开关?出 示:电路元件图。 要求:先在图上画一画连接起来方法再尝试动手操作,可以最后把电路是怎么连接的用简图画下来。完成学生活动手册内容。 活动:学生以小组为单位研究怎么连接导线。 汇报:利用实物和电路的连接简图这两个内容,分别从不同的连接方法汇报如何连接导线。 评价:根据学生是否能说明白怎么控制两个灯泡是否能同时发光进行评价。根据学

新粤教版四年级上册科学第21课《控制灯泡的亮与灭》教学设计

第21课《控制灯泡的亮与灭》教学设计 一、教材分析 本课是粤教科技版《科学》四年级上册第4单元“简单电路”的第3课。本课活动是通过研究开关的作用,让学生认识到开关可以连接和断开闭合电路,知道开关是控制电路的元件。 本课共由2个活动组成。活动1“开关的作用”,主要是把开关接入一个简单电路中,控制灯泡的亮与灭,认识到开关的作用是连接和断开电路。活动2“开关加在哪里”是让学生在有两个灯泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时需要把开关安装在不同位置。 二、学情分析 四年级的学生已经在生活中对开关有了比较多的了解,有动手操作开关的基础,对开关的作用有了基本的感性认识,但开关控制电路的原理是什么,这一点学生一般没有去了解。对于在只有一个灯泡的简单电路中接入开关,学生能很快理解并掌握。但是增加一个灯泡后变成两个灯泡的电路,如何同时控制两个灯泡的亮与灭,或者分别控制每个灯泡的亮与灭,这需要教师引导学生根据前一课的学习基础进行思考,激发他们从闭合回路方面去寻找连接方法。同时在前面的学习中经历过画电路图,学生有能力将连接的方法用简图画出来。 三、教学目标 1.知道开关能连通和断开电路。 2.观察常用的各种开关,了解控制电路的方法。 3.养成节约用电的习惯。

四、教学重、难点 教学重点:通过用开关来控制电路的探究活动,认识开关如何控制电路。 教学难点:在有两个灯泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时开关加在哪里。 五、教学准备 教具准备:多媒体教学仪器、实物投影、 教学课件等。学具准备:灯泡、导线、电池、 开关、学生活动册等。 六、教学过程 (一)任务驱动 设置情境:几个小朋友在玩电灯笼,其中波波自己制作的电灯笼中的灯泡一直在亮着。 问题:能不能在这个电灯笼加一个开关? 交流:对教科书中妍妍提出的问题进行思考。 任务:在电路中接入开关,控制电路中灯泡的亮与灭。 (二)活动探究 1.活动1:开关的作 用 出示:没有开关的电路图。 提示:在电路中接入开关,通过开关可以控制 开关的亮与灭。任务:尝试将开关接入电路中,了 解控制电路的方法。

四年级上册科学教案第4单元第28课控制灯泡的亮与灭粤教版

第四单元电与电路 第28课控制灯泡的亮与灭 教学目标 1.经历观察、动手操作和描述手电筒开关特点的活动过程。 2.经历设计和制作一个小开关的活动过程,并在活动中培养学生动手实践和创造能力。 3.经历一个设计装置红绿灯的活动过程。 重点:知道开关的作用,开关应该如何连接。 难点:经历设计和制作一个小开关的活动过程,并在活动中培养学生动手实践和创造能力。 设计:提出问题——观察——实验探究——交流汇报——分析小结 方法:观察比较,讨论发现。 教学过程 一、引入。 我们已经学过怎样点亮小灯泡了,点亮小灯泡的电路是什么样的? 二、观察手电筒。 1、观察手电筒的组成材料,讨论为什么有些地方要用导体,有些地方要用绝缘体。 2、观察手电筒的构造,比一比和小灯泡的电路有什么相同和不同。 3、观察并操作手电筒的开关,体验开关是怎样控制小灯泡的亮和灭的。

4、游戏,用手电筒相互发信号。 【设计意图:通过借助手电筒构造的观察,让学生发现控制灯泡亮灭的关键在于“开关”的设计,以此为契机,在简单电路中设计制作一个装置——开关来控制小灯泡的亮与灭。】 三、给小电灯做一个开关。 1、在一个断开的电路上,小组讨论用什么材料来控制小电灯的亮和灭? 2、进行扣押式开关的组装活动,把回形针扯开,用图钉把一头固定,做成一个回形针开关。 3、再利用回形针,将一头翘起,一头固定,做一个按压式开关。 4、利用自己准备的材料,讨论并设计、制作一个小开关,全班交流。 四、红灯、绿灯和黄灯。 1、利用每组准备好的材料,小组合作制作一个能交叉控制红绿灯的电路和开关。推测一下,什么时候红灯亮,什么时候绿灯亮。 2、在控制红绿灯装置的电路中,再增加一个连接有黄灯的电路。使红灯变绿灯,绿灯变红灯的时候,中间亮起一盏黄灯。小组讨论制作。 五、交流汇报。 1、在小组活动中发现了哪些问题,解决了哪些问题,还有哪些问题没有解决。一共运用了几种小开关的制作方法。自己做的红绿灯是怎样控制的,和生活中的红绿灯有什么区别。

粤教粤科版小学科学四上第四单元第21课控制灯泡的亮与灭教学设计

粤教粤科版小学科学四上第四单元第21课控制灯泡的亮与灭教学设计 第21课《控制灯泡的亮与灭》教 学设计 一、教材分析 本课是粤教科技版《科学》四年级上册第4单元“简单电路” 的第3课。本课活动是通过研究开关的作用,让学生认识到开关可 以连接和断开闭合电路,知道开关是控制电路的元件。 本课共由2个活动组成。活动1“开关的作用”,主要是把开关接入一个简单电路中,控制灯泡的亮与灭,认识到开关的作用 是连接和断开电路。活动2“开关加在哪里”是让学生在有两个灯 泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时需要 把开关安装在不同位置。 二、学情分析 四年级的学生已经在生活中对开关有了比较多的了解,有动手操作开关的基础,对开关的作用有了基本的感性认识,但开关 控制电路的原理是什么,这一点学生一般没有去了解。对于在只 有一个灯泡的简单电路中接入开关,学生能很快理解并掌握。但

是增加一个灯泡后变成两个灯泡的电路,如何同时控制两个灯泡 的亮与灭,或者分别控制每个灯泡的亮与灭,这需要教师引导学 生根据前一课的学习基础进行思考,激发他们从闭合回路方面去 寻找连接方法。同时在前面的学习中经历过画电路图,学生有能 力将连接的方法用简图画出来。 三、教学目标 1.知道开关能连通和断开电路。 2.观察常用的各种开关,了解控制电路的方法。 3.养成节约用电的习惯。 四、教学重、难点 教学重点:通过用开关来控制电路的探究活动,认识开关如何 控制电路。 教学难点:在有两个灯泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时开关加在哪里。

2 粤教科技版《科学》四年级上册教学设计 五、教学准备 教具准备:多媒体教学仪器、实物投影、教学课件等。学 具准备:灯泡、导线、电池、开关、学生活动册等。 六、教学过程 (一)任务驱动 设置情境:几个小朋友在玩电灯笼,其中波波自己制作的电灯笼中的灯泡一直在亮着。 问题:能不能在这个电灯笼加一个开关? 交流:对教科书中妍妍提出的问题进行思考。 任务:在电路中接入开关,控制电路中灯泡的亮与灭。 (二)活动探究 1.活动1:开关的作用 出示:没有开关的电路图。 提示:在电路中接入开关,通过开关可以控制开关的亮与灭。任 务:尝试将开关接入电路中,了解控制电路的方法。 活动:以小组为单位将开关接入电路中。 汇报:可以在电路中接入开关控制灯泡的亮与灭。开关处于“开”的状态,灯泡不亮; 开关处于“闭”的状态,灯泡就亮。 小结:开关能通过让电路形成闭合或断开的状态来控制电路。 2.活动2:开关加在哪里 提示:电源、灯泡、开关连接好后,当开关处于闭合状态时,电路构成了闭合回路,当开关处于打开状态时,电路就断开了。 任务:若要控制同一电路中的两个灯泡的亮与灭,如何在电路中连接开关?出 示:电路元件图。 要求:先在图上画一画连接起来方法再尝试动手操作,可以最后把电路是怎么连接的用简图画下来。完成学生活动手册内容。 活动:学生以小组为单位研究怎么连接导线。 汇报:利用实物和电路的连接简图这两个内容,分别从不同的连接方法汇报如何连接导线。 评价:根据学生是否能说明白怎么控制两个灯泡是否能同时发光进行评价。根据学

01控制一个LED 灯的亮和灭

第一课,了解单片机及单片机的控制原理和DX516 的用法,控制一个LED 灯的亮和灭 本章学习内容: 单片机基本原理,如何使用DX516 仿真器,如何编程点亮和灭掉一个LED 灯,如何进入KEILC51uV 调试环境,如何使用单步,断点,全速,停止的调试方法 聂小猛2006 年6 月 单片机现在是越来越普及了,学习单片机的热潮也一阵阵赶来,许多人因为工作需要或者个人兴趣需 要学习单片机。可以说,掌握了单片机开发,就多了一个饭碗。 51 单片机已经有30 多年的历史了,在中国,高校的单片机课程大多数都是51,而51 经过这么多年 的 发展,也增长了许多的系列,功能上有了许多改进,也扩展出了不少分支。而国内书店的单片机专架上, 也大多数都是51 系列。可以预见,51 单片机在市场上只会越来越多,功能只会越来越丰富,在可以预见的 数十年内是不可能会消失的。 作为一个初学者,如何单片机入门?需要那些知识和设备呢?知识上,其实不需要多少东西,会简单 的 C 语言,知道51 单片机的基本结构就可以了。一般的大学毕业生都可以快速入门,自学过这 2 门课程的 高中生也够条件。 就算你没有学过单片机课程,只掌握了 C 语言的皮毛,通过本系列的教程,您也会逐渐的进入单片机 的大门。当然在学习的过程中,您还是必须多去研读单片机书籍,了解他们的基本结构及工作方式。 下面以51 为例来了解一下单片机是什么东西,控制原理又是什么? 在数字电路中,电压信号只有两种情况,高电平和低电平,用数字来记录就是 1 和0。单片机内部的 CPU,寄存器,总线等等结构都是通过1 和0 两种信号来运作的,数据也是以1 或者0 来保存的。单片机 的输入输出管脚,也就是IO 口,也是只输出或识别 1 和0 两种信号,也就是高电平和低电平。当单片机输 出一个或一组电平信号到IO 口后,外部的设备就可以读到这些信号,并进行相应操作,这就是单片机对外部的控制。当外部一个或一组电平信号送到单片机的IO 口时,单片机也可以读到这些信号,并进行分析操 作,这就是单片机对外部设备信号的读取。当然实际的操作中,这些信号可能十分复杂,必须严格地按照 规定的时间顺序(时序)输入输出。每种设备也都规定了自己的时序,只要都严格遵守,就可以控制任何 设备,做出只要你想象得出的任何事情。 您可能会再问,我如何让单片机去控制和分析外部设备呢?答案是程序,您可以编写相关的程序,并 且把他们烧写到单片机内部的程序空间,单片机在上电时,就会一步一步按照您写的程序去执行指令,做 您想做的事情。 在51 标准芯片中,有32 个输入输出IO,分为4 组,每组8 个,分别为P0 口,P1 口,P2 口,P3 口。 P1 口的8 条脚就用P1.0 至P1.7 表示,其余类似。51 就是用这32 个口来完成所有外部操作的。对于51 的 内部结构,如果您已经了解,那是最好;如果不懂,也可以先放下,在完成了本教程开始的几个章节之后, 您就会大有兴趣,自己去寻找资料阅读了。当然,如果您希望成为一个优秀的单片机开发程序员,还是必 须熟悉单片机的内部结构及工作原理,切不可偷懒! 在这一章,您将用程序去控制一个LED 发光管的亮和灭。你应该知道,LED 发光管在通过一定电流时亮,不通电就灭。为了不让LED 通过太大的电流把它烧坏,我们还要串上限流电阻。51 的IO 是弱上拉的方式,在输出高电平时,只能输出几十微安的电流到地,而在输出低电平时,VCC 电源可以输入几十毫安 的电流到IO。一般LED 需要10 毫安左右电流点亮,我们就将LED 接在电源VCC 和IO 口之间,中间串 上电阻,当IO 输出低电平时,灯就亮了,反之,灯就灭了。我们在这个程序里要控制的是P1.0。请参考一

用八个按键控制八个LED灯的亮灭

用八个按键控制八个LED灯的亮灭#include "reg51.h" int key(); int keyc; sbit led=P1^0; unsigned char keyvalue void wait(); main() { led=0; while(1) { keyc=key(); if(keyc==1) P1=0x01; if(keyc==2) P1=0x02; if(keyc==3) P1=0x04; if(keyc==4) P1=0x08; if(keyc==5)

P1=0x10; if(keyc==6) P1=0x20; if(keyc==7) P1=0x40; if(keyc==8) P1=0x80; } } int key(); { P0=0xff; if(P0!=0xff) { wait(); if(P0!=0xff) keyvalue=P0; switch (keyvalue); { case 0xfe: return 1; breke;

case 0xfd: return 2; breke; case 0xfb: return 3; breke; case 0xf7: return 4; breke; case 0xef: return 5; breke; case 0xdf: return 6; breke; case 0xbf: return7; breke; case 0x7f: return 8; breke; }

} } void wait() { int ms=1000; while(ms--); }

PWM控制灯亮灭

/ #include < reg51.h > #include < intrins.h > sbit K1 =P3^0 ; //增加键 sbit K2 =P3^1 ; //减少键 sbit BEEP =P3^5 ; //蜂鸣器 unsigned char PWM=0x7f ; //赋初值 void Beep(); void delayms(unsigned char ms); void delay(unsigned char t); /*********************************************************/ void main() { P0=0xff; TMOD=0x21 ; TH0=0xfc ; //1ms延时常数12M TL0=0x18 ; //频率调节 TH1=PWM ; //脉宽调节 TL1=0 ; EA=1; ET0=1; ET1=1; TR0=1 ; while(1) { do{ if(PWM!=0xff) { PWM++ ; delayms(10); } else Beep() ; } while(K1==0);

do{ if(PWM!=0x01) { PWM-- ; delayms(10); } else Beep() ; }while(K2==0); } } /*********************************************************/ // 定时器0中断服务程序. /*********************************************************/ void timer0() interrupt 1 { TR1=0 ; TH0=0xfc ; TL0=0x66 ; TH1=PWM ; TR1=1 ; P0=0x00 ; //启动输出 } /*********************************************************/ // 定时器1中断服务程序 /*********************************************************/ void timer1() interrupt 3 { TR1=0 ; P0=0xff ; //结束输出 } /*********************************************************/ //蜂鸣器子程序 /*********************************************************/ void Beep() { unsigned char i ; for (i=0; i<100; i++) { delay(100) ;

0,1控制小灯亮灭

实验名称:0/1控制小灯亮灭 一.实验目的 通过该实验实习,进一步熟悉KDS嵌入式开发系统环境和C语言以及调试方式;加强串口通信(SCI)基本原理及编程原理;理解课本中的程序代码;分别运用查询方式、中断方式实现通信。 二.实验内容 通过串口调试器,发送0/1控制小灯的亮灭 三.实验过程 1.开发板使用串口 2.main.c函数 //说明见工程文件夹下的Doc文件夹内Readme.txt文件 //========================================================= #include "includes.h" //包含总头文件 int main(void) { //1. 声明主函数使用的变量 uint_32 mRuncount; //主循环计数器 //2. 关总中断 DISABLE_INTERRUPTS; //3. 初始化外设模块 light_init(RUN_LIGHT_BLUE, LIGHT_OFF); //蓝灯初始化 light_init(RUN_LIGHT_RED, LIGHT_OFF); //蓝灯初始化 uart_init(UART_0,MCGIRCLK, 9600); //串口时钟MCGIRCLK(4000Khz) uart_init (UART_1,BUSCLK, 9600); //串口1、2使用总线时钟24000Khz uart_init (UART_2,BUSCLK, 9600); //波特率使用9600 uart_send_string(UART_0, "Hello Uart_0!\r\n"); //串口发送初始化提示 uart_send_string(UART_1, "Hello Uart_1!\r\n"); uart_send_string(UART_2, "Hello Uart_2!\r\n");//只插了串口2,所以在串口调试器中只有Hello Uart_2! //4. 给有关变量赋初值 mRuncount=0; //主循环计数器 //5. 使能模块中断 uart_enable_re_int(UART_0); //使能串口0接收中断 uart_enable_re_int(UART_1); //使能串口1接收中断 uart_enable_re_int(UART_2); //使能串口2接收中断

c51第05课,标记的用法,用一个按键控制1个LED灯的亮灭

5课,标记的用法,用一个按键控制1个LED灯的亮灭,按键去抖 这一课,我们学习怎么用一个按键K1控制1个LED灯的亮和灭两种状态。按一次 K1灯亮,再按一次K1灯灭。再按一次又亮,再按一次又灭。 我们学习一下用一个bit变量来做一个标记,然后在按键的控制下,这个标记会变化, 再根据这个标记的值,LED也输出不同的状态。 因为按键按下时可能会有抖动的情况,每次按下时,可能会发生了人难以觉察到的多 次抖动,相当于一下子按下了很多次。这会导致程序无法识别出您真正的按键意图。 但是抖动一般都是发生在刚按下键和松开键的时候,所以,我们只要避开这一段时间,等键稳定按下或者松开时,再去读它的值,一般就可以正确读取了。 所以,当读到第一次按键的值时,要延时等待一会,再处理。在松开后,也延时一会, 免得检测到松开的抖动以为又有按键。(注,更复杂的应用,需要在按下延时之后重新验证按键,为了简化和方便理解,这个例程里没有这样做。) 另外,因为程序是循环运行的,当一次按键处理后,又会再循环回来继续检测,如果 您的按键这时还没有松开,又会被读到一次新的按键,并做处理。所以我们还要做一个特殊的处理,识别到一个按键并处理完成之后,还要等待这个按键松开后,再继续循环运行。看程序:

请编译,进入仿真,全速运行,看结果。 全速后,由于light变量初始化时默认为0,所以灯是亮的。按下K1,松开后,灯灭了;再按一次K1,松开后,灯灭了。 这个例子里,我们只用一个按键就控制了灯的亮灭,这种方法可以节省了硬件资源, 也就是节省了硬件成本。在实际项目设计中,有成本优势,产品就更具竞争力。所以我们应该多学习类似的可以节省资源的方法。 作业: 改为4个按键,分别控制4个LED的亮和灭。相当应用到多个房间的单键开关灯共用一个cpu处理。

粤教粤科版小学四年级科学上册教案控制灯泡的亮与灭

控制灯泡的亮与灭 【设计意图】 通过借助手电筒构造的观察,让学生发现控制灯泡亮灭的关键在于“开关”的设计,以此为契机,在简单电路中设计制作一个装置——开关来控制小灯泡的亮与灭。 【教学目标】 1.经历观察、动手操作和描述手电筒开关特点的活动过程。 2.经历设计和制作一个小开关的活动过程,并在活动中培养学生动手实践和创造能力。 3.经历一个设计装置红绿灯的活动过程。 【教学重难点】 1.经历设计和制作一个小开关的活动过程,并在活动中培养学生动手实践和创造能力。 2.经历一个设计装置红绿灯的活动过程。 【教学准备】 观察手电筒的活动材料:每个小组每人一只外壳透明的手电筒和相应的干电池。 做一个开关的活动材料:每个小组小灯泡1枚、小灯座、电池盒、干电池各1个,电线若干、回形针1枚、其他导体、绝缘体若干。 做红绿黄灯的活动材料:每组电路装置1个、开关1个、红灯、绿灯和黄灯各1个、干电池2个、电线若干。 【教学过程】 1.引入 我们已经学过怎样点亮小灯泡了,点亮小灯泡的电路是什么样的? 2.观察手电筒 观察手电筒的组成材料,讨论为什么有些地方要用导体,有些地方要用绝缘体。 观察手电筒的构造,比一比和小灯泡的电路有什么相同和不同。 观察并操作手电筒的开关,体验开关是怎样控制小灯泡的亮和灭的。 游戏,用手电筒相互发信号。 3.给小电灯做一个开关 在一个断开的电路上,小组讨论用什么材料来控制小电灯的亮和灭?

进行扣押式开关的组装活动,把回形针扯开,用图钉把一头固定,做成一个回形针开关。 再利用回形针,将一头翘起,一头固定,做一个按压式开关。 利用自己准备的材料,讨论并设计、制作一个小开关,全班交流。 4.红灯、绿灯和黄灯 利用每组准备好的材料,小组合作制作一个能交叉控制红绿灯的电路和开关。推测一下,什么时候红灯亮,什么时候绿灯亮。 在控制红绿灯装置的电路中,再增加一个连接有黄灯的电路。使红灯变绿灯,绿灯变红灯的时候,中间亮起一盏黄灯。小组讨论制作。 5.交流汇报 在小组活动中发现了哪些问题,解决了哪些问题,还有哪些问题没有解决。一共运用了几种小开关的制作方法。自己做的红绿灯是怎样控制的,和生活中的红绿灯有什么区别。 6.延伸活动 向学生介绍遥控式开关、真空式开关和漏电保护开关等。

(仅供参考)51单片机实例-控制LED-灯的亮和灭

第一课,了解单片机及单片机的控制原理和DX516的用法,控制一个LED灯的亮和灭 本章学习内容: 单片机基本原理,如何使用DX516仿真器,如何编程点亮和灭掉一个LED灯,如何进入KEILC51uV 调试环境,如何使用单步,断点,全速,停止的调试方法 聂小猛 2006年6月 单片机现在是越来越普及了,学习单片机的热潮也一阵阵赶来,许多人因为工作需要或者个人兴趣需要学习单片机。可以说,掌握了单片机开发,就多了一个饭碗。 51单片机已经有30多年的历史了,在中国,高校的单片机课程大多数都是51,而51经过这么多年的发展,也增长了许多的系列,功能上有了许多改进,也扩展出了不少分支。而国内书店的单片机专架上,也大多数都是51系列。可以预见,51单片机在市场上只会越来越多,功能只会越来越丰富,在可以预见的数十年内是不可能会消失的。 作为一个初学者,如何单片机入门?需要那些知识和设备呢?知识上,其实不需要多少东西,会简单的C语言,知道51单片机的基本结构就可以了。一般的大学毕业生都可以快速入门,自学过这2门课程的高中生也够条件。 就算你没有学过单片机课程,只掌握了C语言的皮毛,通过本系列的教程,您也会逐渐的进入单片机的大门。当然在学习的过程中,您还是必须多去研读单片机书籍,了解他们的基本结构及工作方式。 下面以51为例来了解一下单片机是什么东西,控制原理又是什么? 在数字电路中,电压信号只有两种情况,高电平和低电平,用数字来记录就是1和0。单片机内部的CPU,寄存器,总线等等结构都是通过1和0两种信号来运作的,数据也是以1或者0来保存的。单片机的输入输出管脚,也就是IO口,也是只输出或识别1和0两种信号,也就是高电平和低电平。当单片机输出一个或一组电平信号到IO口后,外部的设备就可以读到这些信号,并进行相应操作,这就是单片机对外部的控制。当外部一个或一组电平信号送到单片机的IO口时,单片机也可以读到这些信号,并进行分析操作,这就是单片机对外部设备信号的读取。当然实际的操作中,这些信号可能十分复杂,必须严格地按照规定的时间顺序(时序)输入输出。每种设备也都规定了自己的时序,只要都严格遵守,就可以控制任何设备,做出只要你想象得出的任何事情。 您可能会再问,我如何让单片机去控制和分析外部设备呢?答案是程序,您可以编写相关的程序,并且把他们烧写到单片机内部的程序空间,单片机在上电时,就会一步一步按照您写的程序去执行指令,做您想做的事情。 在51标准芯片中,有32个输入输出IO,分为4组,每组8个,分别为P0口,P1口,P2口,P3口。P1口的8条脚就用P1.0至P1.7表示,其余类似。51就是用这32个口来完成所有外部操作的。对于51的内部结构,如果您已经了解,那是最好;如果不懂,也可以先放下,在完成了本教程开始的几个章节之后,您就会大有兴趣,自己去寻找资料阅读了。当然,如果您希望成为一个优秀的单片机开发程序员,还是必须熟悉单片机的内部结构及工作原理,切不可偷懒! 在这一章,您将用程序去控制一个LED发光管的亮和灭。你应该知道,LED发光管在通过一定电流时亮,不通电就灭。为了不让LED通过太大的电流把它烧坏,我们还要串上限流电阻。51的IO是弱上拉的方式,在输出高电平时,只能输出几十微安的电流到地,而在输出低电平时,VCC电源可以输入几十毫安的电流到IO。一般LED需要10毫安左右电流点亮,我们就将LED接在电源VCC和IO口之间,中间串上电阻,当IO输出低电平时,灯就亮了,反之,灯就灭了。我们在这个程序里要控制的是P1.0。请参考一下我们将要使用的试验板的电路图,这个试验板是在购买dx516仿真器是赠送的。

小学科学四年级上册第21课控制灯泡的亮与灭教案教学设计

小学科学四年级上册第21课控制灯泡的亮与灭教案教学设计 第21课《控制灯泡的亮与灭》教 学设计 一、教材分析 本课是粤教科技版《科学》四年级上册第4单元“简单电路” 的第3课。本课活动是通过研究开关的作用,让学生认识到开关可 以连接和断开闭合电路,知道开关是控制电路的元件。 本课共由2个活动组成。活动1“开关的作用”,主要是把开关接入一个简单电路中,控制灯泡的亮与灭,认识到开关的作用 是连接和断开电路。活动2“开关加在哪里”是让学生在有两个灯 泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时需要 把开关安装在不同位置。 二、学情分析 四年级的学生已经在生活中对开关有了比较多的了解,有动手操作开关的基础,对开关的作用有了基本的感性认识,但开关 控制电路的原理是什么,这一点学生一般没有去了解。对于在只 有一个灯泡的简单电路中接入开关,学生能很快理解并掌握。但

是增加一个灯泡后变成两个灯泡的电路,如何同时控制两个灯泡 的亮与灭,或者分别控制每个灯泡的亮与灭,这需要教师引导学 生根据前一课的学习基础进行思考,激发他们从闭合回路方面去 寻找连接方法。同时在前面的学习中经历过画电路图,学生有能 力将连接的方法用简图画出来。 三、教学目标 1.知道开关能连通和断开电路。 2.观察常用的各种开关,了解控制电路的方法。 3.养成节约用电的习惯。 四、教学重、难点 教学重点:通过用开关来控制电路的探究活动,认识开关如何 控制电路。 教学难点:在有两个灯泡的不同方法连接的电路中,同时控制两个灯泡的亮与灭时开关加在哪里。

2 粤教科技版《科学》四年级上册教学设计 五、教学准备 教具准备:多媒体教学仪器、实物投影、教学课件等。学 具准备:灯泡、导线、电池、开关、学生活动册等。 六、教学过程 (一)任务驱动 设置情境:几个小朋友在玩电灯笼,其中波波自己制作的电灯笼中的灯泡一直在亮着。 问题:能不能在这个电灯笼加一个开关? 交流:对教科书中妍妍提出的问题进行思考。 任务:在电路中接入开关,控制电路中灯泡的亮与灭。 (二)活动探究 1.活动1:开关的作用 出示:没有开关的电路图。 提示:在电路中接入开关,通过开关可以控制开关的亮与灭。任 务:尝试将开关接入电路中,了解控制电路的方法。 活动:以小组为单位将开关接入电路中。 汇报:可以在电路中接入开关控制灯泡的亮与灭。开关处于“开”的状态,灯泡不亮; 开关处于“闭”的状态,灯泡就亮。 小结:开关能通过让电路形成闭合或断开的状态来控制电路。 2.活动2:开关加在哪里 提示:电源、灯泡、开关连接好后,当开关处于闭合状态时,电路构成了闭合回路,当开关处于打开状态时,电路就断开了。 任务:若要控制同一电路中的两个灯泡的亮与灭,如何在电路中连接开关?出 示:电路元件图。 要求:先在图上画一画连接起来方法再尝试动手操作,可以最后把电路是怎么连接的用简图画下来。完成学生活动手册内容。 活动:学生以小组为单位研究怎么连接导线。 汇报:利用实物和电路的连接简图这两个内容,分别从不同的连接方法汇报如何连接导线。 评价:根据学生是否能说明白怎么控制两个灯泡是否能同时发光进行评价。根据学

相关文档
相关文档 最新文档