找回密码
 立即注册

QQ登录

只需一步,快速开始

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

路过的大神,求求您了。新手已被这个程序折磨两周了

  [复制链接]
跳转到指定楼层
楼主
ID:152852 发表于 2016-12-7 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"ad.h"//A/D转换部分
u8 e;
void read()//读取TLC1549转换过来的温度值
{                       
    clock=1;
    ctrl=1;
    t=0;
    ctrl=0;
    for(e=0;e<10;e++)
{
        clock=0;
        t*=2;
        if(here) t++;
        //delayms(1);
        clock=1;
    }
    ctrl=1;
}
#ifndef _AD_H_
#define _AD_H_
#include<reg52.h>
#include<stdio.h>
#include"led.h"
//extern u16 t;
sbit ctrl=P2^2;//TLC1549的三个控制位
sbit here=P2^1;
sbit clock=P2^0;
void read();   
#endif
#ifndef _LED_H_
#define _LED_H_
#include<reg52.h>
#define u8 unsignedchar
#define u16 unsignedint
extern u16 t;
extern u8 s;
extern u8 ss;
void display(u8h[]);
void display_s(u8s);               
void display_w(u8h[]);
void delayms(u8 ms);              
#endif
#include"led.h"
#include<reg52.h>
sbit point=P0^7;
u8 ms=3;
u8 mms=3;
u8 code num[]={ //数码管真值表
~0x3f,~0x06,~0x5b,~0x4f,
~0x66,~0x6d,~0x7d,~0x07,
~0x7f,~0x6f,~0x77,~0x7c,
~0x39,~0x5e,~0x79,~0x71};
u8 codeerr[]={0xff,0x86,0x88,0x88};
void delayms(u8 s){//延时函数
    u8 i,j;
    for(i=s;i>0;i--){
        for(j=80;j>0;j--);
    }
}
void display(u8 h[])//未超过阈值时,LED显示函数,数码管共4位,从左往右滚动显示,4位均为温度值
{
    switch(s){
    case 0:
        P1=0xFE;
        P0=err[0];
        delayms(mms);
        P1=0xFD;
        P0=num[h[0]];
        delayms(mms);
        P1=0xFB;
        P0=num[h[1]];
        point=0;
        delayms(mms);
        P1=0xF7;
        P0=num[h[2]];
        delayms(mms);
        break;
    case 1:
        P1=0xFE;
        P0=num[h[2]];
        delayms(mms);
        P1=0xFD;
        P0=err[0];
        delayms(mms);
        P1=0xFB;
        P0=num[h[0]];
        delayms(mms);
        P1=0xF7;
        P0=num[h[1]];
        point=0;
        delayms(mms);
        break;
    case 2:
        P1=0xFE;
        P0=num[h[1]];
        point=0;
        delayms(mms);
        P1=0xFD;
        P0=num[h[2]];
        delayms(mms);
        P1=0xFB;
        P0=err[0];
        delayms(mms);
        P1=0xF7;
        P0=num[h[0]];
        delayms(mms);
        break;
    case 3:
        P1=0xFE;
        P0=num[h[0]];
        delayms(mms);
        P1=0xFD;
        P0=num[h[1]];
        point=0;
        delayms(mms);
        P1=0xFB;
        P0=num[h[2]];
        delayms(mms);
        P1=0xF7;
        P0=err[0];
        delayms(mms);
        break;
    default:break;
    }
}
void display_w(u8h[]){//超过阈值时,LED显示函数,数码管共4位,从左往右滚动显示,前4位为温度值,后4位为ERR.
    switch(ss){
    case 0:
        P1=0xFE;
        P0=err[0];
        delayms(ms);
        P1=0xFD;
        P0=num[h[0]];;
        delayms(ms);
        P1=0xFB;
        P0=num[h[1]];
        point=0;
        delayms(ms);
        P1=0xF7;
        P0=num[h[2]];
        delayms(ms);
        break;
    case 1:
        P1=0xFE;
        P0=err[3];
        delayms(ms);
        P1=0xFD;
        P0=err[0];
        delayms(ms);
        P1=0xFB;
        P0=num[h[0]];
        delayms(ms);
        P1=0xF7;
        P0=num[h[1]];
        point=0;
        delayms(ms);
        break;
    case 2:
        P1=0xFE;
        P0=err[2];
        delayms(ms);
        P1=0xFD;
        P0=err[3];
        delayms(ms);
        P1=0xFB;
        P0=err[0];
        delayms(ms);
        P1=0xF7;
        P0=num[h[0]];
        delayms(ms);
        break;
    case 3:
        P1=0xFE;
        P0=err[1];
        delayms(ms);
        P1=0xFD;
        P0=err[2];
        delayms(ms);
        P1=0xFB;
        P0=err[3];
        delayms(ms);
        P1=0xF7;
        P0=err[0];
        delayms(ms);
        break;
    case 4:
        P1=0xFE;
        P0=err[0];
        delayms(ms);
        P1=0xFD;
        P0=err[1];
        delayms(ms);
        P1=0xFB;
        P0=err[2];
        delayms(ms);
        P1=0xF7;
        P0=err[3];
        delayms(ms);
        break;
    case 5:
        P1=0xFE;
        P0=num[h[2]];
        delayms(ms);
        P1=0xFD;
        P0=err[0];
        delayms(ms);
        P1=0xFB;
        P0=err[1];
        delayms(ms);
        P1=0xF7;
        P0=err[2];
        delayms(ms);
        break;
    case 6:
        P1=0xFE;
        P0=num[h[1]];
        point=0;
        delayms(ms);
        P1=0xFD;
        P0=num[h[2]];
        delayms(ms);
        P1=0xFB;
        P0=err[0];
        delayms(ms);
        P1=0xF7;
        P0=err[1];
        delayms(ms);        
        break;
    case 7:
        P1=0xFE;
        P0=num[h[0]];
        delayms(ms);
        P1=0xFD;
        P0=num[h[1]];
        point=0;
        delayms(ms);
        P1=0xFB;
        P0=num[h[2]];
        delayms(ms);
        P1=0xF7;
        P0=err[0];
        delayms(ms);
        break;
    default:break;
    }
}
void display_s(u8s){
    P1=0xF7;
    P0=s;
    delayms(20);
}
#include<reg52.h>
#include"led.h"
#include"uart.h"
#include"timer.h"
#include"ad.h"
u16 YZ;
u16 x;
u16 y;
u8 z;
u8 i;
u8 f;
u8 f_f;
u16 t;
u8 s;
u8 ss;
u16 t_now;
u16 t_now_g;
u8 t_cnt;
u8 ff;
double t_s;
sbit beep=P1^5;
u8 dat[2];
u8 ber[4];
u8 ber_s[4];
u8 ber_w[4];
u8 codestr[]="shan";
void fengming()//控制蜂鸣器蜂鸣函数
{
  int i,j;
  for(i=0;i<5;i++)
  {
      beep=~beep;
     for(j=0;j<10;j++) ;
  }
}
void main(){
    ff=0;//初始化
    f_f=0;
    t=0;
    s=0;
    ss=0;
    t_cnt=0;
    YZ=3500;
    uartInit();
    timerInit();
    EA=1;
    while(1){//程序主体,不断采集数据并显示出来
        //beep=0;
        //display(ber);
        if(f_f==1){//上位机设置阈值
            ES=0;
            YZ=x*100+y*10+z;
            YZ*=10;
            f_f=0;
            ES=1;
        }
        if(t_now>YZ){//如果超过阈值,就发出警报
            fengming();
            display_w(ber_w);
        }else{
            display(ber_s);
        }
    }
    return;
}
void T0_time()interrupt 1//定时器中断,读取温度值
{
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    t_cnt++;
    if(t_cnt%5==0){
        ss++;
        if(ss==8)
            ss=0;
    }
        switch(ss){
        case 4:
            ber_w[0]=ber[0];
            ber_w[1]=ber[1];
            ber_w[2]=ber[2];
            break;
        case 5:
            ber_w[2]=ber[2];
            break;
        case 6:
            ber_w[2]=ber[2];
            ber_w[1]=ber[1];
            break;
        case 7:
            ber_w[0]=ber[0];
            ber_w[1]=ber[1];
            ber_w[2]=ber[2];
            break;
        default:break;
    }
    if(t_cnt%10==0){
        s++;
        if(s==4)
            s=0;
        switch(s){
        case 0:
            ber_s[0]=ber[0];
            ber_s[1]=ber[1];
            ber_s[2]=ber[2];
            break;
        case 1:
            ber_s[2]=ber[2];
            break;
        case 2:
            ber_s[2]=ber[2];
            ber_s[1]=ber[1];
            break;
        case 3:
            ber_s[0]=ber[0];
            ber_s[1]=ber[1];
            ber_s[2]=ber[2];
            break;
        default:break;
        }
    }
    if(t_cnt==40){
        t_cnt=0;
        read();
        dat[0]=(u8)((t&0xff00)>>8);
        dat[1]=(u8)(t&0x00ff);
        uartSend(dat);
        t_s=(double)t;
        t_s=10.0*t_s*0.004453125/(4.56-t_s*0.004453125);
     t_s=-0.0001*t_s*t_s*t_s*t_s*t_s+0.0051*t_s*t_s*t_s*t_s-0.1314*t_s*t_s*t_s+1.9054*t_s*t_s-16.6801*t_s+90.7365;
        t_s=t_s*100;
        t_now=(u16)t_s;
        t_now_g=t_now%100;
        t_now-=t_now_g;
        if(t_now_g>=50){
            t_now+=50;
        }
        //t_now-=500;
        //t_now=3456;
        ber[0]=t_now/1000%10;
        ber[1]=t_now/100%10;
        ber[2]=t_now/10%10;
        ber[3]=t_now%10;
        //uartSend(ber);
        //ES=1;
    }
}
void T1_time()interrupt 4//串口中断,上位机发送阈值给下位机
{
    if(RI==1){
        ff++;
        RI=0;
        if(ff==1){
            x=SBUF-'0';//x、y、z用来设置阈值
        }
        if(ff==2)
        {
            y=SBUF-'0';
        }
        if(ff==3)
        {
            z=SBUF-'0';
            ff=0;
            f_f=1;
        }
    }
}
#ifndef _UART_H_
#define _UART_H_
#include<reg52.h>
#include"led.h"
void uartInit();
void uartSend(u8s[]);
#endif      
#include"timer.h"//定时器初始化
void timerInit(){
    TMOD=0x21;
    TH0=(65536-N)/256;
    TL0=(65536-N)%256;
    ET0=1;
    TR0=1;
}
#include"uart.h"
void uartInit(){//串口初始化
    TMOD=0x20;
    TH1=0xFD;//设置波特率
    TL1=0xFD;
    TR1=1;
    SM0=0;
    SM1=1;
    REN=1;
    ES=1;
}
void uartSend(u8s[]){//给上位机传送数据
    u8 i;
    for(i=0;i<2;i++){
        SBUF=s[ i];
        while(!TI);
        TI=0;
    }
}

