① 51單片機c語言學習哪本書講的比較詳細,適合入門的看呢
你可以看看《愛上單片機》(杜洋著),超簡單的哦。
如果你不想買書,你可以下載《單片機編程魔法學校》,或者硬體的《單片機入門製作專輯》(其實就是從書裡面截取的片段)
還可以購買視頻,你到www.doyoung.net看看
其實沒必要買一塊開發板,也不必要自己做一塊
完全可以用麵包板搭建,無需焊接,拆裝方便,而且真正能理解硬體電路,讓自己動手實踐,例如第一次試驗只需要用三個元器件單片機(推薦用STC12C5A60S52,也是51內核的,完全通用,但是功能豐富,千萬不要用AT89S51,以後你就會知道,比如說以後用到ADC數模轉換,PWM輸出,STC就都集成好了,而AT就需要一個個用晶元外擴)LED燈、電池盒三個元件,而不需要面對連電路都不熟悉的開發板。詳見視頻「用麵包板入門單片機」:
http://www.doyoung.net/video/BREAD_1/index.html
學習C語言可以配合著《單片機入門製作專輯》(網頁最後可以下載光碟及文章):
http://www.doyoung.net/articles/0711_MCU_entry_album/index.html
《單片機編程魔法學校》(最後也有下載):
http://www.doyoung.net/articles/0711_MCU_entry_album/index.html
推薦書籍:《愛上單片機》
② 求郭天祥《新概念51單片機C語言教程》電子版及對應視頻,296447751感激不盡!主要視頻啊!
http://yunpan.cn/QEetuIS7PqqWi 書本地址,視屏上次硬碟空間不夠用,剛刪,其實看書是最好的,還可以反復查閱,具體的還可以自己去琢磨,因為有琢磨的過程記得更牢。pdf版的,要看的部分,可以列印出來看,其他的列印出來太浪費了。電驢原來有視頻的,可惜資料最近被封了
③ 大家幫忙找一些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--);
}
④ 自學單片機reg51.h定時程序是裡面的TH1、TL1、TR1、TMOD是什麼意思沒有在程序上看到定義這樣的變數。
TH1,TL1、TR1、TMOD是單片機的特殊寄存器 ,是用來控制計數/中斷器的.TMOD(工作方式控制寄存器);TH1/TL1是定時器/計數器1;
TR1=1是啟動定時器1。