高级会员
- 积分
- 534
- 金钱
- 534
- 注册时间
- 2020-11-26
- 在线时间
- 69 小时
|
本帖最后由 laoying 于 2020-11-27 14:09 编辑
各位大神好,我小白一个,刚刚接触单片机,也是上班无聊想学学单片机。我有程序但是雷达不工作。以下是原理图。代码中void UART_Send(char dat) Send指的是什么意思。谢谢大神。
以下是程序,雷达不起作用,大神们看看哪里出错。
#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;
}
|
|