2018-11-21 07:07:50 itworld123 阅读数 229
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3411 人正在学习 去看看 朱有鹏
---------------------------------------------
-- 时间:2018-11-21
-- 创建人:Ruo_Xiao
-- 邮箱:xclsoftware@163.com
---------------------------------------------

一、引脚图

二、引脚英文全称(18)

电源及时钟引脚(4)
缩写 英文全称 中文解释
Vcc (待补充) 电源
Vss (待补充) 接地
XTAL1 External Crystal Oscillator 1 芯片内部振荡电路输入端
XTAL2 External Crystal Oscillator 2 芯片内部振荡电路输出端
控制引脚(5)
缩写 英文全称 中文解释

RST

Reset

复位

EA Enable 程序存储器选择信号(内存/外部)
ALE Address Latch Enable 地址锁存允许信号(低)

PROG

Program

程序(低)

PSEN

Programmer Saving Enable

片外程序存储器读选通(低)

P3口第2功能引脚(8)
缩写 英文全称 中文解释

RXD

Receive Data

串口接收端

TXD

Transmit Data

串口发送端

INT0

Interrupt 0

外部中断0输入引脚

INT1

Interrupt 1

外部中断1输入引脚

T0

Timer 0   

定时计数器0输入引脚

T1

Timer 1

定时计数器1输入引脚

WR

Write

外部数据存储器写选通

RD

Read

外部数据存储器读选通

P0~P3 I/O口(1)
缩写 英文全称 中文解释
P1~P3 Pin1~Pin3 引脚

 

(SAW:Game Over!)

 

2017-11-06 18:05:49 mao_hui_fei 阅读数 6885
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

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

最近又要用proteus进行仿真51单片机……
1.元器件的放置:
里面都是些英文,找起来头大,下面的一些表都是常见的单片机仿真使用的原件,很方便的就能找到了。
这里写图片描述

2.电源和地的放置
反正我在元件库中找不到这两个元件,所以只好用以下办法:
鼠标右键,选择“放置”—>”终端”,里面有地(ground)和电源(power)

3.关于元器件和导线的删除
元器件的删除很容易,选中delete或者右键——删除,可是导线的删除弄了好半天,首先要退出画线的状态,然后选择左边箭头,点击要删除的线,变红后,就可以用delete删除,或者在不退出画线状态直接右键双击也可。

4,关于防放置元器件(devices)和中端(terminals)的问题
有时候在使用的时候,点P怎么也找不到元器件,这是因为你之前可能使用了终端模式,如下图:
这里写图片描述
这里写图片描述

我们只要在空白处右键——放置——原件——form library就可以切换回来。

5、如何判断proteus里电解电容的正负
空心的为正,带斜线的为负
如图:
这里写图片描述

那么还有其他类型的如何区分,像一直一弯
则直线的为正极,弯线为负极。

6、proteus如何复制一个元器件
proteus似乎不支持快捷键复制,但是我们可以用其他方式,鼠标框选要复制的器件,然后右击该器件,在弹出的右键菜单中选择“块复制” 或者鼠标点选要复制的器件,在“编辑”菜单中选择“复制”命令。

7、PROTEUS如何删除导线上的节点
节点模式里,点击右键删除
这里写图片描述

8、proteus如何放置电池
有两个电池,其名称见下图中的元件列表
这里写图片描述

9、proteus中怎么将一张电路图中的部分电路复制到另一张电路图中
按住鼠标左键将要复制的电路部分选中,然后单击右键,选中“copy to clipboard”,在要粘贴的电路图中右键选择“paste from clipboard”

10、PROTEUS里面绘制仿真图的蓝色框框怎么让它变得更大?
中文版:点击窗口上方的工具栏中的“系统” 然后点击“图纸参数”

英文版:点击工具栏中的system 然后,sheet size

2017-04-30 08:43:42 tian_maer 阅读数 692
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3411 人正在学习 去看看 朱有鹏
1、本例利用单片机实现逻辑函数“F=(~X)Y+Z",逻辑函数的实现有两个基本途径:一是专门设计数字电路,实现逻辑功能;二是通过单片机编程来实现逻辑功能,即”软件就是硬件“。显然,用软件代替硬件有着很大的灵活性和更广阔的适用范围。也因为如此,单片机有时候会被称为”万能逻辑电路“。
2、因为单片机能够识别的输入量只有两种:高电平(逻辑1)和低电平(逻辑0),所以可以将这3个输入量分别定义为位变量(X定义为P1.5、Y定义为P1.6、Z定义为P1.7),则可以使用位运算符来实现逻辑函数
 
3、在keil c51中新建工程ex15,编写如下程序代码,并编译生成ex15.hex文件。
//实例15:万能逻辑电路“试验
#include <reg51.h>           //包含头文件
sbit F=P1^4;           //将F位定义为P1^4
sbit X=P1^5;     //将X位定义为P1^5
sbit Y=P1^6;    //将Y位定义为P1^6
sbit Z=P1^7;    //将Z位定义为P1^7
void main(void)
{
  while(1)
 {
   F = ((~X) & Y) | Z;  //将逻辑运算结果赋给F
 }
}
 
