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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1576|回復(fù): 6
收起左側(cè)

單片機(jī)數(shù)碼管應(yīng)該顯示一樣數(shù)字結(jié)果卻不同,我認(rèn)為是進(jìn)制賦值給SBUF的問題?

[復(fù)制鏈接]
ID:849316 發(fā)表于 2022-4-11 14:35 | 顯示全部樓層 |閱讀模式
1.png

如何改正請(qǐng)指點(diǎn)
發(fā)送程序

/**************************************************************************************                                                  *
*按下K1按鍵  開始計(jì)時(shí)
*按下K2按鍵  計(jì)時(shí)結(jié)束計(jì)算速度                                                                                 
***************************************************************************************/
#include "reg52.h"             //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include<intrins.h>             //左右移函數(shù),頭文件
#include<absacc.h>           //訪問絕對(duì)地址頭文件
sbit k1=P1^0;     //按鍵1開始計(jì)時(shí)
sbit k2=P1^1;     //按鍵2終止計(jì)時(shí)開始計(jì)算速度
sbit dian=P0^7;                  //小數(shù)點(diǎn)
unsigned char xiao=0,ge=0,shi=0,bai=0;        //定義數(shù)碼管顯示的個(gè)位和十位   
unsigned int num=0,sec=0,m=0,v=0,t=0,t1=0,t2=0,t3=0;//定義ms、s、時(shí)間總數(shù)和速度
unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管段控口
/*******************************************************************************
* 函 數(shù) 名         : delay
* 函數(shù)功能           : 延時(shí)函數(shù)
*******************************************************************************/
void delay(unsigned int i)            
{
    while(i--);               // 去抖延時(shí)
}
/*******************************************************************************
* 函 數(shù) 名         : Timer0Init
* 函數(shù)功能           : 定時(shí)器0初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer0Init(void)        //10微秒@12.000MHz
{
    TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。
    TL0 = (65536-10000)%256;        //設(shè)置定時(shí)初值
    TH0 = (65536-10000)/256;        //設(shè)置定時(shí)初值
    ET0=1;//打開定時(shí)器0中斷允許
    EA=1;//打開總中斷
    TR0=1;//打開定時(shí)器   
}
/*******************************************************************************
* 函 數(shù) 名         : display
* 函數(shù)功能           : 速度顯示函數(shù)
*******************************************************************************/
/******速度顯示函數(shù)******/
void display()              //列車一般情況下列車的平均速度為300km/h約等于83m/s
{
ge=v%10;                  //求個(gè)位
bai=v/100;                  //求百位
shi=(v-100*bai)/10;      //求十位
xiao=(v-100*bai-10*shi-ge)/0.1;   //求小數(shù)位
P2=0xf7;                  //選擇數(shù)碼管1,輸入位選信號(hào)
P0=table[xiao];              //數(shù)碼管段選信號(hào),顯示小數(shù)位數(shù)值
delay(15);
P2=0xfb;                  //選擇數(shù)碼管2,輸入位選信號(hào)
P0=table[ge];              //數(shù)碼管段選信號(hào),顯示個(gè)位數(shù)值
dian=1;                  //小數(shù)點(diǎn)點(diǎn)亮
delay(15);
P2=0xfd;                  //選擇數(shù)碼管3,輸入位選信號(hào)
P0=table[shi];              //數(shù)碼管段選信號(hào),顯示十位數(shù)值
delay(15);
P2=0xfe;                  //選擇數(shù)碼管4,輸入位選信號(hào)
P0=table[bai];              //數(shù)碼管段選信號(hào),顯示百位數(shù)值
delay(15);
}
/*******************************************************************************
* 函 數(shù) 名         : keypros
* 函數(shù)功能           : 按鍵處理函數(shù),判斷按鍵是否按下并
*******************************************************************************/
void keypros()
    {
    if(k1==0)          //檢測(cè)按鍵K1是否按下
    {   
    delay(1000);   //消除抖動(dòng) 一般大約1ms
    if(k1==0)     //再次判斷按鍵是否按下
    {
    num++;
    TL0 = (65536-1000)%256;        //設(shè)置定時(shí)初值
    TH0 = (65536-1000)/256;        //設(shè)置定時(shí)初值
    if(num==1000)                //時(shí)間到達(dá)1s
    {
    num=0;                        //重新從1ms開始計(jì)時(shí)
    sec++;                        //累計(jì)1S
    }
    }
    }
    }
    /*****發(fā)送*********/
