×
单片机 > 单片机程序设计 > 详情

基于单片机的电机测速proteus仿真+代码

发布时间:2020-08-26 发布时间:
|

基于单片机的电机测速仿真原理图如下

单片机源程序如下:

#include                  //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255

#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535


sbit clk = P1^3;          //ds1302时钟线定义

sbit io =  P1^4;          //数据线

sbit rst = P1^5;          //复位线

                                                           //秒  分   时   日   月  年   星期         

uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};   //写地址

uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};   //读地址

uchar code init_ds[]  ={0x55,0x17,0x15,0x01,0x01,0x13,0x13};   

uchar miao,fen,shi,ri,yue,week,nian;

uchar i;

uchar count = 0,count1 = 0,speed = 0,quan = 0;//中断次数计算,速度

unsigned long speed1,juli,time2;

float f_hz,speed_km,speed_m;


uchar flag_lc = 0;   //开始计算速度使能

uchar flag_stop_en;   //要确定车子是否停下了


uint juli_s;             //每秒走的距离

uint juli_z;         //总路程

float zhijing = 0.55;  //直径 0.55M

uint s_zhijing = 55;



uchar menu_1;        //菜单设置变量

uchar menu_2;        //菜单设置变量


long zong_lc;        //总量程


uchar flag_200ms;

uint shudu;   //定义速度的变量

uint bj_shudu = 80;         //报警速度



//这三个引脚参考资料

sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit e =P1^2;         //片选信号   下降沿触发


uchar code table_num[]="0123456789abcdefg";

uchar i;


sbit beep = P3^7;   //蜂鸣器IO口定义




/******************1ms 延时函数*******************/

void delay_1ms(uint q)

{

        uint i,j;

        for(i=0;i

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

}



/********************************************************************

* 名称 : delay_uint()

* 功能 : 小延时。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay_uint(uint q)

{

        while(q--);

}


/********************************************************************

* 名称 : write_com(uchar com)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void write_com(uchar com)

{

        i =0;

        e=0;

        rs=0;

        rw=0;

        P0=com;

        delay_uint(3);

        e=1;

        delay_uint(25);

        e=0;

}


/********************************************************************

* 名称 : write_data(uchar dat)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

void write_data(uchar dat)

{

        i =0;

        e=0;

        rs=1;

        rw=0;

        P0=dat;

        delay_uint(3);

        e=1;

        delay_uint(25);

        e=0;        

}


/********************************************************************

* 名称 : write_sfm2(uchar hang,uchar add,uchar date)

* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下

                  write_sfm1(1,5,23)

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void write_sfm2(uchar hang,uchar add,uint date)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

        write_data(0x30+date/10%10);

        write_data(0x30+date%10);        

}


/********************************************************************

* 名称 : write_sfm4(uchar hang,uchar add,uchar date)

* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下

                  write_sfm1(1,5,23)

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void write_sfm4(uchar hang,uchar add,uint date)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

        write_data(0x30+date/10000%10);

        write_data(0x30+date/1000%10);

        write_data(0x30+date/100%10);        

        write_data(0x30+date/10%10);

        write_data(0x30+date%10);        

        write_data('k');        

        write_data('m');        

}


void write_sfm7(uchar hang,uchar add,uint date)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

        write_data(0x30+date/100000%10);

        write_data(0x30+date/100000%10);

        write_data(0x30+date/10000%10);

        write_data(0x30+date/1000%10);

        write_data('.');        

        write_data(0x30+date/100%10);        

        write_data(0x30+date/10%10);

        write_data('k');        

        write_data('m');        

}


/***********************lcd1602上显示两位十进制数************************/

void write_sfm1(uchar hang,uchar add,uchar date)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

        write_data(0x30+date % 10);        

}



/********************************************************************

* 名称 : write_string(uchar hang,uchar add,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

                  write_string(1,5,"ab cd ef;")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void write_string(uchar hang,uchar add,uchar *p)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

                while(1)

                {

                        if(*p == '')  break;

                        write_data(*p);

                        p++;

                }        

}



/***********************lcd1602上显示两位十进制数************************/

void write_sfm2_ds1302(uchar hang,uchar add,uchar date)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

        write_data(table_num[date / 16]);

        write_data(table_num[date % 16]);        

}


/*****************控制光标函数********************/

void write_guanbiao(uchar hang,uchar add,uchar date)

{                

        if(hang==1)   

                write_com(0x80+add);

        else


关键字:单片机  电机测速  proteus仿真 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向