OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5722|回复: 2

STC89C52+L1602+US-100雷达程序

[复制链接]

4

主题

8

帖子

0

精华

高级会员

Rank: 4

积分
534
金钱
534
注册时间
2020-11-26
在线时间
69 小时
发表于 2020-11-26 14:16:41 | 显示全部楼层 |阅读模式
本帖最后由 laoying 于 2020-11-27 14:09 编辑

各位大神好,我小白一个,刚刚接触单片机,也是上班无聊想学学单片机。我有程序但是雷达不工作。以下是原理图。代码中void UART_Send(char dat) Send指的是什么意思。谢谢大神。

_20201126141414.png
以下是程序,雷达不起作用,大神们看看哪里出错。

#include<reg52.h>
#include<intrins.h>
#define nops {_nop_();_nop_();_nop_();_nop_();}
unsigned long int tim_data,dista_data,dista_data_all,dista_data_sum;
/******************************引脚及变量的定义****************************/
sbit RS = P2^0;  //寄存器选择位
sbit RW = P2^1;  //读取选择位
sbit E = P2^2;   //使能信号位
sbit BF = P0^7;  //忙碌信号位
sbit LED=P3^6;   //启动指示灯
sbit BUZZ=P3^7;
sbit US100_Trig=P3^3;
sbit US100_Echo=P3^2;
unsigned char code Tab[] = {"0123456789"};
unsigned char code string[] = {"range:2cm--4.5m"};
unsigned char T0RH=0;
unsigned char T0RL=0;
char part,ge,shi,bai;
char idata GLengthLoh[2];    //接收缓冲区
bit success_flag;      //定义测试成功标志位
/*********************************************************/
/*********函数名称:delay1ms(void)      ******************/
/*********函数功能:延时1毫秒           ******************/
/*********函数参数:void                ******************/
/*********************************************************/
void OpenBuzz(unsigned int frequ);
void StopBuzz();
void delay1ms(void)   //误差 -0.651041666667us
{
    char a,b;
    for(b=102;b>0;b--)
    for(a=3;a>0;a--);
}         
/*********************************************************/
/*********函数名称:delaynms(char n)    ******************/
/*********函数功能:延时n个1毫秒        ******************/
/*********函数参数:n                   ******************/
/*********************************************************/
void delaynms(char n)
{
    char a;
    for(a=0;a > n;a--)
    delay1ms();
}
/*********************************************************/
/*********函数名称:BusyTest(void)      ******************/
/*********函数功能:判断液晶模块忙碌状态******************/
/*********函数参数:返回值:result  ******************/
/*********************************************************/
unsigned char BusyTest()
{
    bit result;         
        RS=0;                  
        RW=1;                  //RS为低电平,RW为高电平时,可以读状态
        E=1;                  //使能为高电平时可读取信息
        nops;                  //延时40us,给硬件反应时间
        result = BF;     //将忙碌标志位电平赋给result
        E=0;                  //使能1到0:执行指令
        return result;
}
/*********************************************************/
/*********函数名称:WriteInstruction(char dictate)*******/
/*********函数功能:将模式设置指令或显示地址写入液晶模块**/
/*********函数参数:dictate             ******************/
/*********************************************************/
void WriteInstruction(char dictate)
{
    while(BusyTest() == 1);         //如果忙碌标志位忙碌则等待
        RS=0;
        RW=0;                                 //RS/RW位同时为低电平时可写入指令
        E=0;                                 //使能0到1:写入指令
        nops;
        P0=dictate;                    //将数据送入P0口,写入数据或地址
        nops;
        E=1;                                 //使能0到1:写入指令
        nops;
        E=0;                                 //使能1到0:执行指令
}
/*********************************************************/
/*********函数名称:WriteAddress(char x)          *******/
/*********函数功能:指定字符显示的实际地址     ***********/
/*********函数参数:x                   ******************/
/*********************************************************/
void WriteAddress(char x)
{
    WriteInstruction(x|0x80);        //80H+地址码
}
/*********************************************************/
/*********函数名称:WriteData(char y)             *******/
/*********函数功能:将数据(字符的标准ASCII码)写入液晶模块*/
/*********函数参数:y                   ******************/
/*********************************************************/
void WriteData(char y)
{
    while(BusyTest() == 1);          //如果忙碌标志位忙碌则等待
        RS = 1;
        RW = 0;                      //RS为高电平,RW为低电平时,可以写入数据
        E = 0;
        P0 = y;
        nops;
        E = 1;
        nops;
        E = 0;
}
/*********************************************************/
/*********函数名称:LCDInit(void)                  *******/
/*********函数功能:液晶模块初始化        ****************/
/*********函数参数:void                ******************/
/*********************************************************/
void LCDInit(void)
{
    delaynms(15);    //延时15毫秒,首次写入液晶指令应给反应时间
        WriteInstruction(0x38);        //显示模式设置:16×2显示,5×7点阵,8位数据接口
        delaynms(5);        //延时5秒,反应时间
    WriteInstruction(0x38);
        delaynms(5);        //延时5秒,反应时间
        WriteInstruction(0x38);
        delaynms(5);        //连续三次,确保初始化成功
        WriteInstruction(0x0c);   //显示模式设置:显示开,无光标,光标不闪烁
        delaynms(5);
        WriteInstruction(0x06);        //显示模式设置:显示光标右移,屏幕不移动
        delaynms(5);
        WriteInstruction(0x01);   //清屏
        delaynms(5);
}
/*********************************************************/
/*********函数名称:UART_Send(char dat)            *******/
/*********函数功能:串口发送函数          ****************/
/*********函数参数:dat                 ******************/
/*********************************************************/
void UART_Send(char dat)
{
    TI = 0;            // 清发送标志
    SBUF = dat;        //如果TI为0等待
    while (!TI);        //等待发送数据
}
/*********************************************************/
/*********函数名称:UART_Init()            ***************/
/*********函数功能:串口初始化函数        ****************/
/*********函数参数:无                  ******************/
/*********************************************************/
void UART_Init()
{   
    TH1 = 0xFD;
    TL1 = 0xFD;
    TMOD = 0x21;            //设置定时器1为模式2;定时器0为模式1      
    TH0 =(65536-2500)/256;  //约2.50MS定时器初值
    TL0 =(65536-2500)%256;  //约2.50MS定时器初值
    ET0 = 1;
    TR0 = 1;                //启动定时器
    TR1 = 1;                //启动定时器           SM0  SM1
    SM0 = 0;                //串口通信模式设置     0      0 = 0
    SM1 = 1;                                //     0      1 = 1
                                            //     1      0 = 2
                                            //     1      1 = 3
    REN = 1;       //串口允许接收数据
    ES = 1;        //开串中断
    EA = 1;
}
/*********************************************************/
/*********函数名称:UART_ISR(void)         ***************/
/*********函数功能:串口中断函数          ****************/
/*********函数参数:void                ******************/
/*********************************************************/
void UART_ISR(void) interrupt 4
{
    char temp,k;
    ES = 0;             //关中断            
    if(RI)
    {
        RI = 0;         //清接收标志
        temp = SBUF;
        GLengthLoh[k] = temp;
        k++;
        if(k == 2) //k=数据长度
        k = 0;
    }   
    ES = 1;      //开中断
}
/*********************************************************/
/*********函数名称:timer0()               ***************/
/*********函数功能:定时器函数            ****************/
/*********函数参数:void                ******************/
/*********************************************************/
timer0() interrupt 1         // 定时器0中断是1号
{
    TH0 =(65536-2500)/256; //约2.50MS定时器初值
    TL0 =(65536-2500)%256; //约2.50MS定时器初值    TH0 = 0xef;    TL0 = 0x94;    //写入定时器0初始值
}
/*********************************************************/
/*********函数名称:conversion(int8 temp_data)     *******/
/*********函数功能:数据转换              ****************/
/*********函数参数:temp_data           ******************/
/*********************************************************/
void conversion(int temp_data)
{
    char part_data,ge_data,shi_data,bai_data;
        bai_data = temp_data / 1000;
        shi_data = (temp_data % 1000) / 100;
        ge_data = (temp_data % 100) / 10;
        part_data = temp_data % 10;
        EA = 0;
        bai = bai_data;
        shi = shi_data;
        ge = ge_data;
        part = part_data;
        EA = 1;
}
/*********************************************************/
/*********函数名称:main(void)                      *******/
/*********函数功能:主函数                ****************/
/*********函数参数:void                 ******************/
/*********************************************************/
void main(void)
{
    int k;
        long PreLength;                                          
        LCDInit();                                           //调用液晶初始化函数
        delaynms(10);
    UART_Init();
        PreLength = 0;
        k = 0;
        while(1)
        {
             WriteAddress(0x01);
                 while(string[k] != '\0')
                 {
                      WriteData(string[k]);
                          k++;
                 }
            UART_Send(0X55);
                 PreLength = GLengthLoh[0] * 256 + GLengthLoh[1] - 5;
         conversion(PreLength);
             WriteAddress(0x41);           //从第2行第6列开始显示
                 WriteData('J');                   //将特定的字符常量写入LCD
                 WriteData('U');
                 WriteData('L');
                 WriteData('I');
                 WriteData(':');
                 if(PreLength <= 4500 && PreLength >= 20)
                 {
                     WriteData(Tab[bai]);           //将百位数字的字符常量写入LCD
                     WriteData(Tab[shi]);           //将十位数字的字符常量写入LCD
                     WriteData(Tab[ge]);           //将个位数字的字符常量写入LCD
                            WriteData('.');
                          WriteData(Tab[part]);
                 }
                 else
                 {
                     WriteData('-');         
                     WriteData('-');
                     WriteData('-');         
                            WriteData('-');
                          WriteData('-');
                 }
                 WriteData(' ');
                 WriteData('c');
                 WriteData('m');
     LED=0;
     {
         {
                     unsigned int i;
                      EA =1;
                     TMOD = 0x01;
                      while(1)
                    {
                      OpenBuzz(4000);
                      for(i=0; i<40000; i++);
                       StopBuzz();
                      for(i=0; i<40000; i++);
                       OpenBuzz(1000);
                      for(i=0; i<40000; i++);
                      StopBuzz();
                       for(i=0; i<40000; i++);
      }
                      }
   }
        }
}
void OpenBuzz(unsigned int frequ)
{
unsigned int reload;
reload = 65536 - (11059200/12)/(frequ*2);
T0RH = (unsigned char)(reload >>8);
T0RL = (unsigned char)reload;
TH0 = 0xFF;
TL0 = 0xFE;
ET0 = 1;
TR0 = 1;
}
void StopBuzz()
{
ET0 = 0;
TR0 = 0;
}
void InterruptTimer0() interrupt 1
{
TH0 = T0RH;
TL0 = T0RL;
BUZZ = ~BUZZ;
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2021-2-9
在线时间
2 小时
发表于 2021-2-10 11:24:47 | 显示全部楼层
回复 支持 反对

使用道具 举报

7

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
金钱
445
注册时间
2018-2-16
在线时间
27 小时
发表于 2021-2-12 10:36:16 | 显示全部楼层
串口发送程序
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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