2019-01-30 09:50:40 chunyexiyu 阅读数 114
  • 单片机控制第一个外设-LED-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

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

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

最近试玩了51单片机,还是挺有意思的,板子上集成的指示有:数码指示灯,数字显示屏,还有bell音。
这样做起交互来就比较有意思了。板子支持使用KeilC51进行C语言编程,这样简单了很多。
对板子控制分为几个部分

  1. 控制指示灯点亮
  2. 控制bell响
  3. 控制数字显示屏
  4. 中断
  5. 中断定时
  6. 串口数据传输
  7. 外部中断,开关按下连接中断指示位

控制指示灯

指示灯控制比较简单,只需要相关的置位即可,8个灯对应8bit控制位

// P1的8位控制8个指示灯的显示
// 低电平点亮,0-点亮 1-熄灭
sfr P1    = 0x90;
使用时,可以直接置位
P1 = 0xF0   // 后四个light显示
也或分位控制
sbit light1 = P1^0...
sbit light8 = P1^7
light1 = 0; // 

控制bell

bell控制位就1位,在P2的第4位进行控制,低电平时发声。

// bell
sbit fm = P2^3;
fm = 0

控制数字显示

数字显示屏为7段数码管来控制,可以模拟出0-9-F这些数字,数码管显示绑定在P0的各位上;
又因为放置了4个显示数字位,又有P2的后四位作为控制位,控制显示在哪个数字显示屏上。

// digit P0, P2-4,5,6,7
unsigned char sz[18] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 
						0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0xff, 0x00};

P2 |= 0xf0;
P0 = sz[num];
P2 &= 0x8f;      // 第4个数字显示屏显示

中断控制

中断控制对于51单片机来说,有5中中断:

  1. 外部中断EX0/EX1, 启用中断IT0/IT1中断指示位 IE0 IE1
  2. 定时器中断ET0/ET1, 启用定时器TR0/TR1中断指示位 TF0 TF1
  3. 串口读写中断ES, (1/3模式通过启用定时器TR1指定速率),中断指示位 RI-接受 TI-发送

数据读写的引脚:发送-TXD-P3.0,接收-RXD-P3.1
外部中断的引脚:外部中断0-INT0-P3.2,外部中断1-INT1-P3.3
定时器的引脚:定时器0-T0,定时器1-T1
在这里插入图片描述
中断编号:0-INT0, 1-T0, 2-INT1, 3-T1, 4-DATA
interrupt 0/1/2/3/4: 0x3/0xb/0x13/0x1b/0x23 : EX0, ET0, EX1, ET1, ES : IT0-IE0, TR0-TF0, IT1-IE1, TF1, RI/TI

另外:
EA-全局中断打开位
还有一些辅助控制中断类型或中断方式等的控制位:
例如定时器的TH0/TH1/TL0/TL1/TMODE
例如串口的SCON/PCON

中断允许寄存器IE:EA null null ES ET1 EX1 ET0 EX0
控制寄存器TCON: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
中断优先级寄存器IP: null null PT2 PS PT1 PX1 PT0 PX0

// EA = 1;          // global interrupt gate 中断总开关
// ES = 1;			// receive interrupt 串口中断, 其余还有EX0-外部0,ET0-定时器0,EX1,ET1四种中断
// TR1 = 1; 		// timer 1 open	定时器1中断打开,其它还有IT0-外部中断0, IT1,TR0-定时器中断0三种中断, flag: IE0, IE1, TF0, TF1
// interrupt 0/1/2/3/4: 0x3/0xb/0x13/0x1b/0x23 : INT0, T0, INT1, T1, data : IE0, TF0, IE1, TF1, RI/TI
// TH1,TL1,TH0,TL0  timer init value high and low

下面是一个数据读写控制的中断初始化,初始化数据和时钟

void startConfig()
{
	SCON = 0x50;    // SM0SM1-01, REN-1
	TMOD = 0x20;    // M1M0-10, timer mode 2, two 8bit timers;
	PCON = 0x00;	// SMODE-0-normal speed
	TH1 = 0xfd;		// 9.6k
	TL1 = 0xfd;
	EA = 1;         // global interrupt gate 中断总开关
	ES = 1;			// receive interrupt 串口中断, 其余还有EX0-外部0,ET0-定时器0,EX1,ET1四种中断
	TR1 = 1; 		// timer 1 open	定时器1中断打开,其它还有IT0-外部中断0, IT1,TR0-定时器中断0三种中断
}

中断定时