void Send ()
{    unsigned char dat ;
    dat=v;           //速度中間量
    SBUF=dat;       //發(fā)速度
    while(TI==0); //串行通信口中斷
    TI=0;          //手動(dòng)賦初值
}
/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能         : 主函數(shù)
*******************************************************************************/
void main()
{   
    Timer0Init();  //定時(shí)器0初始化
    TMOD=0x20;       //定時(shí)器1工作于方式2
    SCON=0x40;       //定時(shí)器串口工作方式1允許接收
    PCON=0x00;       //波特率9600
    TH1=0xfa;       //根據(jù)規(guī)定給定時(shí)器T1賦值
    TL1=0xfa;       //根據(jù)規(guī)定給定時(shí)器T1賦值
    TR1=1;           //啟動(dòng)定時(shí)器T1
    while(1)
    {   
    keypros();  //按鍵處理函數(shù)   
    }        
}
/*******************************************************************************
* 函 數(shù) 名         : void Timer0() interrupt 1
* 函數(shù)功能           : 定時(shí)器0中斷函數(shù)
*******************************************************************************/
void Timer0() interrupt 1
{
    TL0 = (65536-10000)%256;        //設(shè)置定時(shí)初值
    TH0 = (65536-10000)/256;        //設(shè)置定時(shí)初值
    if(k2==0)          //檢測(cè)按鍵K2是否按下
    {   
    delay(1000);   //消除抖動(dòng) 一般大約1ms
    if(k2==0)     //再次判斷按鍵是否按下
    {
    m=1000*sec+num;         //求時(shí)間單位為ms
    v=(5000/m)*3.6;             //速度公式求列車速度單位為km/h
    while(1)
    {
    display();    //顯示函數(shù)
    Send ();
    }
    }
    }   
    while(!k2);     //檢測(cè)按鍵是否松開
}
接收程序
/**************************************************************************************                                                  *
*按下K1按鍵  開始計(jì)時(shí)
*按下K2按鍵  計(jì)時(shí)結(jié)束計(jì)算速度                                                                                 
***************************************************************************************/
#include "reg52.h"             //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include<intrins.h>             //左右移函數(shù),頭文件
#include<absacc.h>           //訪問絕對(duì)地址頭文件
sbit k3=P3^5;     //抬桿
sbit dian=P0^7;                  //小數(shù)點(diǎn)
unsigned char xiao=0,ge=0,shi=0,bai=0,count=0;        //定義數(shù)碼管顯示的個(gè)位和十位     
unsigned int v=0,t=0,t1=0,t2=0,t3=0,t4=0;//定義ms、s、時(shí)間總數(shù)和速度
unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管段控口
/*******************************************************************************
* 函 數(shù) 名         : delay
* 函數(shù)功能           : 延時(shí)函數(shù)
*******************************************************************************/
/******延時(shí)函數(shù)******/
void delay(unsigned int i)            
{
    while(i--);               // 延時(shí)
}
/*****時(shí)間顯示函數(shù)*********/
void display()
        {   
        ge=v%10;                  //求個(gè)位
        bai=v/100;                  //求百位
        shi=(v-100*bai)/10;          //求十位
        xiao=(v-100*bai-10*shi-ge)/0.1;   //求小數(shù)位
        P2=0xf7;                  //選擇數(shù)碼管1,輸入位選信號(hào)
        P0=table[xiao];              //數(shù)碼管段選信號(hào),顯示小數(shù)位數(shù)值
        delay(15);
        P2=0xfb;                  //選擇數(shù)碼管2,輸入位選信號(hào)
        P0=table[ge];              //數(shù)碼管段選信號(hào),顯示個(gè)位數(shù)值
        dian=1;                  //小數(shù)點(diǎn)點(diǎn)亮
        delay(15);
        P2=0xfd;                  //選擇數(shù)碼管3,輸入位選信號(hào)
        P0=table[shi];              //數(shù)碼管段選信號(hào),顯示十位數(shù)值
        delay(15);
        P2=0xfe;                  //選擇數(shù)碼管4,輸入位選信號(hào)
        P0=table[bai];              //數(shù)碼管段選信號(hào),顯示百位數(shù)值
        delay(15);
        }

/*******************************************************************************
* 函 數(shù) 名         : Receive
* 函數(shù)功能           : 接收函數(shù)
*******************************************************************************/
unsigned char Receive(void)
{
    unsigned char dat;
    while(RI==0);
    RI=0;
    dat=SBUF;
    return dat;
}
   
/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能         : 主函數(shù)
*******************************************************************************/
void main()
    {   
    TMOD=0X20;       //定時(shí)器1工作于方式2
    SCON=0X50;       //定時(shí)器串口工作方式1允許接收
    PCON=0x00;       //波特率9600
    TH1=0XFD;       //根據(jù)規(guī)定給定時(shí)器T1賦值
    TL1=0XFD;       //根據(jù)規(guī)定給定時(shí)器T1賦值
    TR1=1;           //啟動(dòng)定時(shí)器T1
    REN=1;           //允許接收
    v=Receive();
    while(1)                        
    {    k3=0;                    //抬桿落下
        display();                //顯示函數(shù)
    }   
    }


回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-4-11 15:29 | 顯示全部樓層
  1. void main()
  2.     {   
  3.     TMOD=0X20;       //定時(shí)器1工作于方式2
  4.     SCON=0X50;       //定時(shí)器串口工作方式1允許接收
  5.     PCON=0x00;       //波特率9600
  6.     TH1=0XFD;       //根據(jù)規(guī)定給定時(shí)器T1賦值
  7.     TL1=0XFD;       //根據(jù)規(guī)定給定時(shí)器T1賦值
  8.     TR1=1;           //啟動(dòng)定時(shí)器T1
  9.     REN=1;           //允許接收
  10. //v=Receive();
  11.     while(1)                        
  12.     {    k3=0;                    //抬桿落下
  13. if(RI)
  14. {
  15. RI=0;
  16. v=(unsigned int)SUBF;
  17. }
  18.         display();                //顯示函數(shù)
  19.     }   
  20.     }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:849316 發(fā)表于 2022-4-11 16:23 | 顯示全部樓層

感謝您的解答。我能理解您的意思,您是想表明先給v賦值判斷v賦值完成后再進(jìn)行顯示,這樣程序會(huì)更加嚴(yán)謹(jǐn)。但因?yàn)槲也粔驅(qū)I(yè),程序可能存在問題較大。在改正后,仍不能將使得兩個(gè)數(shù)碼管顯示一樣的數(shù)字。說明發(fā)送函數(shù)和接收函數(shù)有問題。可能是因?yàn)镾BUF僅有一個(gè)字節(jié)無法滿足要求也許我需要學(xué)習(xí)用多個(gè)字節(jié)按位表示一個(gè)數(shù)逐位發(fā)送才會(huì)達(dá)到要求。再次感謝您的幫助。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-4-11 21:22 | 顯示全部樓層
machaore130 發(fā)表于 2022-4-11 16:23
感謝您的解答。我能理解您的意思,您是想表明先給v賦值判斷v賦值完成后再進(jìn)行顯示,這樣程序會(huì)更加嚴(yán)謹(jǐn)。 ...

串口每次只能發(fā)送1個(gè)字節(jié),如果V大于1個(gè)字節(jié)(255)就要按字節(jié)數(shù)量拆分,分多次傳輸。假設(shè)V=0x012c. 拆分V1=0x012c>>8;V2=0x012c;(高8位溢出,V2實(shí)際=0x2c),接收端再把兩個(gè)字節(jié)合并還原:V=V1<<8|V2;
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-4-12 00:04 | 顯示全部樓層
machaore130 發(fā)表于 2022-4-11 16:23
感謝您的解答。我能理解您的意思,您是想表明先給v賦值判斷v賦值完成后再進(jìn)行顯示,這樣程序會(huì)更加嚴(yán)謹(jǐn)。 ...

不是~
你要把v的賦值動(dòng)作放到while(1)里
放到while(1)之前只會(huì)賦值一次

而Receive()里有while(RI==0)
有機(jī)會(huì)死循環(huán)
所以改成回貼那樣
回復(fù)

使用道具 舉報(bào)

ID:849316 發(fā)表于 2022-4-13 11:05 | 顯示全部樓層
lkc8210 發(fā)表于 2022-4-12 00:04
不是~
你要把v的賦值動(dòng)作放到while(1)里
放到while(1)之前只會(huì)賦值一次

這樣啊。您是想讓我用中斷方式(發(fā)送或接受完畢觸發(fā)串行口中斷)代替查詢方式(查詢RI和TI)以免因?yàn)閣hile函數(shù)的缺陷卡在不必要的地方是嗎?我一直在糾結(jié)如何發(fā)送大于255的數(shù)實(shí)現(xiàn)多字節(jié)發(fā)送沒有關(guān)注到這一問題。
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-4-13 11:20 | 顯示全部樓層
machaore130 發(fā)表于 2022-4-13 11:05
這樣啊。您是想讓我用中斷方式(發(fā)送或接受完畢觸發(fā)串行口中斷)代替查詢方式(查詢RI和TI)以免因?yàn)閣hil ...

我改的代碼也是查詢RI啊~
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩专区 | 欧美电影在线观看网站 | 亚洲在线免费 | 欧美男人天堂 | 亚洲精品一区在线 | 国产精品久久久久久久免费观看 | 这里只有精品99re | 天堂av免费观看 | 日韩精品亚洲专区在线观看 | 在线一区 | 狠狠爱一区二区三区 | 欧美日韩久久精品 | 亚洲成人一二区 | 久艹网站 | 成人伊人| h视频免费在线观看 | a级毛片国产 | 亚洲精品播放 | 中文字幕成人 | 黄色片在线 | 午夜三区| 麻豆久久久久久 | 在线观看成人精品 | 99影视 | 国产精品久久久久久久午夜 | 国产精品一区一区 | 亚洲综合日韩精品欧美综合区 | 99国内精品| 天天色天天射天天干 | 看黄在线 | 午夜无码国产理论在线 | 日本一区二区三区四区 | 国产精品亚洲视频 | 中文字字幕一区二区三区四区五区 | 好婷婷网| 人人爱干 | 国产91久久久久久久免费 | 超碰97人人人人人蜜桃 | 国产亚洲精品久久久优势 | 一区二区三区精品视频 | 不卡一区二区三区四区 |