自写程序:旋转编码器软件方式扫描计数
时间:10-27
来源:互联网
点击:
国培期间时间相对而言比较充裕,于是就想写点程序。来的时候带了一个旋转编码开关,今天晚上写了个程序测试了一下,通过了,程序能够识别编码开关的旋转方向和旋转次数,并且在数码管上显示出来。支持负数显示。以下为源程序,程序在一职校开发板上运行成功,芯片为STC89C51RC。
#include reg52.h> //头文件 sbit anotherbit = P1^2; //旋转编码器另一脚 sbit rotation=P1^0; //旋转编码器中一脚 bit oldbit; //上一状态暂存位 unsigned char led1,led2,led3,led4,ztj;//LED显示缓存,扫描状态机 int xuanzhuanzhi,ctemp;//旋转值 unsigned char code ledseg[17]={0x88,0xBE,0xC4,0x94,0xB2,0x91,0x81,0xBC,0x80, 0x90,0xA0,0x83,0xC9,0x86,0xC1,0xE1,0xf7}; void init(void) { TMOD=0x11; //方式1 TR0=1; //启动T0开始扫描数码管 ET0=1; //打开中断 EA=1; } void ledscan(void) //数码管扫描程序 { switch(ztj) //切换状态机 { case 0: //分支 P2=0xff; //关闭数码管 P0=ledseg[led4];//查表得段码数据 P2=0x7f; //打开数码管 ztj=1; //转移状态 break; //分支结束 case 1: P2=0xff; P0=ledseg[led3]; P2=0xbf; ztj=2; break; case 2: P2=0xff; P0=ledseg[led2]; P2=0xdf; ztj=3; break; case 3: P2=0xff; P0=ledseg[led1]; P2=0xef; ztj=0; break; default: //没有找到分支 ztj=0; //状态机复位 break; //分支结束 } } void timer0 (void) interrupt 1 using 1 //T0定时器中断程序,定时时间到,自动运行此程序 { TH0=(65536-5000)/256; //置定时值,每次时间到都要重新置定时值 TL0=(65536-5000)%256; //每5000us产生一次定时器定时中断(12MHz) ledscan(); //每5000us扫描一次LED(12MHz) } void main(void) { init(); //是初始化,打开中断及定时器 while(1) { ctemp=xuanzhuanzhi; //复制计数值 if(ctemp0) //判断符号 { ctemp=-ctemp; //如果为负数,取反 led4=16; //显示负号 led3=ctemp%1000/100; //提取各位数值 led2=ctemp%100/10; //提取各位数值 led1=ctemp%10; //提取各位数值 } else { led4=ctemp/1000; //提取各位数值 led3=ctemp%1000/100; //提取各位数值 led2=ctemp%100/10; //提取各位数值 led1=ctemp%10; //提取各位数值 } if(oldbit==1rotation==0) //判断前后状态以识别是否发生下降沿 { if(anotherbit) //判断另一相电平 { xuanzhuanzhi++; //为高,正转 } else { xuanzhuanzhi--; //为低,反转 } } oldbit=rotation; //刷新位暂存值 } }
- PLC在自立袋罐装机控制系统中的应用(08-18)
- 基于AVR单片机电风扇360度内摇头角度自由调节装置的实现(01-19)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)