中断定时是中断控制的一个应用,一般我们希望出现延时的时候,需要cpu把当前的任务放一放,等到时间到了再恢复任务。对于单片机而言,配有定时器的存在,可以通过定时器实现精确的延时控制。
定时器启用后是12个时钟频率加一,对于单片机而言,使用16字节的计时,也就是65536个计数次数,最大计时长度是:
最大表达计时长度计算:65536 * 12 *1000 / 时钟频率 = xx ms,51单片机
单片机时钟频率:11059200Hz = 19257600 = 38428800 = 57619200 = 11529600
最大计时长度:65536 * 12 *1000 / 11059200 = 71ms
计时50ms需要计数次数 时钟*50 / 12 / 1000 = 46080次,时钟初始使用65536 - 46080 = 19456 = 0x4C00

下面是一个定时50ms的例子:T0对应的中断号为1
// interrupt 0/1/2/3/4: 0x3/0xb/0x13/0x1b/0x23 : default INT0, T0, INT1, T1, data : IE0, TF0, IE1, TF1, RI/TI

// 定时器中断ET0/ET1, 启用定时器TR0/TR1中断指示位 TF0 TF1
// 定时器的辅助控制或中断方式控制位:TH0/TH1/TL0/TL1/TMODE
void setT0Delay50ms()
{
	TMOD= 0x01;		// timer T0 mode 1 (T1: GATE-0, C/!T-0, M1M0-00, T0: GATE-0, C/!T-0, M1M0-01)
	TH0 = 0x4C;		// init timer value	high
	TL0 = 0x00;		// init timer value low 
	EA 	= 1;		// global interrupt gate
	ET0 = 1;		// open timer T0
	TR0 = 1;		// start time T0
}									 
...
int i=0;
void onTimer() interrupt 1
{
	// flash light						   
	P1 = (0x1 << (i++ % 8)) ^ 0xFF;
	// reset timer init value
	TH0 = 0x4C;		// init timer value	high
	TL0 = 0x00;		// init timer value low 
}

串口数据传输

我们都知道任何传输都有传输速率,传输速率所描述的是每秒传输多少个字节或比特位,对于硬件而言就是电平的可接受变化次数。
那传输速率又是取决于什么呢,取决于传输数据的间隙频率和每个调制代表的比特位,有效传输速度还要考虑校验位等辅助传输位数。

传输的模式有以下4种,对于数据传输,其1/3模式也依赖于定时器的中断。
SM0/1: 00 模式0,传输速度为: fosc/12,和时钟的计数频率一致。
SM0/1: 10 模式2,传输速度:  fosc * 2SMOD/ 64。11位异步收发9位。
SM0/1: 01/11 模式1/3,传输速度: 定时器溢出频率 * 2SMOD / 32。10位异步手法8位数据,11位异步收发9位。

其中模式SM0/1-01,10位异步收发8位数据,比较常用,下面重点介绍。
在模式1或3这种模式情况下:
上节中有关定时器的使用,可以清楚定时器能够实现定时的中断。
那此时传输速率又是取决于什么呢,就是定时器的响应频率,定时器每次中断产生一次读写数据的时机,从而和外部进行精确的时序对接。而对于定时器而言,最快的响应速度时,一次计数产生溢出中断,计数器初值使用0xffff
这样我们就可以求出模式1最大支持的传输速率:
定时器溢出频率 (定时器最大每秒可以产生的中断次数为):时钟频率 / 12 = 11059200 / 12 = 921600 次
最大每秒传输速度为:定时器溢出频率 * 2SMOD / 32 = 921600 *2 / 32 = 57600 = 56k (SMOD取1时56kbit/s,取0时28kbit/s)
综上:对于模式1或3下,单片机它的串口最大速度是56kbit/s的速度。

模式1-8位数据时,接受/发送数据都存在SBUF中,数据指示是使用SCON中的TI/RI。模式2/3的9位数据时,额外使用SCON中的TB8/RB8作为存放接受或发送的第九位。

下面是一个使用模式1,SMOD=0,定时器采用1个计数一次中断,此时传输速度采用28800/s = 28kbit/s。

数据中断为interrupt4
// interrupt 0/1/2/3/4: 0x3/0xb/0x13/0x1b/0x23 : default INT0, T0, INT1, T1, data : IE0, TF0, IE1, TF1, RI/TI

