2017-02-25 09:45:14 sum_TW 阅读数 6432

让灯可以闪烁,通过延时达到目的:

/*-----------------------------------------------
    内容:点亮P1口的1个LED灯闪烁
        该程序是单片机学习中最简单最基础的,
		通过程序了解如何控制端口的高低电平
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义

sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口,
//LED是自己任意定义且容易记忆的符号

void Delay(unsigned int t); //函数声明
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
                  //此方法使用bit位对单个端口赋值


while (1)         //主循环
  {
  LED0=0;            //将P1.0口赋值 0,对外输出低电平
  Delay(10000);      //调用延时程序;更改延时数字可以更改延时长度;
                     //用于改变闪烁频率
  LED0=1;            //将P1.0口赋值 1,对外输出高电平
  Delay(10000);
                     //主循环中添加其他需要一直工作的程序
  }
}
/*------------------------------------------------
 延时函数,含有输入参数 unsigned int t,无返回值
 unsigned int 是定义无符号整形变量,其值的范围是
 0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
 while(--t);
}


2011-06-01 20:53:00 icyfox_bupt 阅读数 8956

转载请注明出处:http://blog.csdn.net/icyfox_bupt/archive/2011/06/01/6460074.aspx

 

本来想把驱动库,原理图,内部原理都上传到百度文库的 ,结果被和谐了不让上传,需要的朋友留下邮箱,我会打包给你发过去的。这些文档确实很好用,对于函数的参数,内部的连线结构介绍的很清楚,真是编程必备呀!

 

上次我们讲了如何使用延时来做小灯闪烁的程序,相信大家都有所了解了,这次我们来看如何使用定时器实现小灯闪烁。

 

1、不使用中断的方法

 

     首先我们还是来看头文件,因为这次使用了定时器(timer),所以头文件要包含timer.h。

     选择闪烁的小灯,在此我们选择PC5小灯,将其使能,作为output。

     下一步是使能定时器的过程。有如下步骤:

          1、在系统中使能定时器。   函数:SysCtlPeripheralEnable()

          2、选择定时器的使用类型,函数:TimerConfigure(),  参数可以写 TIMER_CFG_32_BIT_PER (32位周期)/                                         TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_PERIODIC  (16位TIMER0A周期)  TIMER_CFG_A_CAP_COUNT(计数模式)等..

              (注:LM3S811一共有4个计数器TIMER0/1/2/3 ,默认使用减计数模式, 每个timer可以作为一个32位计数器使用,也可以作为两个16位计数器使用。具体使用方法请看技术文档)

          3、给定时器装载值:使用TimerLoadSet() 函数。

          4、使能定时器。

 

      剩下的思路很简单,让程序进入一个死循环。使用轮询检测定时器是否溢出,如果溢出则改变小灯的亮灭。因为系统的频率是一定的(在本程序中是6MHZ),所以通过改变定时器中装载的数值就可以控制小灯亮灭的时间。

      代码如下:

 

 

 

 

       设置timer的装载值为 SysCtlClockGet()/2,即为系统时钟的一半,即0.5秒溢出一次,所以小灯每秒亮灭一次。

 

2、使用中断的方法:


      中断是单片机中很重要的一部分,可以说一个完成的程序一般都会用到中断。中断,顾名思义就是在程序正常执行的时候用来打断CPU进程的,比如:当我们的程序在死循环中执行时,外部收到一个按钮的信号,这时程序就先执行我们的中断代码,接着才会继续进行循环操作。可以提高程序的效率。

      更加深刻的了解可以在http://zhidao.baidu.com/question/14979539里查找到一些有趣的解释。

   (1) 初步设置

      因为使用了中断,在头文件中我们要加入 #include "inc/hw_ints.h" 和 #include "driverlib/interrupt.h"。(定义了与中断相关的宏 和 包含中断控制器的API)

      熟练地设置好主频、输出口、定时器之后,为了使用中断我们要学习以下几个函数:

       TimerPrescaleSet(TIMER0_BASE,TIMER_A,100);  这个函数将TIMER0A 设为分频100,即现在为6MHZ/100=60000HZ

      然后用TimerLoadSet()给TIMER0A装载30000这个数值,这样就是每0.5秒造成计数器溢出一次。

      TimerIntEnable() 设置定时器的中断模式,前面一个参数是选择定时器,后面是溢出模式,有TIMER_TIMA_TIMEOUT(溢出) TIMER_CAPA_MATCH(匹配)等,我们以后都会使用。

      IntEnable()用来使中断控制器接受定时器的中断请求, IntMasterEnable()用来让全局的中断使能。

       然后主程序就可以进入死循环,因为我们的小灯会通过中断来控制。

 

    (2) 写中断函数

      在程序中断后,会自动跳转到我们预先写好的中断函数,执行我们的命令。

      在此我们写中断函数 void Timer0ATimeoutIntHandler(void) ; 在函数里我们用TimerIntClear()将中断清除,防止再次进入中断,然后控制小灯的值反向。

      写好后要在程序的最前面声明,并且在startup.s中的相应位置上写好。首先打开工程中的startup.s文件,然后将TIMER0A前的函数改为我们自定义的函数,如图:

      

 

再在上面进行声明:

 

小提示,在这里面写的时候,函数只有自己的名字,没有括号,返回值类型等东西。在写的时候,不要顶格写,笔者就因为这个错误郁闷了半天。

 

下面我们来看看整个程序的代码:

 

      在此给大家说一个小技巧,在设定GPIO端口的模式时,另外有一个函数是 GPIOPinTypeGPIOOutput() ,使用此函数能达到上面第一个代码中GPIODirModeSet()加上GPIOPadConfigSet()的效果,更简单,如GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE,GPIO_PIN_4) 就可以直接将PC4设为输出口,当然如果有高级设置,比如设置上拉电流,还是要使用代码中的方法的。

2018-04-16 10:52:53 Brianna20022012 阅读数 12182

这篇文章我在51黑电子论坛也发过,在这里再发一次。是自己在比赛的时候要使用这个esp8266模块,去查资料了解后,自己摸出来的方法。

用51单片机和esp8266实现通过手机app控制单片机小灯,也可以控制其他外设,可以自行添加。附件为源程序,app可使用附件里面的安卓手机测试app或者ios系统可以去apple store下载netassist使用。


设计目的:
给所有客户提供一个标准全功能而又经济适用的体验平台!客户拿到手直接测试,而
没有任何争议的环节。
本测试板能完成什么:
拥有本测试板,你可以无需任何其他开发工具,对ESP8266 模块进行AT 类应用与SDK类应用开发。
简单的演示功能:用安卓手机做的一个控制界面,用手机WIFI 和板载WIFI 进行数据交互,让手机控制 板载WIFI 输出数据,板载CPU 收到数据后控制板载LED,和蜂鸣器的动作!当然你还可以进过串口调试工具,直接对板载WIFI 模块进行手动测试!
测试版是一块51/AVR开发板,MCU可更换,板上资源丰富。既可以学习WiFi又能学习单片机,一举两得
下面是收到测试版后的简单说明:
1. 默认收到的开发板内有开发板测试程序,使用WiFi功能时,需要用户把程序烧写到单片机(程序烧写见“KR-51程序烧写说明”)。
2.烧写完程后,连接蓝牙模块,如下图;

上图为收到开发板的跳线的跳线帽位置,只需插USB供电,或者插上独立供电电源供电(独立供电电源不小于5V/600mA)。上电后如果电源灯不亮,请尝试多次开关(左上角开关)。正常上电后可看到模块蓝灯在间歇性闪烁,这是MCU在配置模块作为服务端,在灯无闪烁后,可以在手机上搜索到ESP8266的WiFi名称,安卓手机设置里可以看到这个WIFI,如下图


连上这个WIFI,打开手机端APP(在测试版程序文件夹里),等待模块蓝灯停止闪烁,直接点连接,可以控制LED,蜂鸣器。


  • 如果以上试过后无反应,依旧提示连接失败,请检查模块波特率和单片机是否一致。

上图:(注:此跳线用跳线帽短接3,5 和4,6,代表USB_UART和模块的串口直连,)


查看波特率方法:模块:打开03_调试工具里的“SSCOM”串口调试助手,如果这样显示 代表模块工作在115200波特率下,如果不是,可调节波特率(一般是115200或者9600),直到输出正常字符。这时可通过AT+CIOBAUD=9600,改为9600的波特率. (更多指令请参照指令说明设置)
恢复连接,插上模块,重新连接。


注:苹果手机用户可以直接在应用商场里下载netassist使用,我也是自己调试的时候发现的,这个比较好用。

相关压缩包后续会上传到csdn资源里。

2019-06-21 12:26:53 weixin_44527253 阅读数 570

单片机控制小灯间隔1S闪烁一次

2016-09-07 21:09:17 Valieli 阅读数 2495

51单片机操作小灯

 

1.电亮第一个小灯

 两种方式:

 位操作方法:

#include <reg52.h>
sbit p0=P1^0; 
void main()
{
	P0=0;
}

注:sbit为特殊功能位声明。

      P0=0;P1^0口提供低电平,使其点亮。

总线操作方法;

#include <reg52.h>
void main()
{
	P1=0xfe;
}

注:要将第一个灯泡点亮,则P1各引脚电平应为11111110(二进制),转化为十六进制为0xfe

2.点亮任意一个小灯

 点亮其他小灯,就像点亮第一个小灯是同样的原理。

 只是位声明进行变化或者十六进制数变化一下。

 各个小灯对应的十六进制分别是:0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f

3.让小灯闪烁

 以第一个小灯为例:

#include <reg52.h>

sbit p0=P1^0;
void delay()
{
    int i;
	for(i=0;i<6666;i++)
	;	
}
void main()
{
	while(1)
	{
		p0=0;
		delay();
		p0=1;
		delay();
	}
}

注:delay() 为延迟函数

4.流水灯设计

 小灯从第一个到最后一个依次闪烁:

#include <reg52.h>

const tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};	//八个小灯的地址

void delay()  //延迟函数
{
	int i;
	for(i=0;i<6666;i++)
	;
}
void main()
{
	char i;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			P1=tab[i];	//点亮小灯
			delay();
			P1=0xff; //小灯熄灭(二进制11111111的十六制形式)
			delay();
		}
	}
}

加油!

单片机-点亮小灯

阅读数 937

没有更多推荐了,返回首页