单片机自行车测速系统+源程序+proteus仿真

发布者:糖三角最新更新时间:2019-12-11 来源: elecfans关键字:单片机  自行车测速系统  proteus仿真 手机看文章 扫描二维码
随时随地手机看文章

自行车测速系统仿真原理图如下

单片机源程序如下:

#include "d:c51reg51.h"

#include "d:c51intrins.h"



sbit LCM_RS=P3^0;

sbit LCM_RW=P3^1;

sbit LCM_EN=P3^7;


#define BUSY                  0x80              //常量定义

#define DATAPORT         P1

#define uchar                 unsigned char

#define uint                   unsigned int

#define L                        50


uchar str0[16],str1[16],count;

uint speed;

unsigned long time;


void ddelay(uint);

void lcd_wait(void);

void display();

void initLCM();

void WriteCommandLCM(uchar WCLCM,uchar BusyC);

void STR();

void account();



/*********延时K*1ms,12.000mhz**********/


void int0_isr(void) interrupt 0         /*遥控使用外部中断0,接P3.2口*/

{

    unsigned int temp;

        time=count;

    TR0=0;

        temp=TH0;

        temp=((temp << 8) | TL0);

    TH0=0x3c;

    TL0=0xaf;

        count=0;

    TR0=1;

        time=time*50000+temp;

}


void time0_isr(void) interrupt 1        /*遥控使用定时计数器1 */

{

   TH0 =0x3c;

   TL0 =0xaf;

   count++;

}


void main(void)

{

           TMOD=0x01;                       /*TMOD T0选用方式1(16位定时) */

    IP|=0x01;                           /*INT0 中断优先*/

    TCON|=0x11;                         /*TCON  EX0下降沿触发,启动T0*/

    IE|=0x83;  

    TH0=0x3c;

    TL0=0xaf;

  

        initLCM();

           WriteCommandLCM(0x01,1);                    //清显示屏

        for(;;)

        {

                account();

                display();

        }

}


void account()

{

        unsigned long a; 

        if (time!=0)

        {

                a=L*360000000/time;

        }

        speed=a;

}




void STR()

{

        str0[0]='S';

        str0[1]='p';

        str0[2]='e';

    str0[3]='e';

        str0[4]='d';

        str0[5]=' ';        

        str0[6]=(speed%100000)/10000+0x30;

        str0[7]=(speed%10000)/1000+0x30;

        str0[8]=(speed%1000)/100+0x30;

        str0[9]='.';

        str0[10]=(speed%100)/10+0x30;

        str0[11]=speed%10+0x30;

        str0[12]='k';

        str0[13]='m';

        str0[14]='/';

        str0[15]='h';

}


void ddelay(uint k)

{

    uint i,j;

    for(i=0;i    {

        for(j=0;j<60;j++)

                {;}

    }

}

/**********写指令到LCD子函数************/


void WriteCommandLCM(uchar WCLCM,uchar BusyC)

{

    if(BusyC)lcd_wait();

        DATAPORT=WCLCM;

    LCM_RS=0;                   /* 选中指令寄存器*/

    LCM_RW=0;                       // 写模式

    LCM_EN=1;

        _nop_();

        _nop_();

        _nop_();

    LCM_EN=0;


}


/**********写数据到LCD子函数************/


void WriteDataLCM(uchar WDLCM)

{

    lcd_wait( );            //检测忙信号

        DATAPORT=WDLCM;

    LCM_RS=1;               /* 选中数据寄存器  */

    LCM_RW=0;                   // 写模式

    LCM_EN=1;

    _nop_();

        _nop_();

        _nop_();

    LCM_EN=0;

}


/***********lcd内部等待函数*************/


void lcd_wait(void)

{

    DATAPORT=0xff;             //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色

        LCM_EN=1;

    LCM_RS=0;

    LCM_RW=1;

    _nop_();

    _nop_();

        _nop_();

    while(DATAPORT&BUSY)

        {  LCM_EN=0;

           _nop_();

           _nop_();

           LCM_EN=1;

           _nop_();

           _nop_();

        }

           LCM_EN=0;


}


/**********LCD初始化子函数***********/

void initLCM( )

{

        DATAPORT=0;

        ddelay(15);

        WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号

    ddelay(5);

    WriteCommandLCM(0x38,0);

    ddelay(5);

    WriteCommandLCM(0x38,0);

    ddelay(5);


    WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号

    WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号

    WriteCommandLCM(0x01,1);    //清屏,检测忙信号

    WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号

    WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号

}


/****显示指定坐标的一个字符子函数****/


void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

    Y&=1;

    X&=15;

    if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40

    X|=0x80;                    //指令码为地址码+0X80

    WriteCommandLCM(X,0);

    WriteDataLCM(DData);

}


