打印
[51单片机]

求大神帮忙看看程序,,码盘测速加12864显示的,,能够显示但示数不对。。?????

[复制链接]
1168|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
十木枫叶|  楼主 | 2015-8-7 11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_data  P0             //数据口
sbit LCD_RS  =  P2^6;            //寄存器选择输入
sbit LCD_RW  =  P2^5;            //液晶读/写控制
sbit LCD_EN  =  P2^7;            //液晶使能控制
sbit LCD_PSB =  P3^2;            //串/并方式控制
uchar code dis1[]={"现在速度:"};
uchar dis2[5];
float f=0;
uint k,count=0;
uint speed;

/*定时器初始化*/
void initime()
{
TMOD=0x51; //T1计数器,T0定时器,方式1
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
EA=1;
TL1=0;
TH1=0;
ET0=1;
}


void delay_1ms(uint xms)
{
        uint y,z;
        for(y=xms;y>0;y--)
        for(z=110;z>0;z--);       
}

//写指令
void write_cmd(uchar cmd)
{                          
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = cmd;
    delay_1ms(5);
    LCD_EN = 1;
    delay_1ms(5);
    LCD_EN = 0;  
}

//写数据
void write_dat(uchar dat)
{                          
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delay_1ms(5);
    LCD_EN = 1;
    delay_1ms(5);
    LCD_EN = 0;  
}

//显示地址
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   pos = X+Y ;  
   write_cmd(pos);   
}
//LCD初始化
void lcd_init()
{
    LCD_PSB = 1;         //并口方式  
    write_cmd(0x30);      //基本指令操作
    delay_1ms(5);
    write_cmd(0x0C);      //显示开,关光标
    delay_1ms(5);
    write_cmd(0x01);      //清除LCD的显示内容
    delay_1ms(5);
}

void main(void)
{
        uchar i;
        initime();
        lcd_init();
        TR0=1;
        TR1=1;
        lcd_pos(0,0);
        i=0;
        while(dis1[i]!= '\0')
    {
       write_dat(dis1[i]);      //显示文字
       i++;
    }
        while(1)
        {
        lcd_pos(1,0);
        f=f*10;
        k=f;
    dis2[0]=k/1000+0x30;       
        dis2[1]=(k%1000)/100+0x30;       
        dis2[2]=((k%1000)%100)/10+0x30;       
        dis2[3]='.';
        dis2[4]=((k%1000)%100)%10+0x30;
        for(i=0;i<5;i++)
        {
                 write_dat(dis2[i]);       
        }
    }
}

void timer()interrupt 1
{
        if(count==20)
        {
                f=(TH1*256+TL1)*0.0418;
                count=0;   
                TL1=0;
                TH1=0;
        }
        else
        {
                count=count+1;
        }
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
}

相关帖子

沙发
cainiao_123| | 2015-8-7 11:09 | 只看该作者
问题都没表达清楚

使用特权

评论回复
板凳
十木枫叶|  楼主 | 2015-8-7 11:19 | 只看该作者
cainiao_123 发表于 2015-8-7 11:09
问题都没表达清楚

哪里?

使用特权

评论回复
地板
cainiao_123| | 2015-8-7 11:50 | 只看该作者

显示测量的速度不对? 还是显示本身有问题?

测速的结果对不对?

使用特权

评论回复
5
十木枫叶|  楼主 | 2015-8-7 12:23 | 只看该作者
测速结果不对

使用特权

评论回复
6
十木枫叶|  楼主 | 2015-8-7 12:24 | 只看该作者
cainiao_123 发表于 2015-8-7 11:50
显示测量的速度不对? 还是显示本身有问题?

测速的结果对不对?

测速结果不对

使用特权

评论回复
7
huangfeng2008| | 2015-8-7 15:47 | 只看该作者

测速结果不对,先把测速结果搞对再说显示

使用特权

评论回复
8
sanxinweiled| | 2015-8-7 16:41 | 只看该作者
不错  不错  

使用特权

评论回复
9
cauhorse| | 2015-8-7 20:13 | 只看该作者
描述问题要全面,至少要把问题背景说清楚。
楼主认为问题出在程序上,可是这样别人还是不便帮你分析问题。
建议直接从其它途径取出码盘读数查看,比如从串口,如果示数不对,找计数的问题;如果显数正确,找显示的问题。
这还没有排除硬件问题(从PCB设计、元器件质量、焊接等等角度分析)。

使用特权

评论回复
10
wuzx-61| | 2015-8-8 20:25 | 只看该作者
学习!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

15

帖子

0

粉丝