主要是用單片機 INT0 的中斷進行脈沖計數
脈沖是由Clock元器件產生。
INT0外部中斷輸入脈沖。
設置舉例,設置高低高時鐘,頻率為10,則設置第一個邊沿出現時間為1.1。
INT0是低電平觸發(fā),設置出現時間為1.1剛好每秒增加數為10,并且每次都是10的倍數。
開關型霍爾元器件剛好是低電平,可以直接使用。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (9.9 KB, 下載次數: 61)
下載附件
2019-3-11 01:52 上傳
單片機源程序如下:
- // 脈沖計數
- // INT0中斷計數
- #include <reg51.h>
- sbit P2_0 = P2^0;//數碼管選定位
- sbit P2_1 = P2^1;//數碼管選定位
- sbit P2_2 = P2^2;//數碼管選定位
- sbit P2_3 = P2^3;//數碼管選定位
- //共陽極數碼管
- unsigned char code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
- unsigned int motorspeed = 0;
- unsigned char GE, SHI, BAI, QIAN;
- unsigned int counter = 0;//脈沖數
- unsigned int calsp;//設定多長時間計數一次
- void display();//數碼管顯示
- void delay();//延遲函數
- void calspeed();
- void main()
- {
- EA = 1;//開啟總中斷
- EX0 = 1;//開啟外部中斷0
- IT0 = 1;//設置成下降沿觸發(fā)方式
- TMOD = 0x01;//設置定時器0為模式1,即16位計數模式
- TH0 = (65536-10000)/256;//計數時間為10ms
- TL0 = (65536-10000)%256;
- ET0 = 1;//開啟定時器0中斷
- TR0 = 1;//啟動定時器0
- P2 = P2&0xf0;//將P2的1~4置1
- while(1)
- {
- display();
- calspeed();
- }
- return ;
- }
- void calspeed()
- {
- if (calsp == 100)//100*10=1s計算1次
- {
- motorspeed = motorspeed + counter;
- counter = 0;//清零脈沖數
- calsp = 0;//清零標志
- }
- }
- //數碼管顯示函數,依次點亮數碼管
- void display()
- {
- GE = motorspeed%10;
- SHI = motorspeed/10%10;
- BAI = motorspeed/100%10;
- QIAN = motorspeed/1000%10;
- P2_0 = 1;
- P0 = table[QIAN];
- delay();
- P2_0 = 0;
- P2_1 = 1;
- P0 = table[BAI];
- delay();
- P2_1 = 0;
- P2_2 = 1;
- P0 = table[SHI];
- delay();
- P2_2 = 0;
- P2_3 = 1;
- P0 = table[GE];
- delay();
- P2_3 = 0;
- }
- //延遲函數
- void delay()
- {
- unsigned char i = 10;
- while(i--)
- ;
- }
- void _TIMER0() interrupt 1
- {
- TH0 = (65536-10000)/256;//重新裝入初值,計數時間為10ms
- TL0 = (65536-10000)%256;
- calsp++;
- }
- //INT0輸入
- void _INT0() interrupt 0
- {
- counter++;
- }
復制代碼
0.png (36.88 KB, 下載次數: 39)
下載附件
2019-3-11 01:51 上傳
所有資料51hei提供下載:
脈沖計數-20190310183300.zip
(20.7 KB, 下載次數: 145)
2019-3-10 18:47 上傳
點擊文件名下載附件
脈沖計數 下載積分: 黑幣 -5
|