历史上的今天
今天是:2025年02月20日(星期四)
2020年02月20日 | 基于单片机的电机测速proteus仿真+代码
2020-02-20 来源:51hei
基于单片机的电机测速仿真原理图如下

单片机源程序如下:
#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 } /******************************************************************** * 名称 : 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 == ' for(j=0;j<120;j++);




