導航:首頁 > 操作系統 > 51單片機c語言指令表

51單片機c語言指令表

發布時間:2024-08-22 19:27:22

❶ 用c語言循環語句怎麼寫一個51單片機的時鍾啊,用8個數碼管顯示時間。

#include<reg51.h>

#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,min=0,hour=12,scanled;
unsigned char key,flashbit,mode,time;
unsigned char disdat[8];
sbit led=P1^0;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=10;

disdat[3]=min%10;
disdat[4]=min/10;
disdat[5]=10;

disdat[6]=hour%10;
disdat[7]=hour/10;
}
void flash()
{
switch(flashbit)
{
case 0:break;
case 1:
disdat[6]=0x10;
disdat[7]=0x10;
delay(50);
dischg();
delay(80);
break;
case 2:
disdat[3]=0x10;
disdat[4]=0x10;
delay(50);
dischg();
delay(80);
break;
case 3:
disdat[0]=0x10;
disdat[1]=0x10;
delay(50);
dischg();
delay(80);
break;
default:break;
}
}
void t0isr() interrupt 1//秒計時
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=59;min--;}
else if(hour>0){sec=59;min=59;hour--;}
else {hour=0;min=0;sec=0;}
}
break;
}
dischg();
}
void t1isr() interrupt 3//顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P2=0x01;
P0=~ledtab[disdat[7]];
break;
case 1:
P2=0x02;
P0=~ledtab[disdat[6]];
break;
case 2:
P2=0x04;
P0=~ledtab[disdat[5]];
break;
case 3:
P2=0x08;
P0=~ledtab[disdat[4]];
break;
case 4:
P2=0x10;
P0=~ledtab[disdat[3]];
break;
case 5:
P2=0x20;
P0=~ledtab[disdat[2]];
break;
case 6:
P2=0x40;
P0=~ledtab[disdat[1]];
break;
case 7:
P2=0x80;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=8;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
sec=55;
min=59;
hour=23;
flashbit=0;
scanled=0;
time=0;
mode=0;
dischg();
while(1)
{
flash();//閃爍
if((P3&0x0f)!=0x0f){
key=P3&0x0f;
while((P3&0x0f)!=0x0f);
led=0;
delay(10);
key|=0xf0;
switch(~key)
{
case 0x01://p3.1選擇調時、分、秒
TR0=0;
flashbit+=1;
if(flashbit>3){flashbit=0;TR0=1;}
break;
case 0x02://p3.2調數
if(flashbit==0)break;
if(flashbit==1)
{
hour++;
if(hour>99)hour=0;
}
if(flashbit==2)
{
min++;
if(min>59)min=0;
}
if(flashbit==3)
{
sec++;
if(sec>59)sec=0;
}
break;
case 0x04: //選擇正/倒
TR0=0;
mode++;
mode&=0x01;
if(mode==0){sec=0;min=0;hour=0;}
dischg();
break;
case 0x08://啟動/暫停
TR0=~TR0;
break;
default:break;
}
}
}
}

❷ 51單片機c語言 _nop_()是一個空指令短時間延時的空幾個機器周期

這個_nop_()等效與匯編裡面的,NOP指令,也就是空一個機器周期,如果是傳統51單片機的話,等於空12個時鍾周期【即一個機器周期】,操作方法如下:

1、首先,可以利用keil來進行模擬實驗,觀察軟體所顯示的數值,然後再進行相關的運算,即可得出結果。

❸ 51單片機C語言編程

// 51單片機C語言編程,這個時鍾+秒錶可以參考一下。

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit qingling=P1^0; //清零

sbit tiaofen=P1^1; //調分

sbit tiaoshi=P1^2; //調時

sbit sounder=P1^7; //naozhong

uint a,b;

uchar hour,minu,sec, //時鍾

hour0,minu0,sec0,//秒錶

hour1,minu1,sec1;

