當前位置:首頁 » 編程語言 » 單片機c語言程序片段講解
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

單片機c語言程序片段講解

發布時間: 2022-11-27 23:44:30

『壹』 求深度解析單片機c語言中的下列程序(部分),我實在看不懂。能不能幫我一句句解釋一下

P1=0xff;這個是讓P1口的八個燈全滅。
for(j=0;j<3;j++)//燈一盞盞從上往下亮
{
for(x=0;x<8;x++)控制第幾個燈亮的;
{
P1>>=1;右移一位第一燈亮了,依次亮
delayxms(500);每個燈亮的時間,延遲函數

if(P1==0x00)如果第八個燈亮了 後;就要重新賦予P1口的值;
{
P1=0xff;P1口從新賦值;
for(x=0;x<8;x++)這個語句和上面的類似,就是順序反過來了,他是從第八個燈開始亮的;
{
P1<<=1;左移一位第一燈亮了,依次亮
delayxms(500);延遲函數
}
}
}
}大概就是這樣了 不明白在問我

『貳』 51單片機的c語言程序每一條語句的具體意思,老師考察。

最簡單的流水燈設計,這里得有個假設,P1.7是一個狀態開關,接通時接地線低電平,斷開時浮空
之P2的8個位接8個led燈,低電平時燈亮,高電平時燈熄滅,假設delay(1)是延時等待1毫秒,
程序依開關狀態,向左流水或向右流水,節奏是400毫秒每次
對於開關的變化程序響應比較遲頓,每8*400毫秒檢查一次開關狀態,最長可能是8*400=3.2秒後才正確響應,
...哪句不懂問哪句,每句都解釋那就是對牛彈琴了

『叄』 一個完整的單片機c語言程序包含哪幾個部分

個人覺得,一個完整C程序至少應該包含頭文件、初始化、主程序四個部分,頭文件是程序編譯預處理的重要組成部分,缺了它就無法生成目標代碼;初始化部分包含變數初始化和埠初始化;主程序是一個C程序的核心代碼,由此執行或調用一些具有特定功能的函數模塊以完成程序的預設功能。

『肆』 請高手介紹單片機C語言的程序

#include<reg51.h>
unsigned char code
dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位碼
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //段碼
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10}; //顯示緩沖區
unsigned char temp[8];
unsigned char dispcount;
unsigned char T0count;//計數器0的計數變數,每秒清零一次
unsigned char timecount;
bit flag;
unsigned long x;

void main(void)
{
unsigned char i;
TMOD=0X15; //定時器0工作在計數器狀態,定時器1工作在16位定時狀態
TH0=0; //設置初始值
TL0=0;
TH1=(65536-4000)/256; //計數周期為4000,如果晶振為12M,那麼定時器1的中斷周期為4ms,
TL1=(65536-4000)%256; //將初始值送入TH與TL
TR0=1; //打開計數使能
TR1=1;
ET0=1; //開計數器中斷
ET1=1;
EA=1; //開總中斷

while(1)
{
if(flag==1) //這個if語句中的標志變數在定時器1的ISR中改變,也就是說每4ms這個if語句的內容執行一次
{flag=0; //標志位清零

x=T0count*65536+TH0*256+TL0;//計算出總的計數周期,比較重要的一句

//以下的循環只干一件事,那就是將長整型變數轉換為一個整型數組,每位用一個數字表示,至於演算法很簡單
//例如x為123456,那麼temp[0]=6,temp[1]=5,……temp[5]=1;
for(i=0;i<8;i++)
{
temp[i]=0;}
i=0;
while(x/10)
{temp[i]=x%10; //x%10就是x的個位
x=x/10;
i++;
}

temp[i]=x;/此句有問題,將long類型變數傳遞給char型會溢出,只保留低8位??
for(i=0;i<6;i++)
{dispbuf[i]=temp[i];}

timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
}
}
}

void t0(void) interrupt 1 using 0 //計數器0的中斷服務程序
{T0count++;} //計數值加一

void t1(void) interrupt 3 using 0 //定時器1的中斷服務程序
{TH1=(65536-4000)/256; //計數周期為4000,如果晶振為12M,那麼定時器1的中斷周期為4ms,這行除256的意思就是取高8位
TL1=(65536-4000)%256; //取低8位
timecount++;
if(timecount==250)// 這個變數為一個計數變數,當其為250時,時間為250*4ms=1S(見上面的注釋)
{TR0=0; //禁止計數器0計數
timecount=0; //清零
flag=1;
}

//以下為七段數碼管的動態掃描程序,如果你熟悉數碼管的動態掃描,應該會明白
//如果沒接觸過,那我也。。。主要該段與硬體比較密切

P0=dispcode[dispbuf[dispcount]];
P2=dispbit[dispcount];
dispcount++;
if(dispcount==8)//逐位掃描,當掃描到最後一位則從第一位開始
{dispcount=0;
}
}

