導航:首頁 > 操作系統 > 單片機經典c程序

單片機經典c程序

發布時間:2022-06-26 22:21:49

單片機c程序

定義一個uchar類型的數組Display_Digit。數組的元素有4個,且初始值都為0。Display_Digit[] 中括弧里沒有數字是因為它所有的元素都列出來了,所以可以省略。uchar類型是unsigned char, 沒有符號位,因此能表示0~255。這個類型應該可以跟蹤到他的定義,一般是一個宏定義: #define uchar unsigned char

㈡ 51單片機的c語言程序

請你參考:

#include<reg51.h>

unsignedchari;

voidDelayms(unsignedintx)
{
unsignedchart;
while(x--)
for(t=0;t<120;t++);
}

voidmain()
{
IT1=1;
IE|=0x84;
P2=0xFE;
i=1;
while(1);
}

voidEX1_INT()interrupt2
{
ET0=0;
Delayms(10);
P2=~(1<<i);
i=++i%8;
ET0=1;
}

㈢ 關於單片機的一個c程序

修改switch裡面內容就可以了。
switch(number)
{
case 0:P2=0x01;P0=distab[1];break;
case 1:P2=0x02;P0=distab[3];break;
case 2:P2=0x04;P0=distab[4];break;
case 3:P2=0x08;P0=distab[6];break;
case 4:P2=0x10;P0=distab[2];break;
case 5:P2=0x20;P0=distab[5];break;
default:break;
}

㈣ 51單片機C程序

sfr
P0M1
=
0X93;
sfr
P0M0
=
0X94;
sfr
P1M1
=
0X91;
sfr
P1M0
=
0X92;
sfr
P2M1
=
0X95;
sfr
P2M0
=
0X96;
這一段是對通用IO的設置寄存器定義為好記的變數名。具體是什麼寄存器你就得結合手冊查一下,估計是設置IO口方向、內部上來電阻之類的,或者是配置給某些內部器件如PCA計數器、定時器、計數器等。
至於下面的應該是電磁波或者超聲測距之類的演算法!!
看起來不是很復雜。
你要是抄板子的話就得想辦法知道原來用的什麼MCU!再找到它的手冊!
有興趣的話可以研究一下!
[email protected]

㈤ 單片機C程序

這是個軟體模擬時序實現SPI的函數.
SPI
有四條線
MOSI
MISO
CS
CLK,
在輸出1個位元組的時候,同時輸入1個位元組.
MOSI
mater
OUtput
,
slave
input
就是主機輸出,從機輸入.
MISO反之.
----
你可以搜下SPI介面的應用.
在這個程序中,應該是51系列單片機的程序.
MOSI
MISO
等等,,這些是個IO口.
上面應該有定義SBIT
MOSI=PX^X

㈥ 求 單片機簡單的C語言程序例子(越多越好)

我前幾天剛在網上看到的,不知道對你有沒有用》

1. 閃爍燈
1. 實驗任務
如圖4.1.1所示:在P1.0埠上接一個發光二極體L1,使L1在不停地一亮一滅,一亮一滅的時間間隔為0.2秒。
2. 電路原理圖

圖4.1.1
3. 系統板上硬體連線
把「單片機系統」區域中的P1.0埠用導線連接到「八路發光二極體指示模塊」區域中的L1埠上。
4. 程序設計內容
(1). 延時程序的設計方法
作為單片機的指令的執行的時間是很短,數量大微秒級,因此,我們要求的閃爍時間間隔為0.2秒,相對於微秒來說,相差太大,所以我們在執行某一指令時,插入延時程序,來達到我們的要求,但這樣的延時程序是如何設計呢?下面具體介紹其原理:
如圖4.1.1所示的石英晶體為12MHz,因此,1個機器周期為1微秒
機器周期 微秒
MOV R6,#20 2個機器周期 2
D1: MOV R7,#248 2個機器周期 2 2+2×248=498 20×
DJNZ R7,$ 2個機器周期 2×248 498
DJNZ R6,D1 2個機器周期 2×20=40 10002
因此,上面的延時程序時間為10.002ms。
由以上可知,當R6=10、R7=248時,延時5ms,R6=20、R7=248時,延時10ms,以此為基本的計時單位。如本實驗要求0.2秒=200ms,10ms×R5=200ms,則R5=20,延時子程序如下:
DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET
(2). 輸出控制
如圖1所示,當P1.0埠輸出高電平,即P1.0=1時,根據發光二極體的單向導電性可知,這時發光二極體L1熄滅;當P1.0埠輸出低電平,即P1.0=0時,發光二極體L1亮;我們可以使用SETB P1.0指令使P1.0埠輸出高電平,使用CLR P1.0指令使P1.0埠輸出低電平。
5. 程序框圖
如圖4.1.2所示

