单片机置数程序_单片机随机数程序 - CSDN
  • 欢迎在评论区提出宝贵意见...置数程序设计 ;设计要求:将片内RAM从20H开始的连续40个地址内容为0FEH ORG 00H MOV R0,#0D8H ;置位次数设置(256-40=0D8H) MOV R1,#20H ;设置置数开始地址 SETD:MOV A,#0...

    欢迎在评论区提出宝贵意见!

    设计要求:
    将片内RAM从20H开始的连续40个地址内容置为0FEH

    汇编源码:

    ;置数程序设计
    ;设计要求:将片内RAM从20H开始的连续40个地址内容置为0FEH
    		ORG    00H
    		MOV    R0,#0D8H			;置位次数设置(256-40=0D8H)
    		MOV    R1,#20H			;设置置数开始地址
       SETD:MOV    A,#0FEH			;将累加器A置数
            MOV    @R1,A			;将累加器的内容送入相应地址
    		INC    R1				;指向下一个地址
    		INC    R0				;次数加1
    		CJNE   R0,#00H,SETD		;判断是否达到置位次数?若为否,继续置数
    		SJMP   $
    		END
    

    C语言源码:

    /*
    置数程序设计
    设计要求:将片内RAM从20H开始的连续40个地址内容置为0FEH
    */
    #include <reg51.h>
    #include <absacc.h>
    #define uchar unsigned char
    void main(void)
    {
    	uchar i;
    	for(i=0;i<40;i++)
    	{
    		DBYTE[0x20+i]=0xFE;
    	}
    	while(1);
    }
    

    Proteus8.0仿真图
    在这里插入图片描述在这里插入图片描述当程序运行完成是,ACC中的内容为FEH,R1中的地址48H,由于源程序中R1的初始值20H,这说明执行了40次(48H-20H=28H=40),20H~40H的单元内容均为FEH,如图所示。

    展开全文
  • 51单片机超声波测距程序

    万次阅读 多人点赞 2018-08-03 17:15:51
    51单片机超声波测距程序

    51单片机超声波测距程序:
    使用模块:HC-SR04,74LS138,四位一体的8段共阴数码管等。

    /********************************************************************************************************************
    HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。
     基本工作原理:
    (1)采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号; 
    (2)模块自动发送 8个40khz 的方波,自动检测是否有信号返回; 
    (3)有信号返回,通过IO口ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
    *********************************************************************************************************************/
    #include<reg52.h> 
    #include<intrins.h> 
    
    typedef unsigned int u16;
    typedef unsigned char u8;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    u8 DisplayData[3];
    u8 code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    
    //TRIG为控制端
    sbit TRIG = P1^6; //超声波的 TRIG端  插在了P1.6口
    //ECHO 为接收端
    sbit ECHO = P1^7; //超声波的 ECHO端  插在了P1.7口
    
    u8 flag = 0; //标志定时器是否溢出
    
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能         : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
        while(i--); 
    }
    
    void init_time()
    {
        TMOD = 0x01; //选择定时器0工作 工作方式为方式1
        TH0 = 0; //装初值0
        TL0 = 0;
    
        TF0 = 0; //中断溢出标志位
        ET0 = 1; //开定时器中断
        EA = 1; // 开总中断
    }
    
    /*******************************************************************************
    * 函数名         :display(int num)
    * 函数功能       :数码管显示函数
    * 输入           : 无
    * 输出             : 无
    *******************************************************************************/
    
    void display(int num) //显示函数
    {   
        u8 i;
        if(num == -1) //当超出范围 显示999
        {
            DisplayData[0] = table[9];
            DisplayData[1] = table[9];
            DisplayData[2] = table[9];
        }
        else  //显示到前三个数码管上  因为测距范围为2-400cm 故3位即可 
        {
    
            //取百位
            DisplayData[0] = table[num / 100]|0x80;
    
            //取十位
            DisplayData[1] = table[num/10%10];
    
            //取个位
            DisplayData[2] = table[num %10];
    
        }
    
        for(i=0;i<3;i++)
        {
            switch(i)    //位选,选择点亮的数码管,
            {
                case(0):
                    LSA=0;LSB=0;LSC=0; break;//显示第0位
                case(1):
                    LSA=1;LSB=0;LSC=0; break;//显示第1位
                case(2):
                    LSA=0;LSB=1;LSC=0; break;//显示第2位    
            }
            P0=DisplayData[i];//发送数据
            delay(100); //间隔一段时间扫描  
            P0=0x00;//消隐
        }
    
    }
    
    void delayed(unsigned int x) //延时xmS
    {
        unsigned int i,j;
        for(i = x; i > 0; i--)
        {
            for(j = 113; j >0; j--);
        }
    }
    
    void main()
    {
        int x; 
        u16 distance,out_TH0,out_TL0;
    
        TRIG = 0; // 先给控制端初始化为0
    
        while(1)
        {
        /*超声波传感器的使用方法:
        控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的,此时就为此次测距的时间,方可算出距离。如此不断的周期测, 就可以达到移动测量的值了*/
            init_time(); //初始化定时器
            flag = 0;    //置溢出标志位为0
            //控制口发一个10US 以上的高电平
            TRIG = 1;    
            delay(2);
            TRIG = 0;
            //等待接收端出现高电平
            while(!ECHO);
            TR0 = 1; //启动计时器 开始计时
            while(ECHO); //等待高电平结束
            TR0 = 0; //关闭低电平
    
            out_TH0 = TH0; //取定时器的值
            out_TL0 = TL0;
            out_TH0 <<= 8;  //右移8位 
            distance = out_TH0 | out_TL0; //合并为16位的值  
            distance /= 58; 
    
            if(flag == 1) //如果定时器溢出 则超出超声波测量范围
            {
                display(-1);
                flag = 0;
            }
            else
            {
                for(x =5; x >=0; x--)//加此循环只是为了将结果在数码管上停留时间长点便于观察
                {
                    display(distance);
                }
            }
            delay(600);//60ms的周期,这里不是6ms,太多会闪烁。
        }
    
    }
    
    void timer0() interrupt 1 //中断函数
    {
        flag=1; //溢出标志位置1
    }

    实验结果:
    这里写图片描述

    展开全文
  • 使用KEIL下载文件到单片机外置存储器给单片机下载程序的原理实用性要解决的难点怎样编写bootloader使用KEIL下载文件 给单片机下载程序的原理 给单片机下载程序一般有两种方法: 1,使用厂家提供的bootloader,使用...

    给单片机下载程序的原理

    给单片机下载程序一般有两种方法:
    1,使用厂家提供的bootloader,使用特定软件通过串口等方式下载二进制文件到单片机的内置flash,这种方法的局限性是只能下载到厂家bootloader定义的存储器上;
    2,使用调试器通过SWD/JTAG接口下载二进制文件。这种方式原理相对复杂,分为以下几步:
    1)下载运行在ram中的bootloader程序到目标单片机的ram中
    2)下载部分数据到目标单片机的ram中做数据缓冲
    3)bootloader把缓冲区中的数据搬运到存储器上
    4)重复2-3步直到所有数据下载完成

    实用性

    使用KEIL下载文件到单片机外置FLASH的方法适用于:
    1,项目开发中目标板没有预留其他通信接口,或者处于开发初期,没有文件传输的对应上位机又急需下载数据做项目开发用。
    2,JLINK,STLINK等调试器都提供了下载二进制文件到自定义存储器的接口,但每种不同的调试器接口都不同,需要分别适配,并且JLINK并没有提供开发bootloader的SDK。使用KEIL可以不受这些限制。
    3,较小的数据文件可以直接下载到单片机的内置存储器,或者首先下载到单片机的内置flash然后通过单片机程序搬运到外置存储器来间接实现。本方法同样适用于要下载的数据文件大于或远大于单片机内置存储器的情况。

    要解决的难点

    1,怎样编写bootloader程序
    2,KEIL软件只能下载编译好的axf程序文件,怎样把要下载的数据文件转化为axf文件

    怎样编写bootloader

    在KEIL里,这段bootloader程序被称为flash算法,打开KEIL的设置面板
    flash算法选择面板
    看到flash算法一部分来自于芯片的package包,一部分来自于mdkcore,选中一个package包中的flash算法,复制其文件路径用文件管理器打开(去掉末尾的文件名):
    复制算法的文件路径
    其中有两个文件夹,是flash算法的工程模板,复制一份出来做修改,我这里已经复制好了:
    flash算法工程模板文件夹。然后打开工程,修改生成的文件名:
    修改生成文件名
    精简FlashPrg.c文件,删除其中所有宏定义和函数的具体实现,因为我们用不到,然后保留以下函数的定义:
    flash算法函数接口定义
    针对自己的存储器实现这些接口函数,主要是Init,EraseSector,EraseChip和ProgramPage这4个函数,其他函数直接返回成功即可。
    然后修改FlashDev.c文件中的结构体参数,我这里使用的flash芯片是w25q128,根据具体的存储器做修改:
    flash参数
    现在可以编译程序,生成如下文件:
    生成的flash算法文件
    现在打开KEIL发现我们自定义的算法还是没有出现,这时打开Keil.STM32L4xx_DFP.pdsc文件,文件路径为D:\Keil_v5\ARM\Pack\Keil\STM32L4xx_DFP\2.2.0,
    在这里插入图片描述
    我这里使用notpad++打开,Ctrl+F搜索单片机型号,我这里搜索STM32L4R9ZIY,看到了想要的东西
    添加flash算法
    红框中是我添加的,同时修改flash起始地址为0x09000000和大小为0x01000000。然后保存,打开keil,发现我们的自定义flash出现在了选择框内:
    flash选择框

    使用KEIL下载文件

    KEIL只能下载axf文件,因此我们要想办法生成axf为文件,可以自己制作,但最方便的还是使用KEIL自己编译,主要有以下几步:
    1,使用bin2C软件把要下载的文件转化为C语言数组
    2,把此C语言数组添加进KEIL工程中,工程中只能有这个C语言数组,不能包含任何函数或其他数据
    3,修改链接脚本,设置程序编译地址,注释掉*.o (RESET, +First)这一行
    链接脚本
    4,编译
    编译flash文件
    会产生一个没有程序入口的警告,不管他,如图编译成功。
    5,下载
    选择自定义的flash算法,然后下载axf文件(跟平时下载程序没有任何区别)
    下载flash文件

    展开全文
  • stc51单片机串口通信程序

    万次阅读 多人点赞 2019-04-12 17:37:06
    51单片机的串口通信,是全双工的,就是可以同时收/发的,互相不影响的。 串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。 但是,对于接收或发送,确实是接收到一...

    首先请大家认真看下预备知识:_
    (耐心一点)
    51单片机的串口通信,是全双工的,就是可以同时收/发的,互相不影响的。
    串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。
    但是,对于接收或发送,确实是接收到一个字节以后才能接收下一个,不可能同时接收几个。对于送,也是同样的,发送一个字节数据后,要等发送完成了,才能再发下一个。
    接收和发送,可先定义一两个变量,如,接收用rec变量保存,发送数据在send变量中。
    发送时,SBUF=send;while(TI==0);TI=0;//这是用查询方式发送的。当一个字节的数据发送完成后,就会自动置TI=1,所以,可以查询TI=1时,就说明是发送结束了。如果是允许中断,就是会产生中断,判断TI=1,就是发送中断,要用指令清0,就是TI=0;
    接收时, 当收到一个数据后,也会自己置RI=1,通常,接收都是中断方式,所以, 当RI=1, 就会产生中断。而响应中断,执行中断程序,就要用指令清0,即中断中判断是RI=1,说明是接收中断,RI=0; 清除RI。
    接 收数据:rec=SBUF; 就行了。如果是接收一组数据,可以定义一个数组,用数组保存接收一组数据就行了。
    SBUF中不能存放数据,收到后必须立即读取,否则,下一个数据到了就被替代了。RI和TI置1,是硬件自动的,就是这么设计的,想改也改不了的。
    多个字节发送和接收,可以用循环控制次数。
    下面附上代码:(具体原理不再讲述可以自己搜一下学一学)

    /**************************************************************************************
    *		              串口通信实验												  *
    实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示
    			在串口助手上。
    注意事项:无。																				  
    ***************************************************************************************/
    
    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    
    /*******************************************************************************
    * 函数名         :UsartInit()
    * 函数功能		   :设置串口
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void UsartInit()
    {
    	SCON=0X50;			//设置为工作方式1
    	TMOD=0X20;			//设置计数器工作方式2
    	PCON=0X80;			//波特率加倍
    	TH1=0XF3;				//计数器初始值设置,注意波特率是9600的
    	TL1=0XF3;
    	ES=1;						//打开接收中断
    	EA=1;						//打开总中断
    	TR1=1;					//打开计数器
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	UsartInit();  //	串口初始化
    	while(1);		
    }
    
    /*******************************************************************************
    * 函数名         : Usart() interrupt 4
    * 函数功能		  : 串口通信中断函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void Usart() interrupt 4
    {
    	u8 receiveData;
    
    	receiveData=SBUF;//出去接收到的数据
    	RI = 0;//清除接收中断标志位
    	SBUF=receiveData;//将接收到的数据放入到发送寄存器
    	while(!TI);			 //等待发送数据完成
    	TI=0;						 //清除发送完成标志位
    }
    
    

    我的单片机是STC90C516RD+属于51系列的,我的晶振频率是11.899MHZ。
    对于初值的计算机可以使用如下软件:
    在这里插入图片描述

    其中注意:(1)计算初值时,波特率是加倍之前(对于SMOD=1时这种情况)的波特率。
    (2)软件是51波特率初值计算,还有一个是定时器初值计算,不要下载错误
    下面就是烧录程序了,连接好USB线,打开串口助手软件,设置波特率4800
    如下图:
    在这里插入图片描述
    枣红色框框里面是波特率设置的地方,波特率为4800,绿色框框和红色框框(挨着绿色的那个)是模式的设置,文本模式如图,hex模式则是数字(16进制的)。

    展开全文
  • 51单片机简洁按键程序

    千次阅读 2018-10-10 11:47:46
    最为精辟和实用的按键处理程序;1.新型的按键扫描程序;不过我在网上游逛了很久,也看过不少源程序了,没有;同时,这里面用到了一些分层的思想,在单片机当中也;以下假设你懂C语言,因为纯粹的C语言描述,所以和;...
  • 10.1 单片机数字秒表程序

    千次阅读 2016-07-07 05:36:13
    不同数据类型间的相互转换 在 C 语言中,不同数据类型之间是可以混合运算的。当表达式中的数据类型不一致时,首先转换为同一种类型,然后再进行计算。C 语言有两种方法实现类型转换,一是自动类型转换,另外一种是...
  • 51单片机LCD1602程序详解

    万次阅读 多人点赞 2015-12-15 09:50:27
    LCD1602 工业字符型液晶。1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符.特殊接口说明 RS:寄存器选择输入端 RS=1:指向数据寄存器 RS=0:指向指令寄存器RW:读写控制输入端 ...程序编写:#include #inc
  • 项目中遇到需要用电脑通过串口来控制单片机IO口,查询了一些资料,可以...将配合单片机程序单片机进行控制。 python实现的串口助手代码如下: import time; #需要调用延时函数 import serial #需要调用串口库 ...
  • 单片机 数字电压表(ADC0809)

    万次阅读 多人点赞 2020-04-04 15:59:49
    单片机 数字电压表(ADC0809) 一、简述 采用模数转换的芯片ADC0809实现设计数字电压表。例子中设计的数字电压表可以测量0~5V范围内的输入电压值,并且通过4位LED数码管显示采集的电压值,例子测量三个模拟值:4....
  • 单片机PID算法程序

    万次阅读 2013-10-10 22:05:05
    转自:... 比例,积分,微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)、微分(Differentiation)控制,简称PID控制 ... 在实际应用中,可以根据受控
  • 一个51单片机的键盘扫描程序,算法简单有效  发一个51单片机的键盘扫描程序,算法简单有效   再给大家分享一个不错按键程序(来自ourdev) /****************************************  键盘_不采用...
  • #include<reg52.h> typedef unsigned char uchar; typedef unsigned int uint; sbit a=P1^0;...uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}...
  • 蓝桥杯单片机官方驱动程序

    千次阅读 2019-02-10 17:52:11
    1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考之用, 选手可以自行编写相关代码或在该代码基础之上进行修改和调整; 2. 提供的驱动代码测试环境:12T, 8051, 12MHz IAP15F2K61S2具有内部振荡器,振荡器...
  • 51单片机C语言程序100例

    万次阅读 多人点赞 2018-04-13 13:08:30
    目录目录................................................................................................................................1函数的使用和熟悉********************************/.................
  • 单片机:什么是看门狗?

    万次阅读 多人点赞 2018-06-23 09:53:20
    看门狗是单片机里的一种技术(软硬件都可以),其目的是为了保护芯片避免其进入死循环(或者说程序跑飞)。看门狗有一个输入端和一个输出端。看门狗和单片机程序的主体部分连接,如果主体部分运行正常,那么每一段...
  • 在上一篇中《单片机实现跑马灯》中我们完成了一个漂亮的流水灯,里面有一段代码我们来分析一下吧,看看单片机是怎么理解这段代码的。 《单片机实现跑马灯》(点击图片跳转)#include  //此文件中定义了51的一些...
  • 单片机应用程序架构-时间片轮询法

    千次阅读 2019-06-21 15:29:55
    单片机应用程序框架时间片轮询法的学习。 根据所见的,学的,看的。大致分为三类程序结构。 1. 简单的前后台顺序执行程序。 2. 时间片轮询法。 3. 操作系统。 简单的顺序执行的程序,写起来往往很混乱。越复杂的需求...
  • Proteus仿真—40个单片机初学程序.

    热门讨论 2020-07-29 14:21:23
    作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢...
  • 51单片机程序存储器和数据存储器

    万次阅读 2018-01-03 11:48:22
     为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定一条指令的地址。程序计数器PC正是起到了这种作用,所以通常又称其为指令地址计数器。在程序开始执行前,必须将其起始地址。即程序的第一条指令所在的...
  • 单片机串口通信原理和控制程序

    千次阅读 2017-06-17 16:35:15
    在实际应用中,往往串口还要和电脑上的上位机软件进行交互,实现电脑软件发送不同的指令,单片机对应执行不同操作的功能,这就要求我们组织一个比较合理的通信机制和逻辑关系,用来实现我们想要的结果。 本节所...
1 2 3 4 5 ... 20
收藏数 8,085
精华内容 3,234
关键字:

单片机置数程序