由於嵌入式系統軟硬體結合緊密,定時器0為什麼工作在計數狀態,誰給的計數信號,數碼管共陰還是共陽等都需要硬體電路才能分析清楚,其實讀單片機的程序最重要的是作者的思路,有時候單看其中每句都明白意思(本意),但就是看不出作者要干什麼,這就是我給的注釋不太詳細但都給出了思路和作用的緣故。。。

不是高手,只是有一點研究,希望你能看明白

『伍』 請解釋下單片機中的C語言程序

在你include的頭文件里肯定有ADDO的定義,一定是個輸入埠,dat|=ADDO代表
dat=dat|ADDO;之後dat<<=1就是dat=dat<<1,左移1位,i==7就是最後1位的時候又采樣1次。

『陸』 單片機(c語言)程序解釋

/********
//P1.0波形為:
//1、10ms為周期的方波或持續的高、低電平(與Flag、P1.0初始值有關),持續2秒。
//2、持續的高、低電平或10ms為周期的方波(與Flag、P1.0初始值有關),持續2秒。
//3、重復1、2步驟。
*********/
#include <AT89X51.H>
unsigned int t02s;
unsigned char t05ms;
bit flag;

void main(void)
{
TMOD=0x01; //初始化定時器。
//可以對照單片機PDF相應章節,按位對比。
//此處設置定時器0工作於「16 位定時器/ 計數器,TL0、TH0 全用」模式。

TH0=(65536-500)/256; //初始化定時/計數器高位元組。
TL0=(65536-500)%256; //初始化。。。。。。低位元組。

TR0=1; //啟動定時器0。

//以下兩句開啟定時器中斷,缺一不可。
ET0=1; //允許定時器0中斷。
EA=1; //開啟全局中斷。

while(1); //循環,整個程序交由定時中斷控制。
}

//此處為定時器中斷子程序,每次定時器溢出,進入此段程序。
//根據參數定義,每5ms中斷一次。
//定時器中斷後,計數不停止,但是需要重新初始化定時/計數器。
void t0(void) interrupt 1 using 0
{
//重新「初始化定時/計數器」高、低位元組。
TH0=(65536-500)/256;
TL0=(65536-500)%256;

//每次中斷,t02s 加 1。
t02s++;
//增加400次後(5ms × 400 = 2s),flag標志取反。
if(t02s==400)
{
t02s=0;
flag=~flag;
}

//若中斷時flag標志為0,P1.0口取反。
if(flag==0)
{
P1_0=~P1_0;
}
}

『柒』 求一段51單片機按鍵C語言程序詳解

P1.0、P1.1都控制 LED
試試下面程序:

#include <reg51.h>
sbit led = P1^0;
sbit key = P1^7;
void main()
{
while(1) led = key;
}

P1.1知道用

『捌』 單片機c語言語程序解釋

程序運行時應該會先執行這一句:在這里賦值。
else
{
val-=5;
P0=val; //通過P0口給DA數據口賦值
if(val==0)
{
flag=0;
beep=0;
delayms(100);
beep=1;
}
delayms(50);
}

『玖』 單片機C語言程序,看不懂,求講解

「T0中斷服務程序不是一個子程序嗎?但沒看見在主程序中調用這個子程序啊,求講解這個程序命令的運行過程,定時器怎麼中斷的?」
該子程序是在硬體產生中斷的時候,跳轉到相應中斷入口後,再跳轉到這個中斷服務程序的。請注意函數後面的「interrupt x」聲明,這是C51的擴展內容。
「用示波器測波形是測p1.0引腳,為什麼是這個引腳,怎麼確定的?p1_0不是個變數名嗎?」
P1_0這個符號在前面的頭文件 t89c51cc02.h 中有定義。至於「為什麼是這個引腳」,是由硬體設計及本程序共同確定的。P1_0(不是你寫的p1_0,C語言要區分大小寫哦)代表P1口的第0管腳,在頭文件中通過sbit定義。
「為什麼T0中斷服務程序和主程序中都有T0的初值,設置還是一樣,他們有什麼關系?」
主程序前面的是對Timer0初始化,賦以初值。執行 TR0 = 1; 這一句以後,Timer0就開始運行了——TL0與TH0組成的13位計數器開始不斷遞增。當13位全部為1之後,再遞增就全部為0,此時溢出事件會觸發產生定時器0,同時計數器仍然在繼續計數——為了讓時間間隔保持一致,就需要再度將計數器賦以初值。

『拾』 單片機的C語言程序,就講解,我沒看懂這是個什麼意思

uchar keyscan(void) //鍵盤掃描函數,使用行列反轉掃描法
{
uchar cord_h,cord_l; //定義行、列值變數
P2=0x0f; //行輸出全為0
cord_h=P2&0x0f; //讀入列值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P2&0x0f; //讀入列值
P2=cord_h|0xf0; //輸出當前列值
cord_l=P2&0xf0; //讀入行值
return(cord_h+cord_l);//鍵盤最後組合碼值
}
}
}