h1,h2,m1,m2,s1,s2,//顯示位

k,s;//狀態轉換標志

uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*****************函數聲明***********************/

void keyscan();

void init();

void delay(uchar z);

void display(uchar,uchar,uchar);

void sounde();

/*****************主函數*************************/

void main()

{

init();

while(1)

{

while(TR1)

{

keyscan(); //掃描函數

while(s==1) //s是狀態標志,當s=0時,鬧鍾取消。s=1時,設定鬧鍾時間(也是通過調時,調分函數);

{ //s=2時,鬧鍾工作,時間與設定時刻一致時,鬧鍾響(一分鍾後自動關閉,可手動關閉)。再次切換,s=0.

keyscan(); //s狀態切換(0-》1-》2-》0)通過外部中斷1實現。

display(hour1,minu1,sec1); //鬧鍾時刻顯示

}

display(hour0,minu0,sec0);//時鍾表顯示

while(k) /*k是秒錶狀態(0-》1-》2-》0)通過外部中斷0實現。0秒錶關;1秒錶從零計時;2秒錶停,顯示計時時間*/

{

display(hour,minu,sec); //秒錶顯示

}

}

}

}

/*****************初始化函數***********************/

void init()

{

a=0;

b=0;

k=0;

s=0;

hour0=0;

minu0=0;

sec0=0;

hour=0;

minu=0;

sec=0;

hour1=0;

minu1=0;

sec1=0;

TMOD=0x11; //定時器0,1工作於方式1;賦初值

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

EX0=1; //秒錶中斷

EX1=1; //鬧鍾設定中斷

ET0=1;

ET1=1;

IT0=1; //邊沿觸發方式

IT1=1;

PX0=1;

PX1=1;

TR0=0; //初始,秒錶不工作

TR1=1; //時鍾一開始工作

}

/*****************定時器0中斷*************/

void timer0_int() interrupt 1 //秒錶

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

a++;

if(a==2)

{

a=0;

sec++;

if(sec==100)

{

sec=0; //毫秒級

minu++;

if(minu==60)

{

minu=0; //秒

hour++;

if(hour==60) //分

{

hour=0;

}

}

}

}

}

/*************外部中斷0中斷函數************/

void ex0_int() interrupt 0

{

k++;

if(k==3)

k=0;

if(k==1)

{

TR0=~TR0;

if(TR0==1)

{

hour=0;

minu=0;

sec=0;

}

}

if(k==2)

{

TR0=~TR0;

}

}

/*************外部中斷1中斷函數************/

void ex1_int() interrupt 2

{

s++;

if(s==3)

s=0;

}

/*************定時器1中斷****************/

void timer1_int() interrupt 3 //控制時鍾工作

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(s==2)

{

if(hour1==hour0 && minu0==minu1)

sounde();

}

b++;

if(b==20)

{

b=0;

sec0++;

if(sec0==60)

{

sec0=0;

minu0++;

if(minu0==60)

{

minu0=0;

hour0++;

if(hour0==24)

hour0=0;

}

}

}

}

/*************鍵盤掃描****************/

void keyscan()

{

if(s==1)

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec1=0;

minu1=0;

hour1=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu1++;

if(minu1==60)

{

minu1=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour1++;

if(hour1==24)

{

hour1=0;

}

while(!tiaoshi);

}

}

else //調整時鍾時間

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec0=0;

minu0=0;

hour0=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu0++;

if(minu0==60)

{

minu0=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour0++;

if(hour0==24)

{

hour0=0;

}

while(!tiaoshi);

}

}

}

/*************顯示函數****************/

void display(uchar hour,uchar minu,uchar sec)

