找回密码
 立即注册

QQ登录

只需一步,快速开始

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

急需,求助通过51单片机串口接受一段数字处理后按特点格式在LCD上显示,毕设马上要交

[复制链接]
跳转到指定楼层
楼主
我的毕业设计市有关数显的,我学的是机械,对这个单片机不是很清楚啊。我整了很久还是没调试出来。有哪位大神能帮我解决一下吗。有偿的,价格合理都行。会做的请联系我QQ:409110616,电话18875026689  
下面我说一下具和我完成的进度,肯定有很多错误。
主要针对时栅位移传感器的外置式数显装置,拟设计一个时栅传感器数显装置,该系统以单片机作为控制核心,可以通过串行接口接收到的传感器控制电路输出的传感器测量数据,能够对时栅传感器测量数据进行度、分、秒格式显示,并且能够设置显示方向。大概就是用利用串口输入一段数字信号,经过单片机处理后显示出来。显示格式为“多少°多少′多少″”的形式。我选用的是stc89c51单片机,还有lcd1602显示器,和几个按键功能,设置方向(原来数据的补码,按360°算),(还有设置分别用角度、分度、秒度显示,可带小数点,这个不强行要求)用C语言编写。下面是我做的一些。这关系能否顺利毕业,请各位大神帮帮我。
proteus仿真图

源程序如下,只完成主要的部分,还不能正确显示:
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define yh 0x80 //LCD第一行的初始位置
#define er 0x80+0x40 //LCD第二行初始位置

sbit pd_key=P1^0;   //+方向键 K0
sbit nd_key=P1^1;    //-方向键 K1
sbit pa_key=P1^2;    //+角度键 K2
sbit na_key=P1^3;   //-角度 K3
sbit pp_key=P1^4;      //+分 K4
sbit np_key=P1^5;    //-分 K5
sbit ps_key=P1^6;      //+秒 K6
sbit ns_key=P1^7;    //-秒 K7
sbit rs=P2^0;   
sbit en=P2^2;   
unsigned char shiZ,check;
uchar code tab1[]={"    2017.6.7    "};//显示的固定字符
uchar code tab2[]={"LOC:    °  ′  ″"};//显示的固定字符
uchar tate[7];
uchar bian[8];
uchar temp,a;
uchar flag;
/*LED_Buffer[7]用来存储串口发送的数据,com_dat用来记录串口发送的个数*/
uchar LED_Buffer[7], *q, com_dat;      //从串口接收的数据
/***********延时程序***********/
void delay(uint z)       //延时函数                       
{
    uint x,y;  
    for(x=z;x>0;x--)
        for(y=122;y>0;y--);
}
void delay_10us()        //延时10us
{
  uchar i;
  i--;i--;i--;i--;i--;i--;
}

/****液晶写入指令函数****/
void write_1602com(uchar com)
{      
rs=0;          //数据/指令选择置为指令
P0=com;        //送入数据
delay(5);      //延时一小会儿,让1602准备接收数据
en=1;          //拉高使能端,为制造有效的下降沿做准备
en=0;          //en由高变低,产生下降沿,液晶执行命令
}

/***液晶写入数据函数****/
void write_1602dat(uchar dat)
{
rs=1;          //数据/指令选择置为数据
P0=dat;        //送入数据
delay(5);      //延时一小会儿,让1602准备接收数据
en=1;          //en置高电平,为制造下降沿做准备
en=0;          //en由高变低,产生下降沿,液晶执行命令
}

/***液晶初始化函数****/
void lcd_init() //LCD初始化子程序
{      

write_1602com(0x38);   //显示模式设置:显示16×2,5×7点阵,选用8位数据接口  
delay(5);         
write_1602com(0x38);  
delay(5);         //延时5ms
write_1602com(0x38);      //3次写 设置模式  
delay(5);   
write_1602com(0x0c);     //显示设置:显示打开,有光标闪烁  
delay(5);  
write_1602com(0x06);     //显示设置:字符不移动,光标向右移动
delay(5);                  
write_1602com(0x01);     //清屏指令:将以前的显示内容清除  
delay(5);
write_1602com(er+0);
for(a=0;a<15;a++)
  {
   write_1602dat(tab2[a]);
  }
write_1602com(yh+0);
for(a=0;a<15;a++)
  {
   write_1602dat(tab1[a]);
  }      
}
/*****************串口输入数字信号函数******************/
void uart_init()
{

TMOD = 0x20;   //定时器工作在定时器1的方式2      
PCON = 0x00;   //不倍频      
SCON = 0x50; //串口工作在方式1,并且启动串行接收      
TH1 = 0xFd;    //设置波特率 9600      
TL1 = 0xFd;      
TR1 = 1;  //启动定时器1   
ES = 1;  //开串口中断   
EA = 1;  //开总中断

}
void serial() interrupt 4   // 串口中断服务函数

