初接觸單片機,老師給的單片機實驗,可以練練手。
調整一下實驗內容,具體情況如下:
第一次流水燈實驗不變,采用第一次試驗課內容。
其余三次實驗現分別確定為中斷實驗、定時器實驗和串行通信實驗,這三次實驗推薦分別采用如下三個(列出的電路圖和源代碼老師都自己全程測試過,沒有問題);如果想在“中斷實驗、定時器實驗和串行通信實驗”框架下選擇其他具體實驗內容也可以,注意把題目要求等都寫清楚。
二、中斷實驗
中斷掃描法行列式鍵盤
1)實驗要求
利用中斷掃描法實現4*4行列式鍵盤,并利用1位共陰極數碼管進行顯示。要求開機后數碼管暫時為黑屏狀態,按下任意鍵后,顯示該鍵的鍵值字符(0—F)。若沒有新鍵按下,則維持前次按鍵結果。
2)參考電路圖
0.png (216.44 KB, 下載次數: 29)
下載附件
2017-12-27 19:09 上傳
0.jpg (18.13 KB, 下載次數: 33)
下載附件
2017-12-27 19:09 上傳
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 //中斷函數
{
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) //讀鍵值,判斷鍵號
{
P0=led_mod[j]; //顯示閉合鍵鍵號
break;
}
}
}
P2=0x0f;
}
void main(void)
{
P0=0x00; //開機黑屏
IT0=1; //脈沖觸發
EX0=1; //INT0允許
EA=1; //總中斷允許
P2=0x0f; //為首次中斷做準備,列線全為0,行線全為1
while(1); //模擬其它程序功能
}
三、定時器實驗
對流水燈進行定時中斷控制
1)實驗要求
采用定時中斷方法實現流水燈的控制功能。要求流水燈的閃爍速率約為每秒一次。
2)參考電路圖
0.jpg (72.13 KB, 下載次數: 36)
下載附件
2017-12-27 19:10 上傳
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;
}
四、串行口通信實驗
2只單片機的串口方式1通信
1)實驗要求
兩只51單片機進行串口方式1通信,其中兩機fosc約為12MHz,波特率約為2.4kbps。甲機循環發送數字0-F,并根據乙機的返回值決定發送新數(返回值與發送值相同時)或重復當前數(返回值與發送值不同時);乙機接收數據后直接返回接收值;雙機都將當前值以十進制形式顯示在各機的共陰極數碼管上。
2)參考電路圖
0.jpg (63.35 KB, 下載次數: 36)
下載附件
2017-12-27 19:10 上傳
3)參考源程序
發送程序:
#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黑下載地址:
單片機后三次實驗調整情況說明(附經過測試的參考電路圖與源代碼).doc
(112 KB, 下載次數: 13)
2017-12-27 17:26 上傳
點擊文件名下載附件
單片機實驗 下載積分: 黑幣 -5
|