基于单片机的转速测量系统程序
基于单片机的转速测量系统程序
#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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [文秘资料]班长职务辞职报告
- [文秘资料]完美的辞职报告
- [文秘资料]经典的员工辞职报告
- [文秘资料]医院口腔医生辞职报告
- [文秘资料]总经理辞职报告范文四篇
- [文秘资料]超市职员个人辞职报告
- [文秘资料]村妇联主任的辞职报告
- [文秘资料]辞职报告书格式
- [文秘资料]酒店辞职报告简单范文
- [文秘资料]联通的辞职报告
- [文秘资料]2017最新私企员工辞职报告范文
- [文秘资料]2019年度医院基层党组织书记抓党建述职
- [文秘资料]工作时间长辞职报告
- [文秘资料]辞职报告怎么写出来
- [文秘资料]个人能力原因辞职报告
- [文秘资料]网络工程师辞职报告
- [文秘资料]项目部辞职报告
- [文秘资料]缝纫工辞职报告怎么写
- [文秘资料]XXX州委书记述职报告
- [文秘资料]抓基层党建工作述职报告
- (王虎应老师讲课记录)六爻理象思维
- 八个常见投影机故障排除法
- 质量专业综合知识(中级)第一章质量管理
- 煤矿班组建设实施意见
- 我国快餐业与肯德基经营模式的比较与分
- 汽车保险杠模具标准化模架技术工艺研究
- 汽车二级维护作业团体赛比赛规程
- 装卸搬运工安全操作规程
- 高效的工作方法-刘铁
- 依据《生产安全事故报告和调查处理条例
- 2015专业PS夜景亮化效果图制作教程
- 企业劳动定额定员浅析
- 中枢神经系统医学影像学本科五年制第五
- 长城汽车参观探营第三站:研发试验中心
- 小升初语文专项训练
- 建筑工程质量检测资质分类与等级标准
- 周燕珉-我国养老社区的发展现状与规划
- 《生命里最后的读书会》读后感
- 实验室管理评审报告
- CCNA思科网院教程精华之网络基础知识




