標(biāo)題: 單片機(jī)減一秒表計(jì)數(shù)設(shè)計(jì),包含硬件電路相關(guān)介紹以及各部分原理說明... [打印本頁(yè)]
作者: zzzccc. 時(shí)間: 2020-3-12 21:56
標(biāo)題: 單片機(jī)減一秒表計(jì)數(shù)設(shè)計(jì),包含硬件電路相關(guān)介紹以及各部分原理說明...
這是我做的單片機(jī)減一秒表計(jì)數(shù)設(shè)計(jì),包含硬件電路相關(guān)介紹以及各部分原理說明。
最后附上軟件部分的程序設(shè)計(jì)流程圖以及相關(guān)的程序編寫內(nèi)容。
大家有需要的可以下載參考。
減1秒表設(shè)計(jì)(兩位的LED數(shù)碼減1數(shù)碼顯示,采用定時(shí)/計(jì)數(shù)器實(shí)現(xiàn)定時(shí)控制,能實(shí)現(xiàn)開始計(jì)數(shù)、停止計(jì)數(shù)和清零控制等功能)。
數(shù)值從99減到0,能啟動(dòng)開始計(jì)數(shù)、暫停、復(fù)位到99重新計(jì)數(shù),對(duì)于實(shí)驗(yàn)室單片機(jī)硬件設(shè)備可用8255擴(kuò)展的8位七段LED顯示器選其兩位進(jìn)行顯示,3種功能可用矩陣鍵盤來(lái)控制實(shí)現(xiàn),1秒倒計(jì)時(shí)可用定時(shí)器T0選擇模式2實(shí)現(xiàn)。
硬件設(shè)計(jì)(包括設(shè)計(jì)方案及說明、完整的硬件連接圖等)
設(shè)計(jì)方案:2位七段LED顯示器顯示,定時(shí)器選用T0,選擇模式2,采用內(nèi)部中斷,矩陣鍵盤控制不同情況。(停止計(jì)數(shù)可用使定時(shí)器停止工作和使LED顯示當(dāng)前數(shù)2種方法實(shí)現(xiàn),這里選用使LED顯示當(dāng)前數(shù)暫停)
說明:選其1,2位七段LED顯示器分別作為十位和個(gè)位,讀其矩陣鍵盤鍵值進(jìn)行判斷再改變工作狀態(tài):
硬件連接:8255擴(kuò)展七段LED顯示器及矩陣鍵盤即可。
LED顯示原理:
①實(shí)驗(yàn)箱上8155擴(kuò)展的有8位七段LED顯示器,采用動(dòng)態(tài)方式驅(qū)動(dòng)。即一位LED顯示器顯示一小段時(shí)間,然后是下一位LED顯示器顯示一段小時(shí)間。只要刷新頻率不小于50Hz,利用人眼的視覺誤差,就可以獲得清晰穩(wěn)定的顯示效果。
②LED顯示器的各段由8155的B口驅(qū)動(dòng),各段的驅(qū)動(dòng)位如表;段引腳為低電平則對(duì)應(yīng)段發(fā)光,高電平則對(duì)應(yīng)段熄滅,顯示字的字形代碼如表;8個(gè)LED的選擇位由8255的A口驅(qū)動(dòng),高電平則選中對(duì)應(yīng)位,低電平則對(duì)應(yīng)位熄滅。
程序流程圖
1584021074(1).png (47.84 KB, 下載次數(shù): 72)
下載附件
2020-3-12 21:53 上傳
1584021128(1).png (48.08 KB, 下載次數(shù): 54)
下載附件
2020-3-12 21:54 上傳
單片機(jī)源程序編寫:- #include <intrins.h>
- #include < absacc.h >
- #include<reg52.h>
- #define COM8155 XBYTE[0x1000] //8155寫命令地址口
- #define PA8155 XBYTE[0x1001] //PA口讀寫地址口
- #define PB8155 XBYTE[0x1002] //PB口讀寫地址口
- #define PC8155 XBYTE[0x1003] //PC口讀寫地址口
- code unsigned char led_font[] = {0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,
- 0xff
- }; //共陰數(shù)碼管0-9、a-f及全熄的字形碼
- code unsigned char key_code[]={0x11,0x12,0x14,0x18,
- 0x21,0x22,0x24,0x28,
- 0x41,0x42,0x44,0x48,
- 0x81,0x82,0x84,0x88}; //此數(shù)組為鍵盤編碼
- unsigned char key_read(void); //讀鍵盤函數(shù)
- unsigned char led_data[8]={16,16,16,16,16,16,16,16};//當(dāng)前的顯示數(shù)字
- void delay_ms(unsigned charn); //延時(shí)程序
- void led_display(unsignedchar *p ); //LED動(dòng)態(tài)顯示子程序
- unsigned int m;
- void led_display(unsigned char *p)
- { unsigned char i;
- unsigned char j;
- unsigned char led_bit[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08};
- //LED的位選碼表
- for (i=0;i<2;i++)
- {
- PB8155 =led_font[p[ i]];
- PA8155 = led_bit[ i];
- for (j=0;j<125;j++);
- }
- }
- void delay_ms(unsigned char n) //延時(shí)Nms
- {
- unsigned char i;
- while(n--) // 對(duì)于11.0592M時(shí)鐘,約延時(shí)1ms
- {
- for (i=0;i<125;i++);
- }
- }
- unsigned char n=1; //用于暫停時(shí)等待再次啟動(dòng)的while循環(huán)
- unsigned char second; //定義計(jì)數(shù)second
- void main (void) //主函數(shù)
- {
- TMOD=0X02; //選定時(shí)器0,工作方式2
- TH0=0X06; //設(shè)定定時(shí)器初值
- TL0=0X06;
- ET0=1; //開定時(shí)器中斷
- EA=1; //允許CPU中斷
- second=99; //設(shè)定second初值99
- COM8155 = 0x03; //C口輸入,A、B口輸出
- while(1) //等待啟動(dòng)鍵0按下
- { n=1;
- if(key_read()==0) //按下啟動(dòng)鍵0
- {
- TR0=1; //開始計(jì)數(shù)
- }
- }
- }
- void t0(void) interrupt 1 using 0 //TL0計(jì)數(shù)溢出時(shí)進(jìn)入中斷函數(shù)
- {m++; //每次進(jìn)入中斷函數(shù)m++
- {
- led_display(led_data); //調(diào)用LED顯示程序
- if(m==85) //m==85時(shí)一秒
- {
- m=0; //使m=0,用于下次m再計(jì)時(shí)
- second--; //到達(dá)一秒時(shí)當(dāng)前值減1
- led_data[0]=second/10; //送出當(dāng)前值顯示(十位)
- led_data[1]=second%10; //(個(gè)位)
- }
- else //未到一秒時(shí)顯示當(dāng)前值
- {
- led_data[0]=second/10;
- led_data[1]=second%10;
- }
- if(second==-1) //second<0時(shí)再賦值99循環(huán)
- {
- second=99;
- }
- if(key_read()==1) //按下暫停鍵1時(shí)
- {
- while(n) //循環(huán)顯示當(dāng)前值
- {
- led_data[0]=second/10;
- led_data[1]=second%10;
- led_display(led_data); //調(diào)用LED顯示程序
- if(key_read()==0) //再次按下啟動(dòng)鍵0時(shí),n==0,跳出while循環(huán)
- {
- TR0=0;
- n=0;
- }
- }
- }
- if(key_read()==2) //按下復(fù)位鍵時(shí),second=99
- {second=99;
- led_data[0]=second/10;
- led_data[1]=second%10;
- }
- }
- }
- unsigned char key_read(void) //讀鍵盤值,PA低四位為輸出端即鍵盤列輸出端,PC低四位為輸入端即鍵盤行輸入端
- {
- unsigned char i,scandata;
- //col_out輸出PA口低四位,row_in獲取PC口低四位,組合成鍵碼
- unsigned char key_current,col_out,row_in;
- scandata=0x01; //設(shè)定掃描初值
- PA8155=0x0f;
- delay_ms(5);
- if((PC8155&0x0f)==0x00) //無(wú)按鍵按下,防止讀取不到鍵值,比如說是干擾
- {
- return 0xff;
- }
- for(i=0;i<4;i++)
- {
- PA8155=scandata; //PA口低四位循環(huán)輸出0,掃描鍵盤
- col_out=0x0f&scandata; //存儲(chǔ)PA口掃描的低四位
- if((PC8155&0x0f)!=0x00) //再次檢測(cè)PC口低四位是否有低電平
- {
- row_in=(PC8155&0x0f)<<4; //存儲(chǔ)PC口的低四位
- key_current=row_in+col_out; //key存儲(chǔ)鍵盤編碼,鍵碼為行(高4位)加列(低4位)
- }
- scandata=_crol_(scandata,1); //此函數(shù)功能為左循環(huán)移位
- }
- for(i=0;i<16;i++) //查表獲得相應(yīng)的16進(jìn)制值存放key_result中
- {
- if(key_current==key_code)
- {
- return i;
- }
- }
- return 0xff;
- }
復(fù)制代碼
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |