|
設(shè)計(jì)基于STC15F2K60S2單片機(jī)的串行通信,通過四行三列矩陣鍵盤作為輸入設(shè)備,實(shí)時(shí)掃描按鍵按下情況,經(jīng)鍵盤掃描程序進(jìn)行處理,輸出相應(yīng)的鍵值并送入串行口1數(shù)據(jù)發(fā)送緩沖器,等待一幀數(shù)據(jù)發(fā)送完成。運(yùn)用串行口1中斷,讀取串口1接收數(shù)據(jù)緩沖器內(nèi)的數(shù)據(jù),經(jīng)過接收數(shù)據(jù)處理程序的處理,將不同數(shù)據(jù)接收的次數(shù)轉(zhuǎn)換為BCD碼,并和本次接收的數(shù)據(jù)一同送數(shù)碼管顯示,達(dá)到雙機(jī)通信并顯示的目的。系統(tǒng)硬件包括單片機(jī)串行通信模塊、矩陣式按鍵模塊、數(shù)碼管顯示模塊等三部分。
制作出來的實(shí)物圖如下:
電路原理圖如下:
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define led_data P0
- #define led_bit P1
- #define KEY P2
- uchar k = 10;
- uchar m = 10;
- uchar n = 10;
- uchar r_data = 10;
- uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共陰極字形碼{0,1,2,3,4,5,6,7,8,9,不顯示}
- uchar code key_code[] = {0x57,0x6e,0x5e,0x3e,0x6d,0x5d,0x3d,0x6b,0x5b,0x3b}; //鍵碼{[4,2];[1,1];[1,2],[1,3];[2,1];[2,2];[2,3];[3,1];[3,2];[3,3]}
- uchar code scan_con[4] = {0x0E,0x0D,0x0B,0x07}; //位掃描字{1,2,3,4}
- /*-----------------------------------------------1ms延時(shí)子函數(shù)-----------------------------------------------------*/
- void delay1ms(int t)
- {
- int i,j;
- for (i = 0;i < t;i++)
- for (j = 0;j < 120;j++);
- }
- /*---------------------------------------------鍵盤掃描發(fā)送子函數(shù)--------------------------------------------------*/
- uchar keyscan()
- {
- uchar X,Y,Z;
- uchar k;
- KEY = 0x7f;
- KEY = 0x0f; //列掃描輸出全 “0”
- if(KEY != 0x0f) //判斷是否有鍵按下
- {
- delay1ms(130); //軟件延時(shí)去干擾
- if(KEY != 0x0f) //確認(rèn)按鍵按下
- {
- X = KEY; //保存列掃描時(shí)有鍵按下的狀態(tài)(列掃描鍵碼)
- KEY = 0x70; //行掃描輸出全 “0”
- Y = KEY; //保存行掃描時(shí)有鍵按下的狀態(tài)(行掃描鍵碼)
- Z = X | Y; //鍵碼=列掃描鍵碼+行掃描鍵碼(按位相與)
- for(k = 0;k <= 9;k++)
- {
- if(Z == key_code[k]) //查表得鍵值
- {
- SBUF = k; //將鍵值送入發(fā)送緩沖器
- while(TI == 0); //等待發(fā)送過程結(jié)束
- TI = 0; //發(fā)送中斷標(biāo)志位清零
- }
- }
- }
- }
- else KEY = 0x7f; //恢復(fù)掃描線為輸入狀態(tài)
- return(10);
- }
- /*--------------------------------------------串行口1中斷接收函數(shù)--------------------------------------------------*/
- void Serial_ISR(void) interrupt 4
- {
- uint a,b,c,d,e,f,g,h,i,j,num; //定義0-9各數(shù)字接收次數(shù)變量和BCD運(yùn)算變量
- if(RI == 1) //判斷是否為接收中斷
- {
- r_data = SBUF; //保存接收到的數(shù)據(jù)
- RI = 0; //接收中斷標(biāo)志位清零
- switch(r_data) //分析所接收到的數(shù)據(jù)
- {
- case 0x00:++a;num = a;break;
- case 0x01:++b;num = b;break;
- case 0x02:++c;num = c;break;
- case 0x03:++d;num = d;break;
- case 0x04:++e;num = e;break;
- case 0x05:++f;num = f;break;
- case 0x06:++g;num = g;break;
- case 0x07:++h;num = h;break;
- case 0x08:++i;num = i;break;
- case 0x09:++j;num = j;break;
- default:num = num;
- }
- if(num <= 9) //一位十進(jìn)制數(shù)的BCD碼
- {
- k = 10;
- m = 10;
- n = num;
- }
- else if(num <= 99) //兩位十進(jìn)制數(shù)的BCD碼
- {
- k = 10;
- m = num / 10;
- n = num % 10;
- }
- else //三位十進(jìn)制數(shù)的BCD碼
- {
- k = num / 100;
- m = (num - k * 100) / 10;
- n = num % 10;
- }
- }
- }
- /*----------------------------------------------數(shù)碼管顯示子函數(shù)---------------------------------------------------*/
- display()
- {
- led_bit = scan_con[0]; //送位選碼
- led_data = table[r_data]; //送段碼
- delay1ms(1);
- led_bit = scan_con[1];
- led_data = table[k];
- delay1ms(1);
- led_bit = scan_con[2];
- led_data = table[m];
- delay1ms(1);
- led_bit = scan_con[3];
- led_data = table[n];
- delay1ms(1);
- return(0);
- }
- /*---------------------------------------------------主函數(shù)--------------------------------------------------------*/
- void main(void)
- {
- TMOD = 0x20; //實(shí)用定時(shí)器T1方式2(8位自動(dòng)重裝初值)
- TH1 = 0xf4; //244
- TL1 = 0xf4; //波特率為2400
- TR1 = 1; //啟動(dòng)定時(shí)器T1
- SCON = 0x40; //設(shè)定串行口1為方式1
- REN = 1; //允許串行口1接受數(shù)據(jù)
- ES = 1; //開放串行口1中斷
- EA = 1; //開放總中斷
- while(1)
- {
- keyscan(); //執(zhí)行鍵盤掃描程序
- display(); //執(zhí)行數(shù)碼管顯示程序
- }
- }
復(fù)制代碼
原理圖和以上程序下載:
原理圖及程序.7z
(26.63 KB, 下載次數(shù): 4)
2024-10-15 02:18 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|