单片机C语言 关于延时函数

单片机C语言 关于延时函数,第1张

求程序延时时间有几种方法;

编译成汇编,查汇编指令表自己技术时间。

通过单片机的开发环境,查运行时间。例如在keiC中,编译通过后,点击debug,点击运行,可看到显示运行时间。

有些单片机公司会提供软件延时函数。也可利用哦。

c语言p1sel 0xff,基于C语言驱动CC2530的GPIO实现对信号灯控制

本问主要介绍了CC2530处理器的通用输入/输出

接口

(GPIO),以及GPIO的位 *** 作,理解GPIO的基本原理和功能,最后使用C语言驱动CC2530的GPIO实现对信号灯的控制。

CC2530的GPIO引脚有3个8位端口,分别是端口0,端口1和端口2,分别表示位P0,P1,P2,其中P0和P1是8位端口,而P2只有5位可用,所有端口均可以通过SFR

寄存器

来进行位寻址和字节寻址。

寄存器PxSEL中的x表示端口0~2,用来设置端口的每个引脚位GPIO(0)或者外部设备输入信号(1),在默认情况下,当复位之后,所有的数字输入/输出引脚都设置为通用输入引脚。

寄存器PxDIR用来改变一个端口引脚的方向,0设置为输入,1设置为输出。

GPIO一般是通过位 *** 作完成寄存器设置的,而常用的位 *** 作符有按位与“&”,按位或“|”,按位取反“~”,按位异或“^”,以及左移“<>” *** 作。值得注意的是常使用按位或运算符将一个数据位置1,比如将P0端口方向寄存器的第一位和第二位置1(P0端口的0和1引脚置为输出模式),可以写为P0DIR |= 0x03;常使用按位与“&”将一个数据位置0,比如P0SEL &= ~0x03;,表示将将端口0和1配置位GPIO模式。

通过查看

电路

图,实现CC2530微处理器开发板上的红灯亮,只需使P0_1为0即可。

驱动程序如下:

1 #include "iocc2530h"

2

3 #define uint unsigned int

4 #define uchar unsigned char

5

6 #define Rled P1_1

7 #define Gled P1_0

8 #define ON 0

9 #define OFF 1

10 #define Key1 P1_4

11

12 void delay(uint n){//定义延时函数

13 uint i, j;

14 for(i = 0; i < n; i++)

15 for(j = 500; j >= 0; j--);

16 }

17 void key_init(){

18 P1SEL &= 0x10;//GPIO模式

19 P1DIR &= 0x10;//输出模式

20 }

21 void led_init(){

22 P1SEL &= ~0x03;//GPIO模式

23 P1DIR |= 0x03; //输出模式

24

25 Rled = OFF;

26 Gled = OFF;

27 }

28 void main()

29 {

30 led_init();//led初始化

31 key_init();//案件初始化

32 Rled = ON;//打开红灯

33

34 while(1){

35 if(Key1 == ON){

36 delay(1000); //消抖

37 if(Key1 == ON){

38 while(Key1 == ON);//松手检测

39

40 Rled = ~Rled;

41 }

42 }

43 }

44 }

烧写完成后,可以看到绿灯常亮,按键被按下之后红灯改变一次状态,功能完成。

需要思考的是有时按键控制led时不太准确,后者说不太灵敏,从而引入下一节,通过中断使得按键控制led更加准确。

UTX0IF = 1; UART0发送完成标志位1

while(UTX0IF); //表示等待串口, 直到数据发送完成 如果用延时, 超过等待时间, 也行但不精确

UTX0IF = 0; 若串口数据发送完成,标志位清零。

开关控制的话就不用编程语言了好吗,因为开关是直接的物理连接,通过电路实现就好,那我就理解成你是想用单片机来实现吧,首先单片机与外设怎样连接我不考虑,因为你没说。那么我就当是我可以随意的使用单片机的输出吧,然后开关闭合理解成按键是高电平,再按一次取反。

#include<89c51h>            //是不是这个头文件记不清了。。

#defineuint unsigned int 

#defineuchar unsigned char

#define LED1 P1_0

#define LED2 P1_1

#define KEY1 P0_1

 

/ 函数声明,延迟函数,LED灯初始化函数,按键KEY初始化,按键KEY查询函数/

voidDelayMs(uint n);

voidLEDInit(void);

voidKEYInit(void);

ucharKEYScan(void);

 

/主函数/

void main()

{

   LED1 = 0;

   LED2 = 1;      //不同的接法可能导致结果不一样,有的高电平亮有的低电平

 while(1)         //具体看你自己的板子怎么接的

 {

  if(KEYScan())

    LED1 = ~LED1;

    LED2 = ~LED2;

 }

}

 

 

/检测按键状态/

ucharKEYScan(void)

{

 if(KEY1==0)

   DelayMs(100); // 延时一段时间,以免抖动

  if(KEY1==0)

  {

    DelayMs(100);

    while(KEY1==0);

    return 1;

  }

 else

   return 0;

}

 

 

/延迟函数/

voidDelayMs(uint n)

{

 int i;

 while(n--)

 {

  for(i=587;i>0;i--) ;

 }

}

以上代码是做CC2530实验的时候做的,修改了一下。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13492084.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存