{

h1=hour/10;

h2=hour%10;

m1=minu/10;

m2=minu%10;

s1=sec/10;

s2=sec%10;

P0=0xff;

P2=table[h1];

P0=select[7];

delay(5);

P0=0xff;

P2=table[h2];

P0=select[6];

delay(5);

P0=0xff;

P2=0x40;;

P0=select[5];

delay(5);

P0=0xff;

P2=table[m1];

P0=select[4];

delay(5);

P0=0xff;

P2=table[m2];

P0=select[3];

delay(5);

P0=0xff;

P2=0x40;

P0=select[2];

delay(5);

P0=0xff;

P2=table[s1];

P0=select[1];

delay(5);

P0=0xff;

P2=table[s2];

P0=select[0];

delay(5);

}

/*************鬧鍾函數****************/

void sounde()

{

sounder=~sounder;

}

/*************延時函數****************/

void delay(uchar z)

{

int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

❹ 51單片機C語言程序注釋標注(寫全)

#include<reg51.h>//調用頭文件reg51.h
voidmain()//主函數
{
unsignedchar//無符號字元型
tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//定義一個數組LED數碼管解碼用的碼表
while(1)//主循環
{
P2=P2|0x07;//P2口與0x07按位進行或運算
while(P2&0x07==0x07);//如果P2扣低三位為111則原地等待
switch(P2&0x07)//獲取P2低三位值並且據此執行響應的操作
{
0x06:P0=tab[0x0D];break;//P2低三位為06H,數碼管顯示「d」
0x05:P0=tab[0x0E];break;//P2低三位為05H,數碼管顯示「E」
0x03:P0=tab[0x0F];break;//P2低三位為03H,數碼管顯示「F」
}
}
}

❺ 51單片機c語言程序

答:樓主先搞清C51中定義數據的類型。
char型 8位(-127到128);int型16位-32727到+32728(兩個位元組)
unsigned char是8位但從0到255,unsignde int 16位從0到65535;
樓主程序中的TH0/TL0是8位uchar型;tmp是16位uint型。

tmp=TL0|(TH0<<8);
這句在執行時先進行類型轉換,把TL0/TH0暫時轉換成16位uint型數據,(高位補0),再給TH0左移8位,和TL0相「或」,得到的是16位uint數據,賦給tmp.

❻ 大家幫忙找一些51單片機的基本C語言程序例子,最好帶說明,謝啦

中斷控製程序:

#include <AT89X52.H>

#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED介面
//將計數器的二進制值用8個LED顯示出來
uchar count;//計數器(存儲中斷次數)

void main(void)
{
count=0; //清零計數器
port_count=~count;//清零P2口
IT0=1; //INT0設為邊沿觸發方式�IT0=0則為電平觸發方式
EX0=1; //開INT0中斷
EA=1; //開系統中斷
while(1); //等待中斷處理

}

//INT0中斷處理函數
void int0_interrupt() interrupt 0 //INT0中斷號0
{
count++;
port_count=~count; //當達到255時,溢出,又從0開始

}

I/O控製程序:
#include <AT89X52.H>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a>0;a--)
for(b=225;b>0;b--);
}
void main()
{
uchar flag=0;//判斷移動方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水燈左移到第八位又移回來 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水燈右移到第1位又移回來 ~0000 0001
}
if(flag==0)
{
port_state=port_state<<1;
flowlight=~port_state;
}
else
{
port_state=port_state>>1;
flowlight=~port_state;
}
}

串口通信程序:
主機程序:
#include <AT89X52.H>
#define NODE_ADDR 3 //目的節點地址
#define COUNT 10 //發送緩沖區buffer大小
typedef unsigned char uchar;
uchar buffer[COUNT]; //定義buffer
int pt; //設置指針
main()//////////////////////////////////////////發送程序
{

//buffer初始化
pt=0;
while(pt<COUNT)
{
buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33........
pt++;
}
////初始化串口和T1(波特率發生器)/////////PCON預設為0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;

///////////////發送地址幀
TB8=1; //地址幀標志
SBUF=NODE_ADDR; //發送目的節點地址
while(pt<COUNT); //等待發送完全部數據
while(1);//不執行任何操作
} //end main