void startConfig()
{
	SCON = 0x50;    // SM0SM1-01, SM2-0, REN-1, TB8-0, RB8-0, TI-0, RI-0
	TMOD = 0x20;    // M1M0-10, timer mode 2, two 8bit timers. (T1: GATE-0, C/!T-0, M1M0-10, T0: GATE-0, C/!T-0, M1M0-00)
	PCON = 0x00;	// SMODE-0-normal speed
	TH1 = 0xff;		// 28k
	TL1 = 0xff;
	EA = 1;         // global interrupt gate 中断总开关
	ES = 1;			// receive interrupt 串口中断, 其余还有EX0-外部0,ET0-定时器0,EX1,ET1四种中断
	TR1 = 1; 		// timer 1 open	定时器1中断打开,其它还有IT0-外部中断0, IT1,TR0-定时器中断0三种中断
}
unsigned char i = 1;
void receiveProc() interrupt 4
{
	unsigned char rec;
	rec = SBUF;
	RI = 0; // clear receive data flag
	SBUF = i++;
	while(!TI); // wait send data flag set to 1
	TI = 0;	    // clear send data flag
}

外部中断

外部中断对应的引脚为P3.2-INT0,P3.3-INT1,可以使用连线把这个引脚和按键对应的引脚连起来,按键时会触发外部中断。

如果没有连线的话,可以使用手动置位P3.2来触发中断,这样也能触发外部中断。

// bell
sbit fm = P2^3;

// external interrupt input: P3-2,3
sbit external0 = P3^2;

// open P3-4,5,6,7
sbit k1 = P3^4;

void externalProc0() interrupt 0
{
	fm = ~fm;
	external0 = 1;
}
void main()
{
	EA = 1;         // global interrupt gate 中断总开关
	EX0 = 1;		// external0
	IT0 = 1;	   	// open external interrupt 0
	while(1)
	{
		if (k1 == 0) // 低电平按下
		{
			external0 = 0; // 低电平触发中断
		}
	}
}

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

参考:《51单片机》书籍
参考:https://zhidao.baidu.com/question/365247757.html

2015-04-06 11:38:00 u013675234 阅读数 723
  • 单片机控制第一个外设-LED-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4000 人正在学习 去看看 朱有鹏
单片机最小系统零件,可以选择是否加1602液晶

1、两个22pf的瓷片电容
2、排针(单片机两边)
3、晶振
4、10k的电阻 1个 (复位电路)
5、10uf的电解电容1个  (复位电路)
6、按键 1个 (复位电路)
7、51单片机一块
8、排阻  (液晶)
9、自锁开关  
10、电源指示灯
11、USB母口
12、液晶插槽
13、电位器
14、单片机插槽
2011-12-07 05:11:31 tintin_studio 阅读数 675
  • 单片机控制第一个外设-LED-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

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

tintin单片机

 

Mini51开发板简介:

 

l       电源:USB取电,兼容5V,3.3V单片机,跳线选择;3.3V电源可由PL2303提供也可由ASM1117提供,跳线选择;电源开关,带自锁;一个USB电源指示灯,一个单片机电源指示灯。

l       系统与扩展:兼容51单片机DIP40封装,锁紧座设计;P0口10k排阻上拉;40Pin单排针所有引脚引出。

l       USB转串口电路:USB转串口电路,PL2303芯片,可做串口通信实验和STC单片机下载。

l       8路LED发光管:可做8路流水灯实验,接P2口,低电平点亮,电源跳线。

l       4位独立按键:作为人机对话的输入设备,接P3口。

l       LCD1602接口:可外接LCD1602做英文字符及数字等显示实验,直接插在母座上面,非常方便。带对比度调节,带背光驱动。(LCD1602根据需要选配)

l       LCD12864接口:可外接LCD12864做中英文字符及图片、数字等显示实验,直接插在母座上面,非常方便。带对比度调节,带背光驱动。(LCD12864根据需要选配)

l       蜂鸣器电路:可做蜂鸣器发声,报警声音输出等实验,P0.0接蜂鸣器控制口,跳线接通蜂鸣器电源。

l       温度传感器DS18B20接口:可做温度计、温度报警等实验。(DS18B20根据需要选配)

l       38K红外接收接口:可使HX1838等红外接收头做红外解码实验(红外遥控器需要选配)

l       485接口电路:可做485通信实验。(485芯片根据需要选配)

l       板子4个脚均用M3*6+6铜柱支撑,使开发板远离桌面,避免出现短路等意外情况;

l       USB供电/下载线 A-B

l       赠送资料(网络传送)

资源下载链接:

开发板原理图:http://download.csdn.net/detail/tintin_studio/3877133

开发板例程基础篇:http://download.csdn.net/detail/tintin_studio/3903812