4、在proteus中新建仿真文件ex15。电路图如下所示。其中搜索按键元件时,输入关键字button进行搜索。

5、在at89c51中载入ex15.hex文件,启动仿真,当按下按键SZ时(在proteus中按下按键的动作为:将鼠标放到按键上,然后按下鼠标左键,可以看到,按键元件上的那个小方框向下移动并接触到了连线部分,这表示按键被按下了,松开鼠标左键后,按键随之被释放),P1.4上的LED点亮了。因为此时SX,SY两个按键没有按下所以X=1,Y=1,而SZ按键被按下了,所以Z=0.根据表达式可以计算F=((~1)&1)|0=0,因为F被定义为P1.4端口,所以P1.4端口上的电平为低,链接到P1.4上的LED被点亮了。
仿真效果图如下:


 
2015-07-22 20:11:11 FreeApe 阅读数 9140
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

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

官方资料

  可以去网络搜索中文版,或者到官方网站上去下载英文版。
  英文:

英文

  译文:

译文

主要内容简介

  • 影响功耗的主要因素
  • 电源系统
  • 时钟管理
  • 运行模式和低功耗模式
    • 运行模式
    • 等待模式
    • 活跃停机模式
    • 停机模式
  • 功耗与唤醒事件的测量与结果
  • 功耗管理要点

要点摘要

四种模式

  停机模式(Halt):此模式下单片机的功耗最低,振荡器,CPU和外设的时钟都被关闭,主电压调压器断电。可用复位或外部中断唤醒,唤醒后之前运行的寄存器数据等都保持不变,且从HALT处继续执行程序。

停机模式下的功耗测量结果(MVR关LPVR开):

停机模式下的功耗测量结果

运行模式下的功耗测量结果(从RAM运行,不是从Flash开始):

运行模式下的功耗测量结果

停机模式下的唤醒时间测量结果:

停机模式下的唤醒时间测量结果

测试程序

main.c
/*
Function:   电源管理:停机(Halt)模式测试,没有进入停机模式前,四个LED
                    灯是每隔1秒钟亮灭一次的,超过10秒后,自动进入停机mode,
                    然后可以通过外部中断来唤醒停机,此时程序从停机位置
                    处继续往下运行。
Date        :   2015年7月21日
Note        :   STVD + COSMIC
Author  :   yicm
Version :   0.0.9
*/
#include<stm8s003f3p.h>


/*Output Pin*/
_Bool PA3 @PA_ODR:3;
_Bool PC4 @PC_ODR:4;
_Bool PC5 @PC_ODR:5;
_Bool PC6 @PC_ODR:6;
_Bool PC7 @PC_ODR:7;
/*Input Pin*/
_Bool PC3   @PC_IDR:3;

/*电量指示灯*/
#define LED1    PA3
#define LED2    PC5
#define LED3    PC6
#define LED4    PC7
/*按键指示灯*/
#define LED5    PC4
#define KEY     PC3

/*主时钟频率为8Mhz*/
void Init_CLK(void)
{
    CLK_ICKR |= 0X01;
    CLK_CKDIVR = 0x08;
    while(!(CLK_ICKR&0x02));
    CLK_SWR=0xE1;
}

void Init_GPIO(void)
{
    /*LED 配置为推挽输出*/
    PA_DDR |= 0X08;     //PA3
    PA_CR1 |= 0X08;
    PA_CR2 &= 0XF7;
    /*PC4 -KEY LED*/
    PC_DDR |= 0X10;
    PC_CR1 |= 0X10;
    PC_CR2 &= 0XEF;

    PC_DDR |= 0XE0;     //PC5/6/7
    PC_CR1 |= 0XE0;
    PC_CR2 &= 0X1F;

    LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;LED5 = 1;
}

void Init_TIM1(void)
{
    TIM1_IER = 0x00;
    TIM1_CR1 = 0x00;

    TIM1_EGR |= 0x01;
    TIM1_PSCRH = 199/256; // 8M系统时钟经预分频f=fck/(PSCR+1) TIM1 为16位分频器 
    TIM1_PSCRL = 199%256; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms

    TIM1_CNTRH = 0x00;
    TIM1_CNTRL = 0x00;      

    TIM1_ARRH = 400/256;  // 自动重载寄存器ARR=0x01F4=500
    TIM1_ARRL = 400%256;  // 每记数500次产生一次中断,即500ms

    TIM1_CR1 |= 0x81;
    TIM1_IER |= 0x01;
}

/*PC3设置为上拉输入*/
void Init_EXTI2_GPIO(void)
{
    PC_DDR &= 0XF7; 
    PC_CR1 &= 0XF7;
    PC_CR2 |= 0X08;
}

/*上升沿和下降沿促发*/
void Init_EXTI2(void)
{
    EXTI_CR1 |= 0x30;
}

main()
{
    _asm("sim");
    Init_CLK();
    Init_GPIO();
    Init_EXTI2_GPIO();
    Init_EXTI2();
    Init_TIM1();
    _asm("rim");
    while (1);
}

