
求程序延时时间有几种方法;
编译成汇编,查汇编指令表自己技术时间。
通过单片机的开发环境,查运行时间。例如在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实验的时候做的,修改了一下。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)