2018-03-10 13:37:33 return9 阅读数 945
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18626 人正在学习 去看看 朱有鹏

I2C总线由数据线SDA和时钟线SCL两条线构成通信线路,既可以发送数据,也可以接收数据。以下为单片机模拟I2C总线通信的几个关键程序:
1、总线初始化

void main()
{
    SCl=1;
    delay();
    SDA=1;
    delay();
}
//将总线都拉高以释放总线

2、启动信号

void start()
{
    SDA=1;
    delay();
    SCL=1;
    delay();
    SDA=0;
    delay();
}
//SCL在高电平期间,SDA一个下降沿启动信号

3、应答信号

void respons()
{
    uchar i=0;
    SCL=1;
    delay();
    while(SDA==1)&&(i<255))//若在一段时间内没有收到从器件的应答则
        i++;         //主器件默认从器件已经收到数据而不在等待应答信号
    SCL=0;
    delay();
}
//SCL在高电平期间,SDA被从设备拉为低电平表示应答

4、停止信号

void stop()
{
    SDA=0;
    delay();
    SCL=1;
    delay();
    SDA=1;
    delay();
}
//SCL在高电平期间,SDA一个上升沿停止信号

5、写一个字节

void writebyte(uchar date)
{
    uchar i,temp;
    temp=date;
    for(i=0;i<8;i++)
    {
        temp=temp<<1;//temp左移一位,最高位将移入PSW寄存器的CY位中
        SCL=0;       //然后将CY赋给SDA进而在SCL的控制下发送出去
        delay();
        SDA=CY;
        delay();
        SCL=1;
        delay();
    }
    SCL=0;
    delay();
    SDA=1;
    delay();
}
//串行发送一个字节时,需要把这个字节中的8位一位一位地发出去

6、读一个字节

uchar readbyte()
{
    uchar i,k;
    SCL=0;
    delay();
    SDA=1;
    for(i=0;i<8;i++)
    {
        SCL=1;
        delay();
        k=(k<<1)|SDA;//将k左移一位与SDA进行“或”运算,
        SCL=0;      //依次把8个独立的位放入一个字节中来完成接收
        delay();
    }
    delay();
    return k;
}
同样的,接收一个字节时需将8位一位一位地接收
2016-09-16 20:49:55 baidu_35534327 阅读数 5911
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18626 人正在学习 去看看 朱有鹏


#include <reg52.h>

#define SEGPORT P0
sbit seg_select = P2^1;        
sbit bit_select = P2^0;          

