1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

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

QQ登錄

只需一步,快速開(kāi)始

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

關(guān)于單片機(jī)延時(shí)函數(shù)和定義變量的一點(diǎn)問(wèn)題

[復(fù)制鏈接]
ID:627807 發(fā)表于 2019-11-4 21:23 | 顯示全部樓層 |閱讀模式
今天我在擺弄1602的時(shí)候,想讓一組字母從地址0x80+0x10處左移16位,一開(kāi)始我的程序?qū)懞弥螅_(kāi)始運(yùn)行,可是就左移一位就卡住了,只左移了一位,下面是單片機(jī)源程序:
————————————————
#include <reg52.h>
typedef unsigned char uchar;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
uchar code table[]="I LOVE YOU";
void read_busy()
{
        uchar busy;
        P0=0xff;
        RS=0;
        RW=1;
        do
        {
                EN=1;
                busy=P0;
                EN=0;
        }while(busy&0x80);
}
void write_cmd(uchar cmd)
{
        read_busy();
        RS=0;
        RW=0;
        P0=cmd;
        EN=1;
        EN=0;
}
void write_date(uchar date)
{
        read_busy();
        RS=1;
        RW=0;
        P0=date;
        EN=1;
        EN=0;
}
void delay(int x)
{
        char i,j;
        for(i=0;i<x;i++)
        for(j=0;j<125;j++);
}
void main()
{
        uchar i,num;
        write_cmd(0x38);//初始化
        write_cmd(0x0e);//開(kāi)顯示
        write_cmd(0x01);//清屏
        write_cmd(0x06);//地址指針加1
        write_cmd(0x80+0x00);
        
        for(num=0;num<10;num++)
        {
                write_date(table[num]);
        }
        for(i=0;i<16;i++)
        {
                write_cmd(0x18);
                delay(250);
        }
        while(1);        
}        
——————————————————
但是之后我檢查了一下好幾遍程序,發(fā)現(xiàn)無(wú)論是初始化,還是讀忙,還是輸入指令,輸入數(shù)據(jù),都沒(méi)有問(wèn)題,
那唯一可能的就是延時(shí)函數(shù)那一塊,于是我看了延時(shí)函數(shù),
void delay(int x)
{
        char i,j;
        for(i=0;i<x;i++)
        for(j=0;j<125;j++);
}
————
發(fā)現(xiàn)我把x定義成int,把i和j定義成char了,然后我把char改成了int,重新燒錄程序,發(fā)現(xiàn)這次程序運(yùn)行正確,
即把函數(shù)改為
void delay(int x)
{
        int i,j;
        for(i=0;i<x;i++)
        for(j=0;j<125;j++);
}

————
之后我又把int改為了char,發(fā)現(xiàn)這次程序運(yùn)行的特別快,幾乎看不到字母移動(dòng)的過(guò)程,
即把函數(shù)改為:
void delay(char x)
{
        char i,j;
        for(i=0;i<x;i++)
        for(j=0;j<125;j++);
}

然而之后我又把函數(shù)改為
void delay(int x)
{
        unsigned char i,j;        
     for(i=0;i<x;i++)


        for(j=0;j<125;j++);
}

發(fā)現(xiàn)程序竟然還可以正常運(yùn)行,
請(qǐng)各位大佬幫忙解惑,以前從來(lái)沒(méi)有關(guān)注過(guò)這個(gè)問(wèn)題

這是剛開(kāi)始的時(shí)候的運(yùn)行結(jié)果

這是剛開(kāi)始的時(shí)候的運(yùn)行結(jié)果

video_20191104_210240.zip

6.14 MB, 下載次數(shù): 3

這是把延時(shí)函數(shù)中的char改為int之后1602運(yùn)行的過(guò)程

video_20191104_211138.zip

5.18 MB, 下載次數(shù): 2

這是把延時(shí)函數(shù)中的int改為char后1602顯示的過(guò)程

回復(fù)

使用道具 舉報(bào)

ID:635731 發(fā)表于 2019-11-5 02:04 | 顯示全部樓層
delay(250)-->250已經(jīng)超出了char變量可以表示的范圍,即溢出了,實(shí)際已為負(fù)數(shù),所以基本上沒(méi)有延時(shí)了,所以程序運(yùn)行得特別快
回復(fù)

使用道具 舉報(bào)

ID:365802 發(fā)表于 2019-11-5 08:10 | 顯示全部樓層
char -128 ~ +128
unsigned char 0-256
int -32768 ~ +32768
int 0 ~ 65536
顯然你需要復(fù)習(xí)一下各類(lèi)型能表示的范圍.
回復(fù)

使用道具 舉報(bào)

ID:635290 發(fā)表于 2019-11-5 08:27 | 顯示全部樓層
char溢出了
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2019-11-5 08:44 | 顯示全部樓層
1.有參延時(shí)函數(shù)的參數(shù)數(shù)據(jù)類(lèi)型應(yīng)與函數(shù)內(nèi)for循環(huán)變量的數(shù)據(jù)類(lèi)型一致。否則由于可能發(fā)生數(shù)據(jù)溢出而達(dá)不到預(yù)想的延時(shí)時(shí)間。
2.CPU處理8位數(shù)據(jù)和處理16位數(shù)據(jù)所耗時(shí)不同,所以相同的延時(shí)函數(shù)只改變數(shù)據(jù)類(lèi)型,兩者延時(shí)時(shí)間相差4倍。

在12T單片機(jī)和12MHz晶振的條件下兩種延時(shí)函數(shù)的延時(shí)時(shí)間:
        delay(250); //uchar 型 64.76ms
        delay(250); //uint   型253.26ms
回復(fù)

使用道具 舉報(bào)

ID:627807 發(fā)表于 2019-11-5 13:23 來(lái)自觸屏版 | 顯示全部樓層
ping264888 發(fā)表于 2019-11-5 08:10
char -128 ~ +128
unsigned char 0-256
int -32768 ~ +32768

是的是的,以前學(xué)過(guò),但是沒(méi)怎么記
回復(fù)

使用道具 舉報(bào)

ID:627807 發(fā)表于 2019-11-5 13:24 來(lái)自觸屏版 | 顯示全部樓層
哦哦,謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表