|
初接觸單片機(jī),老師給的單片機(jī)實(shí)驗(yàn),可以練練手。
調(diào)整一下實(shí)驗(yàn)內(nèi)容,具體情況如下:
第一次流水燈實(shí)驗(yàn)不變,采用第一次試驗(yàn)課內(nèi)容。
其余三次實(shí)驗(yàn)現(xiàn)分別確定為中斷實(shí)驗(yàn)、定時(shí)器實(shí)驗(yàn)和串行通信實(shí)驗(yàn),這三次實(shí)驗(yàn)推薦分別采用如下三個(gè)(列出的電路圖和源代碼老師都自己全程測試過,沒有問題);如果想在“中斷實(shí)驗(yàn)、定時(shí)器實(shí)驗(yàn)和串行通信實(shí)驗(yàn)”框架下選擇其他具體實(shí)驗(yàn)內(nèi)容也可以,注意把題目要求等都寫清楚。
二、中斷實(shí)驗(yàn)
中斷掃描法行列式鍵盤
1)實(shí)驗(yàn)要求
利用中斷掃描法實(shí)現(xiàn)4*4行列式鍵盤,并利用1位共陰極數(shù)碼管進(jìn)行顯示。要求開機(jī)后數(shù)碼管暫時(shí)為黑屏狀態(tài),按下任意鍵后,顯示該鍵的鍵值字符(0—F)。若沒有新鍵按下,則維持前次按鍵結(jié)果。
2)參考電路圖
3)參考源程序
#include <reg51.h>
char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71}; //led字模
char key_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //鍵值
void getKey() interrupt 0 //中斷函數(shù)
{
char key_scan[]={0xef,0xdf,0xbf,0x7f}; //鍵掃描碼
char i=0,j=0;
for(i=0;i<4;i++)
{
P2=key_scan[ i]; //輸出掃描碼
for(j=0;j<16;j++)
{
if(key_buf[j] == P2) //讀鍵值,判斷鍵號(hào)
{
P0=led_mod[j]; //顯示閉合鍵鍵號(hào)
break;
}
}
}
P2=0x0f;
}
void main(void)
{
P0=0x00; //開機(jī)黑屏
IT0=1; //脈沖觸發(fā)
EX0=1; //INT0允許
EA=1; //總中斷允許
P2=0x0f; //為首次中斷做準(zhǔn)備,列線全為0,行線全為1
while(1); //模擬其它程序功能
}
三、定時(shí)器實(shí)驗(yàn)
對流水燈進(jìn)行定時(shí)中斷控制
1)實(shí)驗(yàn)要求
采用定時(shí)中斷方法實(shí)現(xiàn)流水燈的控制功能。要求流水燈的閃爍速率約為每秒一次。
2)參考電路圖
3)參考源程序
#include <reg51.h>
#define uchar unsigned char
bit ldelay=0;
uchar t=0;
void main()
{
uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar ledi;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
while(1){
if(ldelay) {
ldelay=0;
P2=ledp[ledi];
ledi++;
if(ledi==8) ledi=0;
}
}
}
timer0() interrupt 1{
t++;
if(t==20) {t=0;ldelay=1;}
TH0=0x3c;TL0=0xb0;
}
四、串行口通信實(shí)驗(yàn)
2只單片機(jī)的串口方式1通信
1)實(shí)驗(yàn)要求
兩只51單片機(jī)進(jìn)行串口方式1通信,其中兩機(jī)fosc約為12MHz,波特率約為2.4kbps。甲機(jī)循環(huán)發(fā)送數(shù)字0-F,并根據(jù)乙機(jī)的返回值決定發(fā)送新數(shù)(返回值與發(fā)送值相同時(shí))或重復(fù)當(dāng)前數(shù)(返回值與發(fā)送值不同時(shí));乙機(jī)接收數(shù)據(jù)后直接返回接收值;雙機(jī)都將當(dāng)前值以十進(jìn)制形式顯示在各機(jī)的共陰極數(shù)碼管上。
2)參考電路圖
3)參考源程序
發(fā)送程序:
#include <reg51.h>
#define uchar unsigned char
char code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay(unsigned int time)
{
unsigned int j=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void main(void)
{
uchar counter=0;
TMOD=0x20;
TH1=TL1=0xf4;
PCON=0;
SCON=0x50;
TR1=1;
while(1)
{
SBUF=counter;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
if(SBUF==counter)
{
P2=map[counter];
if(++counter>9) counter=0;
delay(500);
}
}
}
接收程序:
#include <reg51.h>
#define uchar unsigned char
char code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay(unsigned int time)
{
unsigned int j=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void main(void)
{
uchar counter=0;
TMOD=0x20;
TH1=TL1=0xf4;
PCON=0;
SCON=0x50;
TR1=1;
while(1)
{
SBUF=counter;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
if(SBUF==counter)
{
P2=map[counter];
if(++counter>9) counter=0;
delay(1000);
}
}
}
完整的Word格式文檔51黑下載地址:
單片機(jī)后三次實(shí)驗(yàn)調(diào)整情況說明(附經(jīng)過測試的參考電路圖與源代碼).doc
(112 KB, 下載次數(shù): 13)
2017-12-27 17:26 上傳
點(diǎn)擊文件名下載附件
單片機(jī)實(shí)驗(yàn)
|
評分
-
查看全部評分
|