unsigned char duanma[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};               
unsigned char weima[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
unsigned char TempData[8];

unsigned char shi = 20, fen = 54, miao = 55;

void display()
{
	  static unsigned char i = 0;
	  SEGPORT = 0x0;
	  seg_select = 1;
	  seg_select = 0;
	  
	  SEGPORT = 0xff;
	  bit_select = 1;
	  bit_select = 0;
	
	  SEGPORT = TempData[i];
	  seg_select = 1;
	  seg_select = 0;
	  
	  SEGPORT = weima[i];
	  bit_select = 1;
	  bit_select = 0;
	  
		i++;
	
	  if(8 == i)
		{
				i = 0;
    }  
}

void time0_init(void)
{
	  EA = 1;                              //打开总中断
	  TMOD |= 0x01;                        //设置定时器工作方式
	  TH0 = (65536 - 20000) / 256;
	  TL0 = (65536 - 20000) % 256;        //设置定时器初值
	  ET0 = 1;                           //打开定时器中断
	  TR0 = 1;

}

void timer0_isr() interrupt 1
{
	  static unsigned char i = 0;
          TH0 = (65536 - 20000) / 256;
	  TL0 = (65536 - 20000) % 256;    //设置定时器初值,
	  i++;	
	  
		if(50 == i)	
		{
				i = 0;
				miao++;
				if(60 == miao)
				{
			 
						miao = 0;
						fen++;
				  
						if(60 == fen)
						{
								fen = 0;
								shi++;
						  
								if(24 == shi)
								{
										shi = 0;
							  
								}
						}
					}
		}
		
		TempData[0] = duanma[shi / 10];
		TempData[1] = duanma[shi % 10];
		TempData[2] = 0x40;
		TempData[3] = duanma[fen / 10];
		TempData[4] = duanma[fen % 10];
		TempData[5] = 0x40;
		TempData[6] = duanma[miao / 10];
		TempData[7] = duanma[miao % 10];
}

void time1_init(void)
{
          EA = 1;
	  TMOD |= 0x10;
	  TH1 = (65536 - 20000) / 256;
	  TL1 = (65536 - 20000) % 256;
	  ET1 = 1;
	  TR1 = 1;
		
	 
}

void time1_isr() interrupt 3
{
          TH1 = (65536 - 1000) / 256;
	  TL1 = (65536 - 1000) % 256;     
	  display();
		
}               

void main()
{
	 time0_init();
	 time1_init();
	 while(1)
	 {
   
         }
						   
}


2020-02-18 19:55:19 hltx666 阅读数 161
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18626 人正在学习 去看看 朱有鹏

基于51单片机全自动洗衣机模拟控制系统电路图
在这里插入图片描述
时钟电路:接的12MHZ无源晶体,晶体两个管脚还要接两个30pf的电容并接地。有了时钟电路,单片机能有序的执行程序代码。

复位电路:51单片机复位只需要在第9脚(RST)接个高电平持续2us就可以实现。只要保证电容的充放电时间大于2us,即可实现复位,所以电路中电容值是可以改变的。按键按下系统复位,电容处于一个短路电路中,释放了所有的电能电阻两段的电压增加引起的。

显示电路:本电路采用的是2位共阳极数码管。2位共阴极数码管1.2脚分别为2个数码管的公共端分别接P0.6、P0.7。如果想让第一个数码管亮第二个不亮就P0.6输出低电平P0.7高电平,具体数字由P2.0-P2.7脚的高低电平控制。

排阻:RESPACK-8是排阻,即网络电阻器,排阻是将若干个参数完全相同的电阻集中封装在一起。他们的一个引脚都连在一起作为公共引脚,其余的引脚正常引出。如果是n个电阻构成的排阻,那么它的引脚有n+1个。一般公共脚在左边,排阻上面有红色点点标记的。接在51单片机P0口,因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻。

上拉电阻:将一个不确定的信号,通过一个电阻与电源VCC相连,固定在高电平。 作用:上拉是对器件注入电流;灌电流;当一个接有上拉电阻的IO端口设置为输入状态时,它的常态为高电平。

下拉电阻:将一个不确定的信号,通过一个电阻与GND相连,固定在低电平。 作用:下拉是从器件输出电流;拉电流。当一个接有下拉电阻的IO端口设置为输入状态时,它的常态为低电平。 上拉电阻和下拉电阻两者共同的作用是:避免电压的“悬浮”造成电路的不稳定。

蜂鸣器驱动电路:由于蜂鸣器的工作电流一般比较大,以至于单片机的IO口无法直接驱动。所以要利用放大电路来驱动,使用三极管来放大电流就可以了。在这里插入图片描述
三极管:作用是1.放大电路(工作时三极管工作在放大区)用来组成放大电路晶体三极管具有电流放大作用,实质是三极管能以基极电流微小的变化量来控制集电极电流较大的变化量。如果遇到更大功率的器件或其它交流电源可以用三极管驱动继电器,继电器再控制大电流或交流电源的设备,形成二级驱动。 2.电子开关作用(工作时三极管工作在饱和区和截止区)。

2019-10-18 23:00:24 xuxudeta 阅读数 32
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18626 人正在学习 去看看 朱有鹏

定时器程序编写思路

注意:(本文偏向于寄存器程序编写,使用库函数的也可以参考)

定时器:顾名思义就是精准定时,

优势:不同于延时函数一定需要在程序主体中运行,定时器可以独立运行,间接增加单片机多任务处理的能力。

              常见的使用有:PWM   IO模拟输出,延时函数等

1.概念解析

定时器(时间量度),在单片机系统中需要稳定的时钟源提供稳定参考信号,自身自带晶振或者外部晶振源提供。自身才能根据需求设置,一般单片机系统都配置有1-128倍等不同的倍频,当然分频也不是无限可小的详细参考如下的链接

https://blog.csdn.net/luoyir1997/article/details/81951797

2:开发思路

       1)初始化时钟计数器为0,设置定时器时钟源,根据需求完成分频倍频,或者不操作

      2)重装时钟周期:在定时器中我们在不同设计中可能对时钟节拍的需求不同,因此就可以根据需求设置定时器的时钟周期

      3)设置定时器模式:https://www.dianyuan.com/article/32264.html  ,熟悉不同MCU的模式

      4)  启动定时器

     有些单片机有捕获事件CCR和匹配事件MCR的需求,当计数需求达到满足会自行的触发中断,溢出不会触发中断,一般是和匹配寄存器同时的使用.

3.使用举例

   3.1  延时函数-STM32(库函数)