开发板例程提高篇:http://download.csdn.net/detail/tintin_studio/3898316

2008-04-07 20:24:00 fishtangjinfu 阅读数 156
  • 单片机控制第一个外设-LED-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

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

1. 实验任务

如图4.3.1所示,AT89S51单片机的P1.0P1.3接四个发光二极管L1L4P1.4P1.7接了四个开关K1K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。

2. 电路原理图

4.3.1

3. 系统板上硬件连线

(1.       把“单片机系统”区域中的P1.0P1.3用导线连接到“八路发光二极管指示模块”区域中的L1L4端口上;

(2.       把“单片机系统”区域中的P1.4P1.7用导线连接到“四路拨动开关”区域中的K1K4端口上;

4.  程序设计内容

(1.       开关状态检测

对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.XRELJNB P1.XREL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV AP1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。

(2.       输出控制

根据开关的状态,由发光二极管L1L4来指示,我们可以用SETB P1.XCLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。

5. 程序框图

4.3.2

6. 方法一(汇编源程序)

                                      ORG 00H

START:                        MOV A,P1

                                      ANL A,#0F0H

                                      RR A

                                      RR A

                                      RR A

                                      RR A

                                      XOR A,#0F0H

                                      MOV P1,A

                                      SJMP START

                                      END

7. 方法一(C语言源程序)

#include <AT89X51.H>

unsigned char temp;

 

void main(void)

{

  while(1)

    {

      temp=P1>>4;

      temp=temp | 0xf0;

      P1=temp;

    }

}

8. 方法二(汇编源程序)

                                      ORG 00H

START:                         JB P1.4,NEXT1

                                      CLR P1.0

                                      SJMP NEX1

NEXT1:                       SETB P1.0

NEX1:                          JB P1.5,NEXT2

                                      CLR P1.1

                                      SJMP NEX2

NEXT2:                       SETB P1.1

NEX2:                          JB P1.6,NEXT3

                                      CLR P1.2

                                      SJMP NEX3

NEXT3:                       SETB P1.2

NEX3:                          JB P1.7,NEXT4

                                      CLR P1.3

                                      SJMP NEX4

NEXT4:                       SETB P1.3

NEX4:                          SJMP START

                                      END

9. 方法二(C语言源程序)

#include <AT89X51.H>

 

void main(void)

{

  while(1)

    {

      if(P1_4==0)

        {

          P1_0=0;

        }

        else

          {

            P1_0=1;

          }

      if(P1_5==0)

        {

          P1_1=0;

        }

        else

          {

            P1_1=1;

          }

      if(P1_6==0)

        {

          P1_2=0;

        }

        else

          {

            P1_2=1;

          }

      if(P1_7==0)

        {

          P1_3=0;

        }

        else

          {

            P1_3=1;

          }

    }

}
 
 
2015-03-07 13:06:32 lonely_Quan 阅读数 1630
  • 单片机控制第一个外设-LED-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

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

一、实验内容

8个发光二极管D1~D8分别接在单片机P0.0-P0.7端口上,一个开关接在P3.0上。要求输出端口输出“0”时,发光二极管亮。开关闭合时,开始按P0.0+P0.7、P0.1+P0.6、P0.2+P0.5、P0.3+P0.4的顺序依次点亮LED,再按P0.3+P0.4、P0.2+P0.5、P0.1+P0.6、P0.0+P0.7的顺序点亮LED,重复循环。开关断开时,立刻停止点亮指示灯。

二、实验目的

掌握80C51单片机输入输出接口使用方法,学会开关量输入输出控制的接口技术及编程方法。

三、实验设备

DELL台式机 、keilC51版本7、proteus版本6

四、实验电路图


五、程序流程图



六、程序源码

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^0;//取P3.0口
void DelayMS(uint x)//延迟子程序
{
uchar t;
while(x--)
{
for(t=0;t<120;t++);
}
}
void main()
{
P0=0x0FF; //是发光二极管灭
key=1; //对输入位P3.0写“1”	
while(1)
{
if(key==0)//判断开关是否闭合
{
P0=0x7e;
DelayMS(150);
P0=0x0bd;
DelayMS(150);
P0=0x0db;
DelayMS(150);
P0=0x0e7;
DelayMS(150);
P0=0x0e7;
DelayMS(150);
P0=0x0db;
DelayMS(150);
P0=0x0bd;
DelayMS(150);
P0=0x7e;
DelayMS(150);
}
}
}



一项失败的工作

阅读数 302

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