{
   EA = 0;
    if(RI == 1)   //当硬件接收到一个数据时,RI会置位
    {  

          LED_Buffer[com_dat] = SBUF;   //把从串口读出的数存到数组
          RI = 0;
          com_dat++;  
          if(com_dat == 7) com_dat = 0;  //当com_dat = 7时,清0,防止数组溢出
    }   
          EA = 1;
}

/**********处理读到的数字信号数据******************/
void pro_value()
{
temp=LED_Buffer[0]+LED_Buffer[1]+LED_Buffer[2]+LED_Buffer[3]+LED_Buffer[4]+LED_Buffer[5]+LED_Buffer[6];
shiZ=temp;
bian[0]=shiZ/3600;      //将角度取整
tate[0]=bian[0]/100;          //将角度百分位分离
bian[1]=tate[0]%100;          
tate[1]=bian[1]/10;                //将角度十分位分离                 
tate[2]=bian[1]%10;                  //将角度个位分离
write_1602com(er+5);
for(a=0;a<3;a++)
{
   write_1602dat(tate[a]+0x30);
}
bian[2]=shiZ/60;        //将分度取整
bian[3]=bian[2]%60;
tate[3]=bian[3]/10;                //将分度十分位分离
tate[4]=bian[3]%10;                //将分度个位分离
write_1602com(er+9);
for(a=3;a<5;a++)
{
   write_1602dat(tate[a]+0x30);
}
bian[4]=shiZ%60;                  //将秒度取整
tate[5]=bian[4]/10;                //将秒度十分位分离
tate[6]=bian[4]%10;                //将秒度个位分离
write_1602com(er+12);
for(a=5;a<7;a++)
{
   write_1602dat(tate[a]+0x30);
}
}


void nd_data()                        //反方向显示
{
bian[5]=360-bian[0];
if(bian[2]==0,bian[4]==0)
  {
   bian[5]=bian[5];
  }
else
  {
   bian[5]=bian[5]-1;
  }
tate[0]=bian[5]/100;   //将角度百分位分离
bian[1]=tate[0]%100;          
tate[1]=bian[1]/10;          //将角度十分位分离                 
tate[2]=bian[1]%10;          //将角度个位分离
write_1602com(er+5);
   for(a=0;a<3;a++)
  {
   write_1602dat(tate[a]+0x30);
  }
bian[6]=60-bian[2];
if(bian[4]==0)
  {
   bian[6]=bian[6];
  }
else
  {
   bian[6]=bian[6]-1;
  }
tate[3]=bian[6]/10;                //将分度十分位分离
tate[4]=bian[6]%10;                //将分度个位分离
write_1602com(er+9);
   for(a=3;a<5;a++)
  {
   write_1602dat(tate[a]+0x30);
  }
bian[7]=60-bian[4];
tate[5]=bian[7]/10;                //将秒度十分位分离
tate[6]=bian[7]%10;                //将秒度个位分离
write_1602com(er+12);
for(a=5;a<7;a++)
{
   write_1602dat(tate[a]+0x30);
}
}  

void display1()     //设置显示
{
  pro_value();
}

void display2()     //设置显示反方向
{
  nd_data();
}

void key_caa()
{
if(pd_key==0)   
  {
    delay(10);
   if(pd_key==0)
   {   
    display1();
    while(pd_key==0);
   }
  }
if(nd_key==0)         
  {
    delay(10);
   if(nd_key==0)
   {
    display2();
    while(nd_key==0);
   }
  }
}

/**********主函数******************/
void main()
{
lcd_init();

uart_init();
  while(1)  
  {
    pro_value();
    key_caa();        
  }
}

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

使用道具 举报

沙发
ID:205975 发表于 2017-5-30 11:57 | 只看该作者
自顶一下!急啊
回复

使用道具 举报

板凳
ID:82765 发表于 2017-5-30 12:24 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

地板
ID:192323 发表于 2017-5-30 15:10 | 只看该作者
做出来了吗,没有做出来加qq1097289917
回复

使用道具 举报

5#
ID:160980 发表于 2017-5-30 15:34 | 只看该作者
接收什么样子的数字?
回复

使用道具 举报

6#
ID:205975 发表于 2017-5-30 16:11 | 只看该作者
zhoulin01 发表于 2017-5-30 15:34
接收什么样子的数字?

一串数字,比如45123。用它除以3600为°上的数据。最大为360*60*60=1296000
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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