/*******显示指定坐标的一串字符子函数*****/


void DisplayListChar(uchar X,uchar Y,uchar *DData)

{

    uchar ListLength=0;

    Y&=0x01;

    X&=0x0f;

    while(X<16)

    {

        DisplayOneChar(X,Y,DData[ListLength]);

        ListLength++;

        X++;

    }

}



void display()

{


        STR(); 

        DisplayListChar(0,0,str0);

           DisplayListChar(0,1,str1);

}



关键字:单片机  自行车测速系统  proteus仿真 引用地址:单片机自行车测速系统+源程序+proteus仿真

上一篇:GP2Y0E02B测距模块89c52单片机串口程序
下一篇:单片机+ULN2003A步进电机控制系统(正反转+加减速)

推荐阅读最新更新时间:2024-11-02 22:34

8位单片机随机数
8位单片机很多地方需要随机数,比如游戏的洗牌,可在timer中取数,但是随机数质 量不高。随机数是一个既简单又复杂的问题,这里的例子使用了众所周知的线性叠加法,没 有完美的方法产生随机数,不过线性叠加法是一个合适的方法,彻底解决8位机随机数的问 题。 伪随机数函数总是返回可预知的数字,像抛骰子,如果抛足够多次,那么我们得到了一 个足够长的数字序列, 3,1,5,1,4,6,5,4,6,5,4,5,6,1,3,2,1,6,4,6,5,4,3,2,1,3,2,1,4,2,3,1,3...... 如果从序列中一个接一个的取出数字,那么数字就看似随机。 问题的关键是从这序列的哪个点(数字)开始取数?这个开始的点(数字)叫做种子
[单片机]
基于单片机和FPGA的网络数据加密实现
   1 引言   随着信息技术和网络化进程的发展,网络通信安全问题日益突出。现场可编程门阵列(FPGA)以其自身设计灵活、可靠性高的优点广泛应用于加密领域。硬件实现的加密算法不占用计算机资源.加密过程完全与外部总线隔离,具有较高的数据保护能力。算法可灵活改变,具有较强的独立性。加密机由单片机,FPGA和El通信接口组成。FPGA内部算法由VHDL语言编写。该系统适用于要求数据安全较高的场合,其终端可为计算机,银行POS机等,提供数据传输的安全性和保密性。    2 流加密解密原理及算法   2.1 流加密解密原理   流密码由密钥和密码算法两部分组成,密钥一般存储在加解密设备内部,在数据传输前已设置完成。密码算法在较长