圖4.1.2
6. 匯編源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延時子程序,延時0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C語言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延時0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}

2. 模擬開關燈
1. 實驗任務
如圖4.2.1所示,監視開關K1(接在P3.0埠上),用發光二極體L1(接在單片機P1.0埠上)顯示開關狀態,如果開關合上,L1亮,開關打開,L1熄滅。
2. 電路原理圖

圖4.2.1
3. 系統板上硬體連線
(1). 把「單片機系統」區域中的P1.0埠用導線連接到「八路發光二極體指示模塊」區域中的L1埠上;
(2). 把「單片機系統」區域中的P3.0埠用導線連接到「四路撥動開關」區域中的K1埠上;
4. 程序設計內容
(1). 開關狀態的檢測過程
單片機對開關狀態的檢測相對於單片機來說,是從單片機的P3.0埠輸入信號,而輸入的信號只有高電平和低電平兩種,當撥開開關K1撥上去,即輸入高電平,相當開關斷開,當撥動開關K1撥下去,即輸入低電平,相當開關閉合。單片機可以採用JB BIT,REL或者是JNB BIT,REL指令來完成對開關狀態的檢測即可。
(2). 輸出控制
如圖3所示,當P1.0埠輸出高電平,即P1.0=1時,根據發光二極體的單向導電性可知,這時發光二極體L1熄滅;當P1.0埠輸出低電平,即P1.0=0時,發光二極體L1亮;我們可以使用SETB P1.0指令使P1.0埠輸出高電平,使用CLR P1.0指令使P1.0埠輸出低電平。
5. 程序框圖

圖4.2.2
6. 匯編源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND
7. C語言源程序#include <AT89X51.H>sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; //燈亮}else{L1=1; //燈滅}}}

3. 多路開關狀態指示
1. 實驗任務
如圖4.3.1所示,AT89S51單片機的P1.0-P1.3接四個發光二極體L1-L4,P1.4-P1.7接了四個開關K1-K4,編程將開關的狀態反映到發光二極體上。(開關閉合,對應的燈亮,開關斷開,對應的燈滅)。
2. 電路原理圖

