找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1402|回复: 2
打印 上一主题 下一主题
收起左侧

单片机超声波测距和控制灯泡亮度程序如何合并在一起就不行了,求帮助

[复制链接]
跳转到指定楼层
楼主
ID:852789 发表于 2020-12-4 18:14 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
请教大神们怎么改,两个是超声波测距和控制灯泡亮度,但两个程序到一起灯泡亮度就无法实现了,请问怎么加以改正

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit P2_0=P2^4;sbit key3=P3^0;sbit key4=P3^1;sbit key1=P3^2;sbit key2=P3^3;uchar zkb,i;void delay(uint z){        uint x,y;        for(x=z;x>0;x--)                for(y=110;y>0;y--);}void init()  {        TMOD=0X01;        TH0=(65536-100)/256;        TL0=(65536-100)%256;        EA=1;        ET0=1;        TR0=1;}void keyscan()  {            if(key3==0)        {                delay(10);                if(key3==0)                {                      zkb=11;                      while(!key3);                }        }                                if(key4==0)        {                delay(10);                if(key4==0)                {                      zkb=0;                      while(!key4);                }        }        if(key1==0)        {                delay(10);                if(key1==0)                {                        if(zkb<10)                        {                                zkb++;                        }                        while(!key1);                }        }        if(key2==0)        {                delay(10);                if(key2==0)                {                        if(zkb>0)                          {                                zkb--;                        }                        while(!key2);                }        }  }void main(){        zkb=2;        init();        while(1)        {                                                      keyscan();        }}void time0(void) interrupt 1  {        TH0=(65536-100)/256;        TL0=(65536-100)%256;        ++i;        if(i==10)        {                i=0;        }        if(zkb>i)        {                P2_0=1;        }        else P2_0=0;}





/*Echo接P20,Trig接P21*/#include<reg51.h>#include<intrins.h >typedef unsigned char uchar;typedef unsigned int uint;sbit beep = P2^3;//蜂鸣器sbit we=P2^7;sbit du=P2^6;sbit Re=P2^0;         //接收信号sbit Se=P2^1;         //发射信号uchar code SMGwe[]={0xfe,0xfd,0xfb};uchar code SMGdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; uchar wat[4]={0,0,0,0};uint flag=0,t=0,k=0,time;unsigned long S=0;/*====================================函数        : delay(uint z)参数        :z 延时毫秒设定,取值范围0-65535返回值        :无描述        :12T/Fosc11.0592M毫秒级延时====================================*/void delay(uint z){        uint x,y;        for(x = z; x > 0; x--)                for(y = 114; y > 0 ; y--);                 } /*显示函数,显示三位(米. 秒 毫秒)*/void display(){        du=0;        if(k==0)                P0=SMGdu[wat[0]]|0x80; //第一位显示加上小数点        else                P0=SMGdu[wat[k]];        du=1;        du=0;        we=0;        P0=SMGwe[k];        we=1;        we=0;        if(++k>=3)     //三位循环显示,定时器1中断执行显示函数                k=0;                }void timer0() interrupt 1{        flag=1;                   //定时器0时间溢出}void timer1() interrupt 3{        TH1=0xf8 ;        //2ms        TL1=0xcb;        display();        t++;        if(t>=400)         //发送间隔800ms        {                t=0;                Se=1;           //信号发射持续10微秒以上                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                _nop_();                Se=0;          //提供一个10微秒以上的脉冲触发信号        }}/*计算距离*/void count(){        time=TH0*256+TL0; //计算周期         TH0=0;//定时器0定时时间清零        TL0=0;        S=(float)(time*1.085)*0.017; //计算距离(时间*速度)        if(S>=700||flag==1)        {                flag=0;                wat[0]=10;                wat[1]=10;                wat[2]=10;        }        else        {                wat[0]=S%1000/100;                wat[1]=S%100/10;                wat[2]=S%10;        }}void nmd(){        if(S<50)        {beep = ~beep;delay(20);}//        蜂鸣器发出滴滴声}                void main(){        TMOD=0x11;        //打开定时器1,2 16位工作模式        TR1=1;        TH0=0;        TL0=0;        TH1=0xf8 ;        //2ms        TL1=0xcb;        ET1=1;        ET0=1;        EA=1;        while(1)        {                    while(!Re);        //接收到信号后开始执行                TR0=1;                //定时器0开始计数                while(Re);        //信号接收停止后结束                TR0=0;                //定时器0结束计数                count();        //距离计算                delay(20);                   nmd();        }}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-12-4 22:47 | 只看该作者
单片机程序合并教程:http://www.51hei.com/bbs/dpj-157117-1.html
回复

使用道具 举报

板凳
ID:782582 发表于 2021-1-11 21:39 | 只看该作者
给你个思路,测距和亮度调节的函数分别放在两个.C文件,先知道每个函数的功能,然后根据你的需要在主函数中调用,只要有动态测量的话肯定是在while(1)循环里编写的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表