基于89C51的转速测量系统设计C程序文档格式.docx
- 文档编号:17701172
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:15
- 大小:18.55KB
基于89C51的转速测量系统设计C程序文档格式.docx
《基于89C51的转速测量系统设计C程序文档格式.docx》由会员分享,可在线阅读,更多相关《基于89C51的转速测量系统设计C程序文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
//24c02初始化子程序
voiddelay(ucharx);
//延时子程序ms
voidflash();
//24c02延时子程序nop
voidstart();
//24c02ic开始
voidstop();
//24c02ic停止
voidack();
//24c02ic应答
voidnack();
//24c02ic不应答
voidwritex(ucharj);
//24c02ic写1byte数据
voiddsp();
//显示子程序
voiddelay(uchari);
//us延时
voiddelay1(uchari);
ucharreadx();
//24c02ic读1byte数据
/****************全局变量定义*******************/
ucharktemp;
uchardisp[4];
uintcount;
//预设报警值
uintzs;
//转速值
uinttime0;
//
uinttime1;
//记时器
bitbegin1;
//T1开始启动标志
ucharltj=1;
//高低速
uintjs;
//脉冲计数器
ulongt0;
ulongt1;
bitkey_set;
//设置标志
uchardisp_i[4];
//显示闪动标志
uintdisp_c;
//闪动显示计数器//借用time0
uintdisp_j;
//闪动显示定时//借用time1
bitss=0;
//闪动标志
uintbj;
//报警输出信号定时
biten_bj=0;
//允许报警标志
bitbjing=0;
//报警中
//m:
菜单级数mi:
参数标号bh:
检测保护时间1-10
ucharbh=0;
ucharm=0,mi=0;
//借用zs,js
ucharbhtm=0;
//保护检测
//bitcmi=0;
//参数设置改变标志//借用bjing
/**********************************************/
voidint_ex0()interrupt0using0
{
/*外部中断0*/
delay1(20);
if(key_set==0){///0非设置状态
if(in==0){
if(ltj==1)
{
js++;
EA=0;
TR0=0;
TL0=0xaf;
//50ms
TH0=0x3c;
/*计数初值重装*/
if(begin1==0)
{//开始记数
begin1=1;
js=0;
TR1=0;
TL1=0xaf;
TH1=0x3c;
/*计数初值重装*/
TR1=1;
/*启动T1*/
}
/*启动T0*/
TR0=1;
time0=0;
EA=1;
}
else
if(begin1==0)
begin1=1;
EA=0;
zs=0;
begin1=0;
if(time0==0)
zs=0;
{//计算转速
t0=(time0*50000+(TH0*256+TL0)-0x3caf);
if(t0>
0){zs=60000000/t0;
if(zs<
count)
{
if(en_bj==1)
out=1;
bjing=1;
//报警
disp[3]=(zs%10000)/1000;
//显示转速
disp[2]=(zs%1000)/100;
disp[1]=(zs%100)/10;
disp[0]=zs%10;
TL0=0xaf;
}///0
voidtimer0(void)interrupt1using0//记时定时中断
{uchart;
//////
time0++;
TH0=0x3c;
TR0=1;
/*启动T1*/
t=time0%20;
if(t==0){en_bj=0;
if(time0>
1200)//超时
disp[3]=0;
disp[2]=0;
disp[1]=0;
disp[0]=0;
voidtimer1(void)interrupt3using0//1s记时定时中断
/*T1中断服务程序入口*/
time1++;
if(time1==20)//1s
{EA=0;
TR1=0;
//计算转速
///////////////////
t0=time0*50000+(TH0*256+TL0)-0x3caf;
t1=1000000-t0;
t0=60*js*t0;
zs=60*js+t0/t1;
if(zs>
6000){zs=0;
if(bhtm>
=bh)
bhtm++;
bhtm=0;
if(zs==0)
{///////
///////
disp[2]=0;
disp[1]=0;
disp[0]=0;
disp[3]=zs/1000;
begin1=0;
time1=0;
en_bj=0;
//非保护状态
TL1=0xaf;
TH1=0x3c;
TR1=1;
EA=1;
voiddelay(uchari)
{ucharj;
for(j=0;
j<
=i;
j++);
voiddelay1(uchari)
voidflash()
_nop_();
//_nop_();
voidx24c02_init()
scl=1;
flash();
sda=1;
voidstart()
flash();
scl=1;
sda=0;
scl=0;
voidstop()
sda=0;
sda=1;
voidack()
scl=0;
voidnack()
voidwritex(ucharj)
uchari,temp;
temp=j;
for(i=0;
i<
8;
i++){
temp=temp<
<
1;
sda=CY;
ucharreadx()
uchari,j,k=0;
if(sda==1)j=1;
elsej=0;
k=(k<
1)│j;
return(k);
ucharx24c02_read(ucharaddr)
uchari;
start();
writex(0xa0);
ack();
writex(addr);
writex(0xa1);
i=readx();
nack();
stop();
delay(10);
return(i);
voidx24c02_write(ucharaddr,ucharinfo)
//EA=0;
//中断总禁止
writex(info);
//EA=1;
//中断开//设置状态禁止所有外部中断
voidgetdate(void)
{ucharda5,da4,da3,da2,da1,da0;
x24c02_init();
da0=(x24c02_read(0x00)%10);
da1=(x24c02_read(0x01)%10);
da2=(x24c02_read(0x02)%10);
da3=(x24c02_read(0x03)%10);
da4=(x24c02_read(0x04)%10);
da5=(x24c02_read(0x05)%10);
ltj=(x24c02_read(0x06)%10);
count=da3*1000+da2*100+da1*10+da0;
bh=da5*10+da4;
if(bh>
99){bh=0;
if(count>
6000){count=6000;
if(ltj>
1){ltj=1;
voidsavedate(void)
da5=bh/10;
da4=bh%10;
da3=count/1000;
da2=(count%1000)/100;
da1=(count%100)/10;
da0=count%10;
dsp();
x24c02_write(0x00,da0);
x24c02_write(0x01,da1);
x24c02_write(0x02,da2);
x24c02_write(0x03,da3);
x24c02_write(0x04,da4);
x24c02_write(0x05,da5);
x24c02_write(0x06,ltj);
//动态显示
voiddsp(void)
P2=ascled[disp[0]];
led0=0;
delay(50);
led0=1;
//led0=0显示,=1不显示
P2=ascled[disp[1]];
led1=0;
led1=1;
P2=ascled[disp[2]];
led2=0;
led2=1;
P2=ascled[disp[3]];
led3=0;
led3=1;
//闪烁动态显示有效
voiden_dsp(void)
{disp_j=0;
disp_i[0]=0x0;
//显示闪动标志0显示
disp_i[1]=0x0;
disp_i[2]=0x0;
disp_i[3]=0x0;
//闪烁动态显示
voiddsp_flash(void)
disp_j++;
if(disp_j>
240)
{disp_j=0;
disp_i[disp_c]=!
(disp_i[disp_c]&
0x01);
led0=disp_i[0];
led1=disp_i[1];
led2=disp_i[2];
led3=disp_i[3];
voiddisplay(void)
//设定状态时如果有键按下就不闪烁
if((ss==0)││(ktemp!
=0x1b))
dsp();
dsp_flash();
voidkbscan(void)//键盘扫描
{uchartemp,i;
//0
temp=P3;
ktemp=temp&
0x1b;
//检查key0,key1,key2,key300011011
if(ktemp!
=0x1b)
{//1
for(i=0;
250;
i++){display();
if(ktemp==(temp&
ktemp))
{//2
//keyval=ktemp;
//记录键值
if(key_set==1)
{//3
switch(ktemp){
case0x1a:
//key0
/////////////////
m++;
if(m>
2){m=1;
}
switch(m){
case1:
////显示参数名称
ss=0;
disp_c=0;
en_dsp();
switch(mi){
case0:
disp[3]=11;
////显示设定参数mi=0显示预设报警值,1显示保护检测时间
disp[2]=11;
disp[1]=10;
disp[0]=1;
break;
disp[0]=2;
case2:
////显示设定参数mi=0显示预设报警值,1显示保护检测时间,2显示高低转速测量
disp[0]=3;
////显示参数
ss=1;
switch(mi){//显示设定参数mi=0显示预设报警值,1显示保护检测时间
disp[3]=count/1000;
disp[2]=(count%1000)/100;
disp[1]=(count%100)/10;
disp[0]=count%10;
150;
i++){dsp();
case1:
disp[3]=11;
disp[1]=bh/10;
disp[0]=bh%10;
disp[1]=11;
disp[0]=ltj;
case0x19:
//key1
break;
case0x13:
//key2
//闪动位移
if(ss==1)
switch(mi){
en_dsp();
////预设转速4位显示
disp_c++;
if(disp_c>
3){disp_c=0;
////输出保护时间2位显示
1){disp_c=0;
if(m==1)
{//保存数据退出设置状态
savedate();
//借用后恢复
//bjing=0;
m=0;
mi=0;
key_set=0;
for(i=0;
TMOD=0x11;
ET0=1;
ET1=1;
//数据保存允许中断
case0x0b:
//key3
if(m==1)
{disp_c=0;
mi++;
if(mi>
2){mi=0;
switch(mi){
////显示设定参数mi=0显示预设报警值,1显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 89 C51 转速 测量 系统 设计 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)