单片机源程序如下:
//晶振=8M
//MCU=STC10F04XE
//P0.0-P0.6共阳数码管引脚
//Trig = P1^0
//Echo = P3^2
#include #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long //*********************************************** sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频 //为STC单片机的IO口设置地址定义 sfr P0M1 = 0X93; sfr P0M0 = 0X94; sfr P1M1 = 0X91; sfr P1M0 = 0X92; sfr P2M1 = 0X95; sfr P2M0 = 0X96; //*********************************************** sbit Trig = P1^0; //产生脉冲引脚 sbit Echo = P3^2; //回波引脚 sbit test = P1^1; //测试用引脚 uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9 uint distance[4]; //测距接收缓冲区 uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器 bit succeed_flag; //测量成功标志 //********函数声明 void conversion(uint temp_data); void delay_20us(); //void pai_xu(); void main(void) // 主程序 { uint distance_data,a,b; uchar CONT_1; CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页) P0M1 = 0; //将io口设置为推挽输出 P1M1 = 0; P2M1 = 0; P0M0 = 0XFF; P1M0 = 0XFF; P2M0 = 0XFF; i=0; flag=0; test =0; Trig=0; //首先拉低脉冲输入引脚 TMOD=0x11; //定时器0,定时器1,16位工作方式 TR0=1; //启动定时器0 IT0=0; //由高电平变低电平,触发外部中断 ET0=1; //打开定时器0中断 //ET1=1; //打开定时器1中断 EX0=0; //关闭外部中断 EA=1; //打开总中断0 while(1) //程序循环 { EA=0; Trig=1; delay_20us(); Trig=0; //产生一个20us的脉冲,在Trig引脚 while(Echo==0); //等待Echo回波引脚变高电平 succeed_flag=0; //清测量成功标志 EX0=1; //打开外部中断 TH1=0; //定时器1清零 TL1=0; //定时器1清零 TF1=0; // TR1=1; //启动定时器1 EA=1; while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现) TR1=0; //关闭定时器1 EX0=0; //关闭外部中断 if(succeed_flag==1) { distance_data=outcomeH; //测量结果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据 distance_data*=12; //因为定时器默认为12分频 distance_data/=58; //微秒的单位除以58等于厘米 } //为什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 if(succeed_flag==0) { distance_data=0; //没有回波则清零 test = !test; //测试灯变化 } /// distance[i]=distance_data; //将测量结果的数据放入缓冲区 /// i++; /// if(i==3) /// { /// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4; /// pai_xu(); /// distance_data=distance[1]; a=distance_data; if(b==a) CONT_1=0; if(b!=a) CONT_1++; if(CONT_1>=3) { CONT_1=0; b=a; conversion(b); } /// i=0; /// } } } //*************************************************************** //外部中断0,用做判断回波电平 INTO_() interrupt 0 // 外部中断是0号 { outcomeH =TH1; //取出定时器的值 outcomeL =TL1; //取出定时器的值 succeed_flag=1; //至成功测量的标志 EX0=0; //关闭外部中断 } //**************************************************************** //定时器0中断,用做显示 timer0() interrupt 1 // 定时器0中断是1号 { TH0=0xfd; //写入定时器0初始值 TL0=0x77; switch(flag) {case 0x00:P0=ge; P2=0xfd;flag++;break; case 0x01:P0=shi;P2=0xfe;flag++;break; case 0x02:P0=bai;P2=0xfb;flag=0;break; } } //***************************************************************** /* //定时器1中断,用做超声波测距计时 timer1() interrupt 3 // 定时器0中断是1号 { TH1=0; TL1=0; } */ //****************************************************************** //显示数据转换程序 void conversion(uint temp_data) { uchar ge_data,shi_data,bai_data ; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余运算 shi_data=temp_data/10 ; temp_data=temp_data%10; //取余运算 ge_data=temp_data; bai_data=SEG7[bai_data]; shi_data=SEG7[shi_data]; ge_data =SEG7[ge_data]; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; } //****************************************************************** void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++); } /* void pai_xu() { uint t; if (distance[0]>distance[1]) {t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值 if(distance[0]>distance[2]) {t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值 if(distance[1]>distance[2]) {t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值 } */
上一篇:PIC12F675电机控制程序案例源码
下一篇:pic16f单片子源码,LED0 - LED5 流水点亮
推荐阅读
史海拾趣
Galil Motion Control Inc. 的五个发展故事
故事一:技术创新引领者
Galil Motion Control Inc.,成立于1983年,位于美国加州硅谷中心,是电子行业中运动控制技术的先驱。公司成立初期,便致力于研发基于微处理器的精密运动控制器。据《DESIGNNEWS》杂志报道,Galil是全球第一家推出数字运动控制器的公司,这一技术创新在业界引起了巨大反响。此后,Galil不断推陈出新,其产品已发展到第五代,采用RISC结构的DSP技术,结合最新控制理论及网络技术,使得伺服更新速率和指令执行周期显著提升,引领了运动控制领域的技术潮流。
故事二:全球市场的扩展
随着技术的不断成熟,Galil的产品逐渐在全球市场上占据了一席之地。目前,全球有超过500,000台Galil的运动控制器在稳定运行,应用领域覆盖了医疗、半导体、纺织、物料搬运、食品加工、机床、产业机械、航天、测试测量等多个行业。这一广泛的应用不仅证明了Galil产品的可靠性和稳定性,也为其在全球市场的扩展奠定了坚实的基础。
故事三:分布式运动控制器的诞生
在进入21世纪之初,Galil公司又开发出了DMC3425分布式运动控制器。这款控制器不仅提供了API函数支持高级应用开发,还引入了极其简单易学的2字符命令集,使得应用编程变得如同书写英文字母般简单。这一创新不仅降低了用户的学习成本,也极大地提高了系统的开发效率,进一步巩固了Galil在运动控制领域的领先地位。
故事四:与光纤激光切割技术的结合
近年来,随着激光切割技术的快速发展,Galil公司也紧跟这一趋势,将运动控制技术与光纤激光切割技术相结合。通过设计以Galil控制卡为核心的四轴联动伺服控制系统,实现了激光切割设备的高精度控制。这一结合不仅提升了激光切割设备的性能,也拓展了Galil运动控制技术的应用领域,为工业制造带来了更多的可能性。
故事五:全球销售与服务网络的建立
为了更好地服务全球客户,Galil公司在全球范围内建立了完善的销售和服务网络。目前,Galil拥有众多销售代理商,遍布世界各地。这些代理商不仅负责产品的销售工作,还为客户提供专业的技术支持和售后服务。通过这一网络,Galil能够迅速响应客户的需求,确保每位客户都能获得最佳的产品体验和服务保障。这种以客户为中心的服务理念,也为Galil赢得了良好的市场口碑和广泛的客户认可。
Amkor Technology是一家全球领先的半导体封装和测试服务提供商。以下是关于Amkor公司发展的五个相关故事:
成立与早期发展:Amkor Technology成立于1968年,总部位于美国亚利桑那州的钱德勒市。公司最初是一家小型半导体封装服务提供商,专注于为集成电路制造商提供先进的封装解决方案。在成立初期,Amkor致力于技术创新和质量控制,赢得了客户的信任和认可。
技术创新与产品多样化:随着电子行业的发展和技术的进步,Amkor不断进行技术创新,并扩展了产品线。公司推出了一系列新的封装技术和解决方案,包括先进的3D封装、薄型封装、系统封装等。这些技术创新和产品多样化使得Amkor能够满足不同客户的需求,并保持在市场竞争中的领先地位。
全球布局与生产基地建设:为了更好地服务全球客户,Amkor在全球范围内建立了多个生产基地和分销中心。除了在美国的设施外,公司还在亚洲、欧洲和其他地区建立了生产工厂和研发中心。这种全球布局有助于降低生产成本、提高生产效率,并加强了在全球市场的竞争力。
合作伙伴关系与客户服务:Amkor与全球各种半导体制造商建立了紧密的合作伙伴关系,共同推动技术创新和产品发展。公司致力于为客户提供优质的封装和测试解决方案,并与客户密切合作,开发定制化的解决方案。Amkor的客户服务团队提供全方位的技术支持和服务,确保客户的满意度和业务成功。
持续发展与业绩表现:Amkor持续实现了稳健的增长和良好的业绩表现。公司不断投入研发,并提升生产效率和管理水平,以提高盈利能力和市场竞争力。Amkor的业绩稳步增长,为股东创造了可观的价值,并使得公司成为半导体封装和测试服务领域的领先企业之一。
这些故事展示了Amkor Technology从成立初期到如今在技术创新、产品多样化、全球布局、合作伙伴关系建设和持续发展等方面取得的重要进展。
对不起,我无法提供关于Allen Avionics Inc 公司的相关故事。
为了确保产品质量和客户满意度,ECC建立了完善的质量管理体系。他们从原材料采购到生产、检测、包装等各个环节都制定了严格的质量标准。ECC还引入了先进的质量检测设备和方法,确保每一件产品都符合高标准的质量要求。此外,ECC还定期对员工进行质量培训,提高员工的质量意识和操作技能。这些措施使得ECC的产品在市场上赢得了良好的口碑和信誉。
随着物联网和智能家居概念的普及,一家名为“FORMOSA智能科技”的公司专注于研发和生产智能家居硬件产品。该公司推出的智能音箱、智能门锁、智能照明等系列产品,凭借其出色的性能、便捷的操作和良好的用户体验,在市场上迅速获得了消费者的青睐。FORMOSA智能科技还积极与各大智能家居平台进行合作,实现了产品的互联互通和智能化管理。通过不断的技术创新和市场拓展,该公司成功推动了智能家居产品的普及和应用。
随着全球对环保问题的日益关注,Eurofarad公司也积极响应这一趋势。公司注重环保理念在产品设计和生产过程中的应用,努力减少对环境的影响。同时,公司还积极推动可持续发展战略,通过优化生产流程和采用环保材料等方式,降低能源消耗和废弃物排放。这些努力不仅符合了社会的期望,也为公司的长期发展提供了有力保障。
串行E2PROM的类型及应用(上) 作者:万 琳串行E2PROM是可在线电擦除和电写入的存储器,具有体积小、接口简单、数据保存可靠、可在线改写、功耗低等特点,而且为低电压写入,在单片机系统中应用十分普遍。串行E2PROM按总线形式分为三种,即I2C总线、Mi ...… 查看全部问答∨ |
|
这是一个判断2812启动后是否正常运行的电路(从GPIO0-PWM1输出),I/o1信号是来自2812上的一个pwm信号,周期小于电容充放电时间,当rly1信号为低电平时,2812工作正常,这个电路能实现诊断么,能的话请解释下工作原理?(D20是非门,包含A,B,C ...… 查看全部问答∨ |
|
请问谁有没有这个芯片的相关驱动代码?我用I2C读写它的MTZ区,但是怎么都不对。。。 各位帮个忙,如果能够提供有效信息,我可以另外开贴送分。。。… 查看全部问答∨ |
求教:以前一直没有接触过plc,现在有个项目需要用pc上位机控制台达plc,不知道如何入手写通信和控制语句,请各位大侠赐教。 1.请问台达plc有api接口函数吗(如同西门子mpi) 2.如何通信和操作plc的命令?(plc梯形图和功能已经做好了,需要用上 ...… 查看全部问答∨ |
使用S12做的一个数据采集程序,采用PT3捕捉到输入信号以后,打开PT4在外界同步信号的触发下分别采集若干数据。将采集的数据通过串口发回PC机。由于数据量较大,串口的发送时间会超过PT3触发源的信号周期。为了保证每次都是传送一整组 ...… 查看全部问答∨ |