I}GTMDCL6I%~E$ZSIUL8DGG.png (126.67 KB, 下载次数: 76)

错误报警

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

使用道具 举报

沙发
ID:123289 发表于 2016-12-7 11:58 | 只看该作者
求助什么也说不清,弄程序有的玄.
回复

使用道具 举报

板凳
ID:152858 发表于 2016-12-7 11:58 | 只看该作者
语法错误和头文件缺少
回复

使用道具 举报

地板
ID:1 发表于 2016-12-7 15:47 | 只看该作者
缺少头文件啊
回复

使用道具 举报

5#
ID:152928 发表于 2016-12-7 16:10 | 只看该作者
头文件没有找到,找到库文件所在位置,拷贝到BIN目录下或在加载的头文件中加上路径
回复

使用道具 举报

6#
ID:142320 发表于 2016-12-7 16:19 | 只看该作者
作为一个新手,调试程序一定要一个模块一个模块调,调好了基本功能再来串联调,这样你叫人家怎么回答
回复

使用道具 举报

7#
ID:142320 发表于 2016-12-7 16:24 | 只看该作者
同时在中断里面做了很复杂的计算,然后这个语句执行的时间有没有看过,总之是先一个模块一个模块调好了,再来说什么问题,或者说哪个模块在调试时出问题,出怎么的问题,否则人家很难帮你。再加上作为一个新手,编程没加说明,让我们来分析,我们没这么多时间,这样的新手如果是我的学生,直接拉出去了,我一直说要养成好的编程习惯。
回复

使用道具 举报

8#
ID:152948 发表于 2016-12-7 16:53 | 只看该作者
记的一步步仿真调试,看程序路程是否按照预期的思路跑,这样很容易定位问题点
回复

使用道具 举报

9#
ID:111634 发表于 2016-12-7 20:30 | 只看该作者
gujp312365 发表于 2016-12-7 16:24
同时在中断里面做了很复杂的计算,然后这个语句执行的时间有没有看过,总之是先一个模块一个模块调好了,再 ...

直接拉出去了
回复

使用道具 举报

10#
ID:153068 发表于 2016-12-8 00:01 | 只看该作者
头文件没找到,127行代码写错了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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