找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新人求助,关于串口中断,请大神帮助诊断

[复制链接]
跳转到指定楼层
楼主
ID:135676 发表于 2016-9-7 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面程序不知什么地方出问题,程序烧入单片机后,用串口调试助手调试后,输入数据,窗口不显示。请大神帮助诊断下。


#include <reg52.h>                    //52系列单片机头文件
#include "intrins.h"
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;                //申明U1锁存器的锁存端
sbit wela=P2^7;                //申明U2锁存器的锁存端
sbit adwr=P3^6;
sbit adrd=P3^7;
uchar flag;
uchar flag_uart,flag_time,flag_on,a,t0_num,ad_val;
float ad_vo;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delayms(uint); //调用函数需要提前声明。
void init();
void display(uchar value);
       

void delayms(uint xms)                               
{
        uint i,j;
        for(i=xms;i>0;i--);                      //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}

void init()
{
        TMOD=0x20;//设置定时器1为工作方式2
        PCON=0x00;
//        SCON=0x50;
        EA=1;
        ES=1;
        REN=1;
        TH0=(65536-50000)/256; //波特率设置为
        TL0=(65536-50000)%256;
        TH1=0xfd;
        TL1=0xfd;
        ET0=1;//开定时器0中断
    ET1=1;//开定时器1中断
        TR1=1;
        TR0=1;//启动定时器0中断
       
//        SM0=0;
//        SM1=1;


}
       

void display(uchar value) //显示程序
{
uchar bai,shi,ge;
bai=value/100;
shi=value*100/10;
ge=value%10;
dula=1;
P0=table[bai]; //显示百位
dula=0;
P0=0xff;
wela=0;
P0=0x7e;
wela=0;
delayms(5);

dula=1;
P0=table[shi]; //显示百位
dula=0;
P0=0xff;
wela=0;
P0=0x7d;
wela=0;
delayms(5);

dula=1;
P0=table[ge]; //显示百位
dula=0;
P0=0xff;
wela=0;
P0=0x7b;
wela=0;
delayms(5);
}

uchar get_ad()
{
uchar adval;
adwr=1; //AD写入(随便写个什么都行,主要是为了启动//AD转换)
_nop_(); //一个延时字函数
adwr=0;         //先给高电平
adrd=0;        //启动A/D转换,低电平有效。
_nop_();
adwr=1;
P1=0xff;
adrd=1;
_nop_();
adrd=0;
_nop_();
adval=P1;
adrd=1;
return adval;
}



void main()
{
        init();
        wela=1;
        P0=0x7F;
        wela=0;

        while(1)
        {
        if(flag_uart==1)
        {
               
                ES=0;
                RI=0;
                flag_uart=0;
                SBUF=a;
                switch(flag_on)
                {
                        case 0:puts("Turn on ad!\n");TR0=1;break;
                    case 1:printf("Turn off ad!\n");TR0=0;break;
                        case 2:puts("Error!\n");break;
                }
        while(!TI);
        TI=0;
        ES=1;
    }
        if(flag_time==1)
        {
                flag_time=0;
                ad_val=get_ad();
                ad_vo=(float)ad_val*5.0/256.0;
                ES=0;
                RI=0;
                printf("The voltage is %fV\n",ad_vo);
                while(!TI);
                TI=0;
                ES=1;

        }
           display(ad_val);
        }
}

               


       
void t1()interrupt 1
{
        TH0=(65536-50000)/256; //波特率设置为
        TL0=(65536-50000)%256;
        t0_num++;;
        if(t0_num==20)
        {
                t0_num=0;
                flag_time=1;
        }
}
       

void ser()interrupt 4
{
        RI=0;
        a=SBUF;
        flag_uart=1;
        if(a==1)
    flag_on=0;
        else if(a==2)
            flag_on=1;
        else
                flag_on=2;

}


评分

参与人数 1黑币 +5 收起 理由
牛奶打篮球 + 5

查看全部评分

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

使用道具 举报

沙发
ID:135676 发表于 2016-9-8 16:32 | 只看该作者
感谢各位支持,我已修改通过。
//程序已经调通

#include<reg51.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int //宏定义,详情请看C语言书。
#define uchar unsigned char
sbit adrd=P3^7; //AD读引角
sbit adwr=P3^6; //AD写引角
//sbit diola=P2^5;
sbit dula=P2^6; //数码管段选锁存
sbit wela=P2^7; //数码管位选锁存
unsigned char j,k,adval,ss;
uchar b1,num,flag_time,ch;
float ad_vo;
void delay(unsigned char i) //延时程序
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
uchar code table[]= //数码管编码
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};

//void Send_char(uchar ch)//发送单个字符
//{
//        RI=0;
//        ch=SBUF; //送入缓冲区
//        while(TI!=1); //等待发送完毕
//        TI=0; //软件清零
//}
//void Send_order(uchar *p)//发送字符串
//{
//        while(*p!='\0')
//        {
//        Send_char(*p);
//        p++;
//        }
//}
void Start()
{
        TMOD=0x21;//设置定时器1为工作方式2,定时器0为工作方式1
        TH1=0xfd;
        TL1=0xfd;//波特率9600MHZ
        TH0=0xec;
        TL0=0x78;//时间5MS
        TR1=1;
        TR0=1;
        SCON=0X50;//模式1,开串口
        IE=0X82;//开串行口中断
        PS=1;
}

void display(uchar value) //显示程序
{
    uchar bai,shi,ge;
        bai=value/100; //分出百,十,和个位
        shi=value%100/10;
        ge=value%10;
       
        dula=1;
        P0=table[bai]; //显示百位
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7e;
        wela=0;
        delay(20);

        dula=1;
        P0=table[shi]; //显示百位
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7d;
        wela=0;
        delay(20);

        dula=1;
        P0=table[ge]; //显示百位
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7b;
        wela=0;
        delay(20);
}

uchar get_ad()
{         
//        uchar a;
        wela=1;
        P0=0;                       //选通ADCS
    adwr=0;                        //AD写入(随便写个什么都行,主要是为了启动AD转换)
    _nop_();
    adwr=1;
    P0=0xff;                    //关闭ADCS
    delay(10);
    wela=0;                     //关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化
//       for(a=20;a>0;a--)        //需要注意的是ADC0804在写和读之间的时间间隔要足够长否则无法读出数据
//    {                           //这里把显示部分放这里的原因也是为了增加写读之间的时间间隔                                                                                                                                                                                                                           
//      
//    }        //送去显示各位。
     wela=1;                   //重新打开有AD片选信号锁存器的锁存端
     P1=0xff;                    //读取P1口之前先给其写全1
     P0=0;                       //选通ADCS
     adrd=0;                     //AD读使能
     adval=P1;                        //AD数据读取赋给P1口
     adrd=1;
     P0=0xff;                     //关闭ADCS
     adwr=0;
     P1=adval;               
         return adval;
}

void ser()
{
        RI=0;
        ch=SBUF;
}

void main()
{
        Start();
        ser();
        while(1)
        {
        if(num==20)
                {
                        num=0;
//                        Send_order(MSG);
                        b1=get_ad();
                        ad_vo=(float)b1*5.0/256.0;
                     ES=0;
                        TI=1;
                        printf("The voltage  is %f\n",ad_vo);
                        while(!TI);
                        TI=0;
                        ES=1;
//                        display(b1);
                }
                                display(b1);
}

}

       



void send()interrupt 1
{
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
num++;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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