完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#include unsigned int time=0; unsigned int timer=0; unsigned long S=0; //用于显示最后计算得到的距离 bit flag =0; //判断是否溢出 ***it dula=P2^6; ***it wela=P2^7; //用于数码管显示 ***it RX=P1^1; //echo ***it TX=P1^2; //trig // ***it D5=P1^4; //可以不要。echo高电平时点亮D5灯 unsigned long x; //用于数码管显示 unsigned char code table[]={ //共阴数码管 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; void Display(unsigned long num); void Delay(unsigned int z); //z=1大概是1ms void Conut(void)///////////计算程序 { time=TH0*256+TL0; //这是最后算到的时间往返时间但应该再乘以 //12/11.0593M是一个机器周期时间应该是 time*12/11.0592 ; TH0=0; //定时器0的初始值为0 TL0=0; S=(time*1.845)/100; //算出来是CM // S=(time*1.845)/10; //算出来是mm //time*12*170/(11.0592*1000)mm=time*1845/10000 mm if (S>=500) //最大距离5m即500cm S=888888; if (flag==1) //判断是否溢出 {S=888888; flag=0; TH0=0; TL0=0; } } /********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } //这是最重要的计时0中断TH0和TL0初始值为0 /********************************************************/ void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块 { //这是计时器1中断 TH1=0xf8; //赋初值应该是2ms TL1=0x30; timer++; if(timer>=400) { timer=0; TX=1; //800MS 启动一次模块 Delay(30); //一次超声波信号时长30ms TX=0; } } /*********************************************************/ void main( void ) { TMOD=0x11; //设T0为方式1GATE=1 TH0=0; //目的都是用中断T0和T1 TL0=0; //中断0初始化 TH1=0xf8; //2MS定时 TL1=0x30; ET0=1; //允许T0中断 ET1=1; //允许T1中断 TR1=1; //开启定时器 EA=1; //开启总中断 while(1) { while(!RX); //当RX为零时等待即echo为低电平 TR0=1; //开启计数 // D5=0; //可以不要指示灯 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 // D5=1; //可以不要指示灯 Conut(); //计算 Display(S); //数码管显示 } } void Display(unsigned long num) //定义子函数用于显示五位数 { //调用子函数前先要在main函数前面声明位选和段选 /*即 ***it dula=P2^6; ***it wela=P2^7; */ unsigned int temp; //用于延迟for函数 unsigned char shiwanwei,wanwei,qianwei,baiwei,shiwei,gewei; //定义这个六位数的十万位到个位 shiwanwei=num/100000; wanwei=num%100000/10000; qianwei=num%10000/1000; baiwei=num%1000/100; shiwei=num%100/10; gewei=num%10; wela=1; P0=0xdf;//1111 1011 //位选个位 wela=0; dula=1; P0=table[gewei]; dula=0; for(temp=100;temp>0;temp--); if(shiwanwei!=0||wanwei!=0||qianwei!=0||baiwei!=0||shiwei!=0) {//判断高位是否都为0为0的话不显示高位的0 wela=1; P0=0x6f; //1111 0110 //位选十位 wela=0; P0=0xff; dula=1; P0=table[shiwei]; dula=0; for(temp=50;temp>0;temp--); } if(shiwanwei!=0||wanwei!=0||qianwei!=0||baiwei!=0) { wela=1; P0=0x77; //1110 1110 //位选百位 wela=0; P0=0xff; dula=1; P0=table[baiwei]; dula=0; for(temp=50;temp>0;temp--); } if(shiwanwei!=0||wanwei!=0||qianwei!=0) { wela=1; P0=0x7b; //1101 1110 //位选千位 wela=0; P0=0xff; dula=1; P0=table[qianwei]; dula=0; for(temp=50;temp>0;temp--); } if(shiwanwei!=0||wanwei!=0) { wela=1; P0=0x7d; //1011 1110 //位选万位 wela=0; P0=0xff; dula=1; P0=table[wanwei]; dula=0; for(temp=50;temp>0;temp--); } if(shiwanwei!=0) { wela=1; P0=0x7e; //0111 1110 //位选万位 wela=0; P0=0xff; dula=1; P0=table[shiwanwei]; dula=0; for(temp=50;temp>0;temp--); } } void Delay(unsigned int z) //基本上是z赋值为1就对应1ms { unsigned int a,b; for(a=z; a>0; a--) for(b=110; b>0; b--); } |
|
相关推荐
4个回答
|
|
可能延时太长。各位之间显示延时去掉。或者减少
最佳答案
|
|
|
|
会不会是硬件连接的问题,我曾经就碰到过这样的例子
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
686 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-通用文件I/O模型之close
745 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第十五章 按键中断实验
702 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第十一章 FPIOA管理器实验
949 浏览 0 评论
786 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11460 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-14 01:42 , Processed in 0.931959 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号