/////發送完中斷函數
void send()interrupt 4
{
TI=0; //清發送中斷標志
if(pt<COUNT)
{
//發送一幀數據
TB8=0;//數據幀標志
SBUF=buffer[pt]; //啟動發送
pt++;//指針指向下一單元
}

else
{
ES=0; //關串口中斷
EA=0; //關系統中斷
return; //若發送完則停止發送並返回
}

}
接收程序:
#include<reg52.h>
#define uchar unsigned char

#define NODE_ADDR 3 //本機節點地址
#define COUNT 10 //定義接收緩沖區buffer大小
uchar buffer[COUNT]; //定義buffer
int pt; //當前位置指針

void send_char_com(unsigned char ch); //向串口發送一個字元的函數聲明
void delay(void);

main() ////////////////串列非同步從機接收程序
{
PCON=0X00; //初始化串口和T1(波特率發生器)/////////PCON預設為0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允許接收地址幀
TMOD=0X20; //20H=0010 0000B,置T1為方式2,TR1控制T1的開關,定時器方式
TH1=253;TL1=253; //方式2為自動重裝///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //啟動T1
ET1=0; //關T1中斷 由於自動重裝
ES=1; //開串口中斷
EA=1; //開系統中斷
pt=0;
while(pt<COUNT); //等待接收地址幀和全部數據幀
delay() ;
//接收完後返回數據
SCON=0XC0; //SCON=1100 0000B,置串口為方式3, SM2=0,REN=0,主機不接收地址幀
EA=0;
for(pt=0;pt<COUNT;pt++)
{
send_char_com(buffer[pt]);

}
while(1);
} //end main

///////////串口接收中斷函數
void receive()interrupt 4 using 3
{
RI=0; //清除接收中斷標志
if(RB8==1) //地址幀
{//若為本機地址,則置SM2=0,以便接收數據
if(SBUF==NODE_ADDR)
{
SM2=0;
}

}
/////RB8=0,數據幀
else if(RB8==0)
{buffer[pt]=SBUF; //數據幀送buffer
pt++;
if(pt>=COUNT)
SM2=1; //若接收完全部數據幀,則通信結束;置SM2=1,准備下一次通信
}

}

//向串口發送一個字元
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}

///////////////////////////////////////////////////////////////////////////////////

void delay(void)
{uchar i=100;
while(i--);
}

❼ 求一個51單片機用T0做計數器的C語言代碼。

//timer0設定為計數器模式1
TMOD &= 0xf0; //清除原來的設定
TMOD |= 0x05; //T0為計數器模式1
TH0 = 0;
TL0 = 0; //從0開始計數
TR0 = 1; //使能T/C0
// IE |= 0x82; //Timer0中斷使能,不需要就注釋掉該行
另外執行不了有可能是你的實驗板沒有連接T0引腳

閱讀全文

與51單片機c語言指令表相關的資料

熱點內容
單片機反匯編修改文字 瀏覽:864
網站部署python 瀏覽:998
kettlelinux教程 瀏覽:677
地理科學pdf 瀏覽:147
單片機數據讀取 瀏覽:392
法語教程pdf 瀏覽:996
面試伺服器出現502怎麼定位 瀏覽:803
java讀取http 瀏覽:487
列寧全集pdf下載 瀏覽:334
你好法語pdf 瀏覽:408
安卓怎麼樣讓手機失去色彩 瀏覽:651
oracle11gr2linux 瀏覽:141
茶葉pdf 瀏覽:23
pdf圖怎麼列印 瀏覽:142
app圖標有個e是什麼app 瀏覽:266
linux運行python程序 瀏覽:238
如何打開已編譯文件 瀏覽:215
選購雲伺服器如何注冊 瀏覽:460
阿貓一個人拍解壓視頻 瀏覽:200
爆閃單片機 瀏覽:717