void TIM6_Delay_ms(uint16_t ms)
{
 /* 定义一个定时器基本定时初始化结构体变量 */
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
 
 /* 时钟预分频数为36000,在主频72M时,计数器每500us加1*/
 TIM_TimeBaseInitStruct.TIM_Prescaler= 35999;
 
 /* 自动重装载寄存器值 */
 TIM_TimeBaseInitStruct.TIM_Period=ms*2;
 
 /* 把上面的值配置到寄存器 */
 TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);
 
 /* 设置定时时间到了以后停止定时器计数 */
 TIM_SelectOnePulseMode(TIM6, TIM_OPMode_Single);
 
 /* 清除SR中的UIF标志 */
 TIM_ClearFlag(TIM6, TIM_IT_Update);
 
 /* 打开定时器6 */
 TIM_Cmd(TIM6, ENABLE);
 
 /* 检测定时时间是否到来 */
 while(TIM_GetFlagStatus(TIM6, TIM_IT_Update)==RESET);

 /* 软件清除更新标志 */
 TIM_ClearFlag(TIM6, TIM_IT_Update);
}
————————————————
版权声明:本文为CSDN博主「登上王者的男人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaolongwoaini99/article/details/80202591

  3.2 CC2530-C51单片机

相关设计详细参考网站:https://blog.csdn.net/return9/article/details/79469259  

参考寄存器

 

/*函数目的实现定时器查询方式进行LED的闪烁
外部晶振32MHZ,设置一个1mS的计数器*/

void  Init_timer(void)//系统在不配置的时候默认是2分频,既16M
{
    T1CTL  = 0x0d;//选择定时器128分频自由计数  自动重装0x00- 0xFFFF(16位)0.125M
    T1STAT  = 0x21;//0通道 中断4有效  
}

void LED_Timer(void)
{
  uint i = 0;
  for(i = 0;i < 100;i++)
  {
   if(IRCON)//中断标志4,计数设置为自由模式,自动清0重新计数
   {
     LED1 = 0;
    Delay_ms(10);
    LED1 = 1;
   }
  }

3.3 ARM _LPC2000系列定时器

  1)计算定时器的时钟频率,设置PR(预分频寄存器)进行分频操作

   2)设置比较匹配寄存器的初值,及其工作模式,当需要设置捕获功能的时候,则根据需求添加

   3)在使用定时器的相关中断,则需要设置定时器中断

   4)设置TCR(时钟计数寄存器)启动定时器

  定时器的计数时钟频率 = Fpclk / N+1  

  1)定时器作用

/************************************************
* 名称:Time0_init() 
* 功能:初始化定时器0,定时时间为0.1S,然后启用定时器
* 入口参数:无
* 出口参数:无
************************************************/
void Time0_init(void)
{
	T0TC = 0; //定时器初始化为0
	T0PR = 0; //时钟不分频
	T0MCR = 0x03; //设置T0MR0匹配后复位T0TC,产生中断标志
	T0MCR = Fpclk/10 ;//设置0.1S的匹配值,预装值
	T0TCR = 0x01; //定时器0定时控制寄存器启动
}

2)匹配寄存器使用,实现输出50占空比的作用%

/************************************************
* 名称:Time0_init() 
* 功能:初始化定时器0,设置MR1匹配时MAT0.1输出取反,
  然后MAT0.1实现输出翻转,最终输出占空比为50%的脉冲频率
* 入口参数:无
* 出口参数:无
************************************************/
void Time0_init1(void)
{
	T0TC = 0; //定时器初始化为0
	T0PR = 0; //时钟不分频
	T0MCR = 0x10; //设置T0MR1匹配后复位T0TC
	T0EMR = 0xC0; //T0MR1匹配后,MAT0.1输出翻转
	T0MR1 = 5000;//输出频率控制周期
	T0TCR = 0x01; //定时器0定时控制寄存器启动
}

 

 

 

 

 

 

2020-01-11 17:37:30 qq_33781700 阅读数 63
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18626 人正在学习 去看看 朱有鹏

定义一个0.1ms 的时钟周期性调用下面C函数


/*呼吸灯程序*/
void BreathingLamp(void)
{
    static uint8_t LEDTimeCount=0;
	static uint8_t LEDTimeCount_Y=0;

	LEDTimeCount++;
	if(LEDTimeCount>100)
	{
		LEDTimeCount=0;
		LEDTimeCount_Y++;
		if(LEDTimeCount_Y>200)
			LEDTimeCount_Y=0;
	}
	/* 每隔0.1ms 进来一次 */
	if(LEDTimeCount_Y<100) /*上计数*/
	{
		if(LEDTimeCount<LEDTimeCount_Y)
			bsp_LedOn(1);
		else
			bsp_LedOff(1);
   }
	else /*下减数*/
	{
		if(LEDTimeCount+100<LEDTimeCount_Y)
			bsp_LedOff(1);
		else
			bsp_LedOn(1);
 }	
}

 

            bsp_LedOn(1); /*打开LED*/
            bsp_LedOff(1); /*关闭LED*/

这两个函数根据不同的MCU自行实现。

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