圖4.3.1
3. 系統板上硬體連線
(1. 把「單片機系統」區域中的P1.0-P1.3用導線連接到「八路發光二極體指示模塊」區域中的L1-L4埠上;
(2. 把「單片機系統」區域中的P1.4-P1.7用導線連接到「四路撥動開關」區域中的K1-K4埠上;
4. 程序設計內容
(1. 開關狀態檢測
對於開關狀態檢測,相對單片機來說,是輸入關系,我們可輪流檢測每個開關狀態,根據每個開關的狀態讓相應的發光二極體指示,可以採用JB P1.X,REL或JNB P1.X,REL指令來完成;也可以一次性檢測四路開關狀態,然後讓其指示,可以採用MOV A,P1指令一次把P1埠的狀態全部讀入,然後取高4位的狀態來指示。
(2. 輸出控制
根據開關的狀態,由發光二極體L1-L4來指示,我們可以用SETB P1.X和CLR P1.X指令來完成,也可以採用MOV P1,#1111XXXXB方法一次指示。
5. 程序框圖

讀P1口數據到ACC中
ACC內容右移4次

ACC內容與F0H相或

ACC內容送入P1口
<![endif]-->
圖4.3.2
6. 方法一(匯編源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORl A,#0F0HMOV P1,ASJMP STARTEND7. 方法一(C語言源程序)#include <AT89X51.H>unsigned char temp;void main(void){while(1){temp=P1>>4;temp=temp | 0xf0;P1=temp;}}8. 方法二(匯編源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9. 方法二(C語言源程序)#include <AT89X51.H>void main(void){while(1){if(P1_4==0){P1_0=0;}else{P1_0=1;}if(P1_5==0){P1_1=0;}else{P1_1=1;}if(P1_6==0){P1_2=0;}else{P1_2=1;}if(P1_7==0){P1_3=0;}else{P1_3=1;}}}

先給你,傳不上 太多了

㈦ 單片機C語言程序

把蜂鳴器響一次的程序封裝成一個函數,然後根據燈光閃爍的情況判斷,判斷如果是第一個燈就運行一次蜂鳴器響的函數一次,如果是第二個燈就運行二次蜂鳴器響的函數,以此類推。

㈧ 求單片機c經典程序!!!

這是數字溫度計的程序,從DS18B20數字溫度感測器中讀取溫度,然後顯示在數碼管上!DS18B20數字溫度感測器採用了單匯流排通訊方式(即採用一根線完成所有信號的傳送),並且對時序要求比較高,看程序時要結合DS18B20數字溫度感測器的時序圖去看。

#include<reg52.h>
#include<intrins.h>
sbit sjx=P1^6; //ds18b20數據線介面位聲明
sbit x1=P1^0;
sbit x2=P1^1;
sbit x3=P1^2;
sbit x4=P1^3;
unsigned char wei1,wei2,wei3,zf;
unsigned int wen,zijie=0;
unsigned char wdjc[2]={0,0};
int bb=0;
unsigned char code xianshima[] //0~9的顯示碼
={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,};
void xianshi(); //顯示子程序聲明
void yanshi(unsigned int z); //延時子程序聲明
void reset(); //復位子程序聲明
void chushihua (); //初始化子程序聲明
void quwen(); //讀取溫度子程序聲明
void xie(char); //向18b20寫位元組子程序聲明
unsigned int (); //從18b20讀位元組子程序聲明
void yanshi_18B20(unsigned int); //18b20延時子程序聲明

main() //主函數
{
chushihua();
quwen();
yanshi(1000);
EA=1; //總中斷允許
ET0=1; //定時器0中斷允許
TMOD=0x01;
TH0=(65535-15535)/256;
TL0=(65535-15535)%256;
TR0=1; //定時器0啟動

// chushihua();
while(1) //使程序循環
{
// chushihua(); //調用初始化子程序
// quwen(); //調用讀取溫度子程序
xianshi(); //調用顯示子程序
}
}

void chushihua (void) //初始化子程序
{
reset(); //復位
xie(0xCC); //跳過序列號
xie(0x44); //溫度轉換命令
}

void quwen(void) //讀取溫度子程序
{
int k,i;
int wd; //存放讀取的溫度值 將其除以16即為得到的值
reset(); //復位
k++; //延時4us
xie(0xCC); //跳過序列號
k++; //延時4us
xie(0xBE); //發出讀指令
k++;k++; //延時8us
wdjc[0]=(); //讀取低位元組
wdjc[1]=(); //讀取高位元組
i=wdjc[1]; //把第二個位元組先存至低8位
i<<=8; //把第二個位元組移到高八位上去
i|=wdjc[0]; //把第一個位元組放到底八位上去
if( (wdjc[1]&0x08)) //去除的到數據的數據位,得到符號位
{
wd=0xffff-i+1; //如果為負溫則去除其補碼
zf=0; //表示溫度為負數
}
else
{
wd=i; //如果為正溫度則只直接賦予wd
zf=1; //表示溫度為正數
}

wen=wd*10/16; //獲取的溫度轉換成十進制溫度數值的10倍
}

/*
數碼管接線說明:
P2口接共陰極數碼管段選(從低位到高位依次接數碼管的a~h)
P1.0接數碼管第一位的陰極,P1.1接數碼管第二位的陰極,
P1.2接數碼管第三位的陰極,P1.3接數碼管第四位的陰極。
*/

void xianshi() //顯示子程序
{
wei1=wen/100%1000%100%10;
wei2=wen/10%10000%1000%100%10;
wei3=wen/1%100000%10000%1000%100%10;

if(zf==0){x1=0;x2=1;x3=1;x4=1;P2=0x40;} //正負號顯示
yanshi(5);

x1=1;x2=0;x3=1;x4=1;
P2=xianshima[wei1];
yanshi(5);

x1=1;x2=1;x3=0;x4=1;
P2=xianshima[wei2]+0x80; //小數點顯示+80H
yanshi(5);

x1=1;x2=1;x3=1;x4=0;
P2=xianshima[wei3];
yanshi(5);

}

void yanshi(unsigned int z) //延時子程序
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void yanshi_18B20(unsigned int ys) //18b20延時子程序
{
for(;ys>0;ys--);
}

void reset() //18b20復位子程序
{
sjx = 0;
yanshi_18B20(44);
sjx = 1;
yanshi_18B20(15);
}

unsigned int () //讀18b20子程序
{
unsigned char i;
for (i=8;i>0;i--)
{
zijie>>=1;
sjx = 0;
_nop_();_nop_();_nop_();_nop_();
sjx = 1;
if(sjx)
{
zijie|=0x80;
}
yanshi_18B20(4);
}
return(zijie);
}

void xie(char xzj) //寫18b20子程序
{
unsigned char i,j;
for (i=8; i>0; i--)
{
sjx = 0;
j++;
sjx = xzj&0x01;
yanshi_18B20(8);
sjx = 1;
j++;
xzj>>=1;
}
}

void time0() interrupt 1 //中斷服務程序
{
TH0=50000/256;
TL0=50000%256;
bb++;
if(bb==50)
{
bb=0;
chushihua();
quwen();
}
}

㈨ 單片機c語言程序

最近剛學完51單片機,對這個比較了解,這是典型的雙機通信問題,很簡單,以下是根據你提供的原理圖寫的程序,只需要把對應程序生成的hex文件,載入到單片機內,再運行即可顯示,按一下加1,顯示範圍:10-19;


發送機程序:

/*發送單片機*/
#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitkey=P3^7;
voiddelay(uintt)
{
uinti;
while(t--)
for(i=0;i<200;i++);
}
voidserial_initial()
{
TMOD=0x20;
TH1=0xfa;//bps9600
TL1=0xfa;
TR1=1;
SCON=0x50;//SM0=0;SM1=1;REN=1
PCON=0x80;
}
voidmain()
{
ucharnum;
serial_initial();
num=10;//設置初始值為10,可根據需要修改
while(1)
{
if(key==0)
{
SBUF=num;
if(TI==1)
TI=0;
delay(100);
num++;
if(num==19)//設置結束值為19,可根據需要修改
num=10;
}
}
}

接收機程序:

#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodedis_code[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
ucharnum=0,n1=0,n2=0;
voiddelay(uintt)
{
uinti;
while(t--)
for(i=0;i<200;i++);
}
voidserial_initial()
{
TMOD=0x20;
TH1=0xfa;//bps9600
TL1=0xfa;
TR1=1;
SCON=0x50;//SM0=0;SM1=1;REN=1
PCON=0x80;
EA=1;//打開串口中斷
ES=1;
}
voiddisplay_num()//顯示接收的數字
{
n1=num%10;
n2=num/10;
P2=dis_code[n1];
delay(10);
P0=dis_code[n2];
delay(10);
}
voidmain()
{
serial_initial();
while(1)
{
display_num();
}
}
voidserial()interrupt4
{
if(RI==1)
{
RI=0;
num=SBUF;
}
}

原理圖:

㈩ 簡單的51單片機鍵盤C程序

A|=B;
等價於
A=A|B;
是先進行或運算,再把運算結果賦給A,之後的A已經不是原來的A了。
第一個鍵值判斷後,你就鍵值變數已經被賦予新的值了。
如果正好按的是第一個鍵則能返回1,
如果不是第一個鍵按下,但經過
if((keyvalue|=0xfb)!=0xff)這一判斷,其中的「keyvalue|=0xfb」就把keyvalue變成0xff了,後面的判斷條件自然不會滿足。
把這里的一些等於號再去掉試試看。
另外,建議你對於按鍵掃描程序使用switch
case
語句,這樣條理更清晰。
/*按鍵獲取程序*/
unsigned
int
Key()
{
uchar
keyvalue;
keyvalue=P3;
keyvalue|=0xc3;
if((keyvalue|0xc3)==0xff)
{
Delay(10);
if((keyvalue|0xc3)==0xff)
{
return(0);
}
}
else
{
Delay(10);
if((keyvalue|0xc3)!=0xff)
{
if((keyvalue|0xfb)!=0xff)
{
return(1);}
if((keyvalue|0xf7)!=0xff)
{
return(2);}
if((keyvalue|0xef)!=0xff)
{
return(3);}
if((keyvalue|0xdf)!=0xff)
{
return(4);}
}
}
}

閱讀全文

與單片機經典c程序相關的資料

熱點內容
蘋果騰訊管家如何恢復加密相冊 瀏覽:113
手機軟體反編譯教程 瀏覽:858
sqlserver編程語言 瀏覽:650
gpa國際標准演算法 瀏覽:238
伺服器編程語言排行 瀏覽:947
怎麼下載快跑app 瀏覽:966
小紅書app如何保存視頻 瀏覽:170
如何解開系統加密文件 瀏覽:809
linux切換root命令 瀏覽:283
c編譯之後界面一閃而過怎麼辦 瀏覽:880
怎麼看ic卡是否加密 瀏覽:725
lgplc編程講座 瀏覽:809
cnc手動編程銑圓 瀏覽:723
cad中幾種命令的意思 瀏覽:327
oraclelinux安裝目錄 瀏覽:134
安卓系統可以安裝編譯器嗎 瀏覽:571
javajson實體類 瀏覽:691
板加密鋼筋是否取代原鋼筋 瀏覽:67
學習編程的思路 瀏覽:231
app易語言post怎麼學 瀏覽:966