[嵌入式]
基于<font color='red'>单片机</font>和FPGA的网络数据加密实现
基于AL101单片机控制的网络交换机的设计
随着计算机性能的提高及通信量的聚增,传统局域网已经越来越超出了自身负荷,交换式以太网技术应运而生,大大提高了局域网的性能。网络交换机能显著的增加带宽,可以建立地理位置相对分散的网络。局域网交换机的每个端口可并行、安全、实时传输信息,而且性能稳定、结构灵活、易于安装、便于管理,能很好地满足企业网和电信运营商宽带接入的需求。 1 网络交换机的硬件设计 随着人们对网络应用中的安全性和高带宽的需求,网络交换机的用途越来越广。本交换机采用了AL101芯片的ROX总线,将3个8口交换芯片连接起来,组成了1个24端口交换机,满足了用户对多交换端口的需求。 1.1 电路性能要求 交换机的高速PCB电路板,在EMC和ESD上都有比较高的要求
[单片机]
基于AL101<font color='red'>单片机</font>控制的网络交换机的设计
Microchip推出增强型中档8位PIC®单片机
全球领先的单片机和模拟半导体供应商——Microchip Technology Inc.(美国微芯科技公司)今天宣布,面向中国市场推出采用Microchip增强型中档8位内核的首批6款PIC16F193X系列单片机(MCU)。PIC16F1934、PIC16LF1934、PIC16F1936、PIC16LF1936、PIC16F1937和PIC16LF1937 MCU为中国市场提供可用于许多应用的高端性能和功能。该系列增加的存储容量和内核性为编程人员增强了对C和汇编语言支持,“LF”系列产品采用Microchip的nanoWatt XLP™技术,以极低的功耗使设计的电池寿命能够达到世界最佳。这些MCU还提供直接LCD驱动,并
[单片机]
单片机看门狗程序
/*此程序实现单片机"看门狗"WDT的功能*/ #include "p18f458.h" unsigned long i; /*系统初始化子程序*/ void initial() { TRISD = 0X00; /*D口设为输出*/ } /*延时子程序*/ void DELAY() { for (i=19999;--i;) continue; } /*主程序*/ main () { initial(); /*初始化,设定看门狗的相关寄存器*/ PORTD = 0X00; /*D口送00H,发光二极管亮*/ DELAY(); /*给予一定时间的延时*/ PORTD = 0XFF; /*D口送FFH,发光二极管
[单片机]
飞思卡尔单片机RAM与flash相关问题
最近在做飞思卡尔16位单片机的在线升级bootloader程序。有2个问题不太清楚,请教下论坛里的高人。 1.bootloader程序中,对存放应用程序的flash空间进行擦除和写入新的应用程序以完成升级。比较特别的是,需要将flash操作代码拷贝到ram中执行,这是为什么?bootloader程序所在flash空间设置为被保护状态,不会误擦除,而且运行到哪个函数自然会把函数压栈到RAM里执行吧?为什么还要特地拷贝到RAM里呢? 2.单片机上电初始化后,RAM存储初始化全局变量,这些全局变量是从调试器烧进去的S19文件中获取的吗?每次程序都是从bootloader的main函数开始执行,确定不是升级状态后跳转到应用程序重映射的re
[单片机]
AVR单片机片内AD数字模拟转换器程序
/*AVR片内的AD转换器程序,本测试程序是把内部的AD转换器设置为连续转换模式,更多模式相见手册的191-207页*/ #include iom16v.h #define uchar unsigned char #define uint unsigned int #define set_bit(a,b) a|=(1 b) #define clr_bit(a,b) a&=~(1 b) #define get_bit(a,b) a&(1 b) uchar ADC_8bit()//AD转换函数 { ADMUX=0xe0;//*REFS1:0=11H表示参考电压由内部2。56V供电AREF引脚加电容? // ADL
[单片机]
爱普特32位MCU在电机控制上的应用
在物联网飞速发展的科技时代,电机作为各类设备的动力核心,其控制技术的优劣直接决定了设备的性能和效率。而爱普特 32 位 MCU 的出现,为电机控制领域带来了全新的突破和变革。 电机,这个看似普通却又至关重要的装置,如同现代社会的“隐形引擎”,默默驱动着我们生活和工业生产的方方面面。从日常的家用电器,到复杂的工业机械,电机无处不在。然而,要让电机稳定、高效、精准地运行,并非易事。这背后离不开先进的控制技术,而其中的关键之一,就是高性能的 MCU 芯片。 在电机的广泛应用中,其工作环境往往十分苛刻。各种外界因素,如温度的剧烈变化、机械振动的冲击、电流的波动以及复杂的电磁干扰等,都可能对电机的正常运行造成影响。为了应对这些挑战,
[嵌入式]
爱普特32位<font color='red'>MCU</font>在电机控制上的应用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved