這個程序演示了51單片機捕捉占空比并顯示在lcd12864液晶屏上面(帶仿真)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
0.png (29.43 KB, 下載次數: 76)
下載附件
2017-6-10 16:31 上傳
0.png (20.3 KB, 下載次數: 77)
下載附件
2017-6-10 16:31 上傳
0.png (59.44 KB, 下載次數: 54)
下載附件
2017-6-10 16:30 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #include <string.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS= P2^0 ;
- sbit RW= P2^1 ;
- sbit EN= P2^2 ;
- uint cc=0,shidu=0 ;
- uchar LCD_LINE_ONE[16]={" hs1101 "};
- uchar LCD_LINE_TWO[16]={"HZ: hz"};
- uchar LCD_LINE_THR[16]={"CAP: pf"};
- uchar LCD_LINE_FOU[16]={"HR: % "};
- uint Cap0 = 0;
- uint Cap1 = 0;
- uint N=0,N1=0,NP1=0 ;
- unsigned int CF1 = 0 ;
- void delay( ms )
- {
- int i ;
- while(ms--)
- {
- for(i=0 ;i<5 ;i++ ) ;
- }
- }
-
- uchar Read_LCD_State()
- {
- uchar state;
- RS=0;RW=1;EN=1;delay(1);
- state=P0;
- EN = 0;delay(1);
- return state;
- }
- void LCD_Busy_Wait()
- {
- while((Read_LCD_State()&0x80)==0x80);
- delay(5);
- }
- void Write_LCD_Zhilin(uchar zl)
- {
- LCD_Busy_Wait();
- RS=0;RW=0;
- EN=0;
- P0=zl;
- EN=1;
- delay(1);
- EN=0;
- }
- void Write_LCD_shuju(uchar date)
- {
- LCD_Busy_Wait();
- RS=1;RW=0;
- EN=0;
- P0=date;
- EN=1;
- delay(1);
- EN=0;
- }
- void LCD_INIT()
- {
- Write_LCD_Zhilin(0x38); // 顯示模式設置
- delay(1);
- Write_LCD_Zhilin(0x01); // 顯示清屏
- delay(1);
- Write_LCD_Zhilin(0x06); // 光標移動設置
- delay(1);
- Write_LCD_Zhilin(0x0c); // 開及光標設置
- delay(1);
- }
- void Display_LCD_String(uchar p,uchar *s)
- {
- uchar i;
- Write_LCD_Zhilin(p|0x80) ; //寫地址高位為一
- //Write_LCD_Zhilin(0x40|0x80) ;
- for(i=0;i<16;i++)
- {
- Write_LCD_shuju(s[i]);
- delay(1);
- }
- }
- void Timer2Init(void)
- {
- T2CON = 0x09; //定時器2工作在捕獲模式,由外部輸入信號產生跳變
- RCAP2L = 0x00; //捕獲保存TL2、TH2的值,CL,CH,的值自動賦給RCAP2L,RCAP2H.
- RCAP2H = 0x00;
- TL2 = 0x00;
- TH2 = 0x00;
- ET2 = 1; //定時器2中斷使能
- EA = 1;
- //IP = 0x20; //高優先級
- TR2 = 1; //定時器2的啟動開關
- }
- void ISR_Timer2(void) interrupt 5
- {
- // 清除Timer2溢出標志
- if(TF2)//溢出中斷,進行結算
- {
- TR2 = 0; //定時器停止計數
- TF2 = 0; //定時器2溢出標志清
- NP1=N;
- N = 0;
- if(Cap1 >Cap0)
- {
-
- CF1 = 1000000 * (NP1-1) / (Cap1 - Cap0);//捕獲回來的頻率
- }
-
-
- TL2 = 0x00; //數據重載
- TH2 = 0x00;
- TR2 = 1;
- }
- else //捕獲中斷
- {
- EXF2 = 0; //捕獲中斷標志
- if(N==0)
- {
- Cap0 = RCAP2H; //高8位
- Cap0 = (Cap0 << 8) | RCAP2L; //低8位
- N = 1;
- }
- else
- {
- N++;
- Cap1 = RCAP2H;
- Cap1 = (Cap1 << 8) | RCAP2L;
- }
- }
- }
- void main()
- {
- int i ;
- LCD_INIT();
- Timer2Init();
- Display_LCD_String(0x00,LCD_LINE_ONE);
- while(1)
- {
-
-
- cc=479000/CF1 ;
- shidu=(cc-162)*100/38 ;
- sprintf(LCD_LINE_TWO+4,"%d", CF1 );
- Display_LCD_String(0x40,LCD_LINE_TWO);
- sprintf(LCD_LINE_THR+4,"%d", cc);
- Display_LCD_String(0x10,LCD_LINE_THR);
- sprintf(LCD_LINE_FOU+3,"%5d",shidu );
-
-
- Display_LCD_String(0x50,LCD_LINE_FOU);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
52buhuo.zip
(62.45 KB, 下載次數: 163)
2017-6-10 16:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|