教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 范文大全 > 文秘资料 >

基于单片机的转速测量系统程序

来源:网络收集 时间:2026-08-31
导读: 基于单片机的转速测量系统程序 #includereg52.h #includeLCD1602.H //#includeAT24C02.H #define uchar unsigned char #define uint unsigned int uint num=0; //外部中断次数 uchar num1=0,flag; uint Speed_dat=0,da=500; uint Total_Dis=0; sbit k1=P1^4;

基于单片机的转速测量系统程序

#include<reg52.h>

#include"LCD1602.H"

//#include"AT24C02.H"

#define uchar unsigned char

#define uint unsigned int

uint num=0; //外部中断次数

uchar num1=0,flag;

uint Speed_dat=0,da=500;

uint Total_Dis=0;

sbit k1=P1^4;

sbit k2=P1^5;

sbit k3=P1^6;

sbit beep=P2^5;

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

void key()

{

if(!k1)

{

flag=~flag;

WRITE_LCD1602_COM(0x01);

while(!k1);

}

while(flag)

{

if(!k1)

{

flag=~flag;

init_1602();

while(!k1);

}

WRITE_LCD1602_COM(0x80+6);

WRITE_LCD1602_DAT(LCD1602_Table[da/1000]);

WRITE_LCD1602_DAT(LCD1602_Table[da%1000/100]);

WRITE_LCD1602_DAT(LCD1602_Table[da%100/10]);

WRITE_LCD1602_DAT(LCD1602_Table[da%10]);

if(!k2)

基于单片机的转速测量系统程序

{

da=da+500;

while(!k2);

}

if(!k3)

{

da=da-500;

while(!k3);

}

}

}

void main()

{

uchar dat=0;

float M_dat=0.0;

init_1602();

// Init_AT24C02();

// dat=Read_AT24C02_Random(0);

// Total_Dis=dat*256+Read_A T24C02_Random(1);

dis_Mileage();

TMOD=0X01;

TH0=(65536-1000)/256;//选择12分频的,T=1/(X/12)就是一个指令周期,如果定时没有分频,(65536-Z(初值))*T就是定时的时间

比如是12M的晶振那么设置TMOD=0x01;16位定时器模式

TH0=(65536-20000)/256;

TL0=(65536-20000)%256;就是设置了20ms的定时,请问为什么要除以256,什么意思?

回答

你问的可真多。一个简单问题牵扯这么多出来。

12MHz晶振是分频之后,把这1MHz的频率作为定时器用,所以就是1us增加一个计数。THx和TLx是两个8位寄存器共同组成16位寄存器,当TLx满出时向THx进位一次,THX 只计数1次,所以一个定时器时长就是(256-THx)*(256-TLx)。

为什么要除以256,因为256*256=65536,而2^8=256,所以不管你怎么装初值,除以256后,商永远不会大于256,这样就能方便的装入8位的THx之中而不会溢出;

TL0=(65536-1000)%256;

ET0=1;

TR0=1;

IT0=1; //边沿触发中断

基于单片机的转速测量系统程序

EX0=1;

EA=1;

while(1)

{

if(num1==100)

{

num1=0;

M_dat+=(float)(Cur_Speed/36.0); //每0.1s走的米数

}

if(M_dat>100.0)

{

M_dat-=100.0;

Total_Dis+=1;

// Write_AT24C02_Byte(0,Total_Dis/256);

// Write_AT24C02_Byte(1,Total_Dis%256);

dis_Mileage();

}

display();

key();

}

}

void T0_time() interrupt 1 //定时器0

{

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

if(num<500)

num++;

else

Speed_dat=0;

if(num1<100)

num1++;

}

void ex_0() interrupt 0 //外部中断0

{

Speed_dat=(500/num);

num=0;

if(Speed_dat>(da)/55)

{

基于单片机的转速测量系统程序

beep=~beep;

}

else

beep=1;

}

子程序

#define uchar unsigned char

#define uint unsigned int

sbit EN=P1^2;

sbit RS=P1^0;

sbit RW=P1^1;

uchar LCD1602_Table[]="0123456789";

//LCD1602显示标尺//0123456789abcdef

uchar code DIS_TAB1[]={"Speed: r/min"}; //显示当前转速uchar code DIS_TAB2[]={"Mileage: Km"}; //显示总里程uint sum_dat=0;

uchar Cur_Speed=0;

extern uint Speed_dat;

extern uint Total_Dis;

extern void delayms(uint xms);

void WRITE_LCD1602_DA T(uchar date)

{

EN=0;

RS=1;

P0=date;

EN=0;

delayms(5);

EN=1;

}

void WRITE_LCD1602_COM(uchar date)

{

EN=0;

RS=0;

P0=date;

EN=0;

delayms(5);

EN=1;

}

void init_1602()

{

unsigned char i;

RW=0;

WRITE_LCD1602_COM(0x38);

WRITE_LCD1602_COM(0x0c);

基于单片机的转速测量系统程序

WRITE_LCD1602_COM(0x06);

WRITE_LCD1602_COM(0x01);

WRITE_LCD1602_COM(0x80);

for(i=0;i<16;i++)

WRITE_LCD1602_DAT(DIS_TAB1[i]);

WRITE_LCD1602_COM(0x80+0x40);

for(i=0;i<16;i++)

WRITE_LCD1602_DAT(DIS_TAB2[i]);

}

void display()

{

static uint dat=0;

static uchar i=0;

if(i<10)

{

i++;

sum_dat+=Speed_dat;

}

else

{

i=0;

dat=sum_dat/10*60;

sum_dat=0;

}

Cur_Speed=dat;

WRITE_LCD1602_COM(0x80+6);

if(dat/10000>0)

WRITE_LCD1602_DAT(LCD1602_Table[dat/10000]);

else

WRITE_LCD1602_DAT(' ');

if(dat/1000>0)

WRITE_LCD1602_DAT(LCD1602_Table[dat%10000/1000]);

else

WRITE_LCD1602_DAT(' ');

if(dat/100>0)

WRITE_LCD1602_DAT(LCD1602_Table[dat%1000/100]);

else

WRITE_LCD1602_DAT(' ');

if(dat/10>0)

WRITE_LCD1602_DAT(LCD1602_Table[dat%100/10]);

else

WRITE_LCD1602_DAT(' ');

基于单片机的转速测量系统程序

WRITE_LCD1602_DAT(LCD1602_Table[dat%10]);

/* if(dat>15)

{

if(i<5)

BEEP=0;

else

BEEP=1;

LED1=0;

LED2=1;

}

else

{

BEEP=1;

LED1=1;

LED2=0;

} */

}

void dis_Mileage()

{

WRITE_LCD1602_COM(0x80+0x40+8);

if(Total_Dis/10000>0)

WRITE_LCD1602_DAT(LCD1602_Table[Total_Dis/10000]);

else

WRITE_LCD1602_DAT(' ');

if(Total_Dis/1000>0)

WRITE_LCD1602_DAT(LCD1602_Table[Total_Dis%10000/1000]);

else

WRITE_LCD1602_DAT(' ');

if(Total_Dis/100>0)

WRITE_LCD1602_DAT(LCD1602_Table[Total_Dis%1000/100]);

else

WRITE_LCD1602_DAT(' ');

WRITE_LCD1602_DAT(LCD1602_Table[Total_Dis%100/10]);

WRITE_LCD1602_DAT('.');

WRITE_LCD1602_DAT(LCD1602_Table[ …… 此处隐藏:2058字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于单片机的转速测量系统程序.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/fanwen/1994014.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)