久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2159|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品一级 | 亚洲一区二区不卡在线观看 | 一本大道久久a久久精二百 国产成人免费在线 | 牛牛热在线视频 | 日韩三级在线观看 | 三极网站 | 69性欧美高清影院 | 99福利在线观看 | 精品国产伦一区二区三区观看体验 | 久久亚洲一区二区三区四区 | 国产高清免费视频 | 国产一二三视频在线观看 | 久久伊人免费视频 | 日韩a| 亚洲精品久久区二区三区蜜桃臀 | 亚洲欧美第一视频 | 免费在线一区二区 | 久久福利电影 | 欧美在线二区 | 四虎影院免费在线 | 超碰国产在线 | 久草成人 | 九九综合 | 成人福利电影 | 欧美性大战久久久久久久蜜臀 | 国产日韩欧美在线播放 | 东方伊人免费在线观看 | 国产精品久久久久影院色老大 | 99re视频在线 | 午夜视频网站 | 99精品免费久久久久久日本 | 免费视频一区 | 天色综合网 | 国产成人精品一区二区三区视频 | 日韩欧美三区 | 日韩精品在线网站 | 国产 欧美 日韩 一区 | 自拍第一页 | 精品一二三 | 午夜影院普通用户体验区 | 成人免费日韩 |