打印

单片机程序问题求救!!!

[复制链接]
1966|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
虚怀若谷|  楼主 | 2011-8-16 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tj_zhaozq| | 2011-8-16 20:49 | 只看该作者
t是byte还是word.如果是byte的话,可能会有问题.如果t为byte应改成t1=(byte)((word)(t)*255/1000).

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
虚怀若谷 + 1
板凳
虚怀若谷|  楼主 | 2011-8-17 08:34 | 只看该作者
这是整个函数,请2楼的大虾看一下是不是您说的问题,小弟谢过了!
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit dula=P2^6;
sbit wela=P2^7;
sbit s2=P3^4;
sbit s3=P3^5;
//sbit s4=P3^6;
sbit s5=P3^7;
sbit jdqflag=P1^0;
sbit csda=P3^2;
sbit wr=P3^6;

uchar code table2[]={
0x7f,0x7b,0x7d,0x7e,
0x5f,0x6f,0x77};
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

uchar s5flag,i;
uint t;
int t1,t2;
void delay(uchar z);
void display(uint a);
void anjian1();
void anjian2();
void jidianqi();
void DA();

void main()
{
        t=0;
        s5flag=0;
        jdqflag=0;
        while(1)
        {
                if(s5flag==0)//按键加
                        anjian1();
                if(s5flag==1)//按键减,输入t 值范围0到999
                        anjian2();
                if(s5flag==3)//根据t值大小控制继电器开关
                {
                        jidianqi();
                        display(t);
                }
                if(s5flag==4)//将t值转换为0到256区间,用DA0832转换输出对应电流
                {
                         DA();
                }
        }
}

void DA()//DA转换程序,
{
// display(t);
t1=(byte)((word)(t)*255/1000);
csda=0;
wr=0;
P0=t1;
}

void jidianqi()//继电器控制程序
{
        if(t>100)//继电器开
                jdqflag=1;
                delay(10);
        if(t<101)//继电器关
                jdqflag=0;
                delay(10);
        s5flag++;
}

void anjian1()
{
        while(1)
        {
                if(s2==0)//按键加100
                {
                        delay(10);
                        while(!s2)
                        display(t);
                                t+=100;
                                if(t>1000)
                                        t=0;
                }

                if(s3==0)//按键加10
                {
                        delay(10);
                        while(!s3)
                        display(t);
                                t+=10;
                                if(t>1000)
                                        t=0;
                }
                       
/*                if(s4==0)
                {
                        delay(10);
                        while(!s4)
                        display(t);
                                t+=1;
                                if(t>1000)
                                        t=0;
                }*/

                if(s5==0)//跳到下一个if语句
                {
                        delay(10);
                        while(!s5)
                        display(t);
                        s5flag=1;
                        break;
                }
                display(t);
        }
}

void anjian2()
{
        while(1)
        {
                if(s2==0)//按键减100
                {
                        delay(10);
                        while(!s2)
                        display(t);
                                t-=100;
                                if(t<0)
                                        t=0;
                }

                if(s3==0)//按键减10
                {
                        delay(10);
                        while(!s3)
                        display(t);
                                t-=10;
                                if(t<0)
                                        t=0;
                }
                       
/*                if(s4==0)
                {
                        delay(10);
                        while(!s4)
                        display(t);
                                t-=1;
                                if(t<0)
                                        t=0;
                }*/

                if(s5==0)//跳到下一个if语句
                {
                        delay(10);
                        while(!s5)
                        display(t);
                        s5flag=3;
                        break;
                }
                display(t);
        }
}

void delay(uchar z)//延迟函数
{
        uchar x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void display(uint a)//显示函数
{
        P0=0;
        dula=1;
        P0=table[a/1000];
        dula=0;
        P0=0xff;
        wela=1;
        P0=table2[3];
        wela=0;
        delay(5);

        P0=0;
        dula=1;
        P0=table[a%1000/100];
        dula=0;
        P0=0xff;
        wela=1;
        P0=table2[4];
        wela=0;
        delay(5);

        P0=0;
        dula=1;
        P0=table[a/10%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=table2[5];
        wela=0;
        delay(5);

        P0=0;
        dula=1;
        P0=table[a%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=table2[6];
        wela=0;
        delay(5);

}

使用特权

评论回复
地板
yewuyi| | 2011-8-17 08:48 | 只看该作者
uint t;
int t1,t2;
t1=t*255/1000;


程序其它部分就不说了,t是无符号,t1是有符号,怎么能保证算对?
把t改为int后看看。。。

使用特权

评论回复
5
375606426| | 2011-8-17 09:03 | 只看该作者
heee

使用特权

评论回复
6
sysdriver| | 2011-8-17 12:35 | 只看该作者
其他就不说了,建议看看编程规范,格式以及命名等等。。。

使用特权

评论回复
7
afei9527| | 2011-8-17 13:30 | 只看该作者
其他就不说了,建议看看编程规范,格式以及命名等等。。。

使用特权

评论回复
8
ayb_ice| | 2011-8-17 14:24 | 只看该作者
t1=t*255L/1000

使用特权

评论回复
9
johnwjl| | 2011-8-17 14:44 | 只看该作者
与t是无符号,t1是有符号 无关。
改为以下看看:
t1=t*255ul / 1000;
或t1=(long int)t*255 / 1000;

使用特权

评论回复
10
sfesdm| | 2011-8-17 19:57 | 只看该作者
255/1000=0
255.0/1000=0.255

使用特权

评论回复
11
aaron96031| | 2011-8-17 20:29 | 只看该作者
主要类型

使用特权

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

本版积分规则

0

主题

3

帖子

0

粉丝