/*外部中断唤醒*/
@far @interrupt void EXTI2_Hand_Fun(void)
{

}

/*定时器中断函数*/
@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
    static unsigned int i = 0;
    TIM1_SR1 &=~(0x01);

    ++i;
    if(0 == (i%50))
    {
        LED1 = ~LED1;
        LED2 = ~LED2;
        LED3 = ~LED3;
        LED4 = ~LED4;
    }
    if(i > 1000)
    {
        _asm("halt");
        i = 0;
        LED5 = ~LED5;
    }
}
stm8_interrupt_vector.c
/*  BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
 *  Copyright (c) 2007 STMicroelectronics
 */

typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {
    unsigned char interrupt_instruction;
    interrupt_handler_t interrupt_handler;
};

@far @interrupt void NonHandledInterrupt (void)
{
    /* in order to detect unexpected events during development, 
       it is recommended to set a breakpoint on the following instruction
    */
    return;
}

extern void _stext();     /* startup routine */
extern @far @interrupt void EXTI2_Hand_Fun(void);
extern @far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void);

struct interrupt_vector const _vectab[] = {
    {0x82, (interrupt_handler_t)_stext}, /* reset */
    {0x82, NonHandledInterrupt}, /* trap  */
    {0x82, NonHandledInterrupt}, /* irq0  */
    {0x82, NonHandledInterrupt}, /* irq1  */
    {0x82, NonHandledInterrupt}, /* irq2  */
    {0x82, NonHandledInterrupt}, /* irq3  */
    {0x82, NonHandledInterrupt}, /* irq4  */
    {0x82, EXTI2_Hand_Fun}, /* irq5  */
    {0x82, NonHandledInterrupt}, /* irq6  */
    {0x82, NonHandledInterrupt}, /* irq7  */
    {0x82, NonHandledInterrupt}, /* irq8  */
    {0x82, NonHandledInterrupt}, /* irq9  */
    {0x82, NonHandledInterrupt}, /* irq10 */
    {0x82, TIM1_UPD_OVF_TRG_BRK_IRQHandler}, /* irq11 */
    {0x82, NonHandledInterrupt}, /* irq12 */
    {0x82, NonHandledInterrupt}, /* irq13 */
    {0x82, NonHandledInterrupt}, /* irq14 */
    {0x82, NonHandledInterrupt}, /* irq15 */
    {0x82, NonHandledInterrupt}, /* irq16 */
    {0x82, NonHandledInterrupt}, /* irq17 */
    {0x82, NonHandledInterrupt}, /* irq18 */
    {0x82, NonHandledInterrupt}, /* irq19 */
    {0x82, NonHandledInterrupt}, /* irq20 */
    {0x82, NonHandledInterrupt}, /* irq21 */
    {0x82, NonHandledInterrupt}, /* irq22 */
    {0x82, NonHandledInterrupt}, /* irq23 */
    {0x82, NonHandledInterrupt}, /* irq24 */
    {0x82, NonHandledInterrupt}, /* irq25 */
    {0x82, NonHandledInterrupt}, /* irq26 */
    {0x82, NonHandledInterrupt}, /* irq27 */
    {0x82, NonHandledInterrupt}, /* irq28 */
    {0x82, NonHandledInterrupt}, /* irq29 */
};
2018-12-28 11:28:00 ZHI11235813 阅读数 519
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

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

首先,要先说下GPIO和引脚的区别,整理下网上提出的问题和答案。

GPIO的英文全称General-Purpose Input /Output Ports,中文意思是通用I/O端口

在单片机上,单片机有很多管脚(PIN)

除了一些特殊的PIN,比如电源,比如地线,晶振接线等等,其他很多都可以任意定义成两种功能中的一种:

1. 模块的管脚,2. GPIO

当定义为模块管脚时,PIN起模块中定义的功能。比如定义成SPI模块的管脚,那就按照具体芯片的规定,或者定义成MOSI,或者定义成MISO,或者定义成SCLK,这些不是任意的。SPI是模块,MISO等是功能管脚。

当定义成GPIO时,可以定义成高阻,输入,或者输出。这时候,就可以用作操作控制位,点LED灯等功能了。

很多模块的功能管脚,严格意义上来讲也是IO,比如CANH,CANL,所以这里为了避免混淆,就将没有定义成模块功能管脚的那些单片机管脚定义成General Purpose的IO了,以示区别。

好,现在换种说法,其实是一个意思,不过我觉得说的也很好。

在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。并且,许多设备或电路只要求有开/关两种状体就够了,比如LED的亮与灭。对这些设备的控制,使用传统的串口或者并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。

如果要操作GPIO,就必须对相应的寄存器进行操作。
一个GPIO端口至少需要两个寄存器,一个做控制用的“通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是通过控制寄存器设置的,通过控制寄存器可以设置每一位引脚的数据流向。
(GPIO相关的寄存器有,IOPIN、IOSET、IOCLR、IODIR四个寄存器。)

关于GPIO分组:

RK1108 datasheet中的截图

BOD功能说明

阅读数 280

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