- #include <reg51.h>
- #include "lcd.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit key1=P2^1;
- uint z=0,count=0,msec=0,zhuan;
- uchar display[]={"speed=XXXXr/s "}; //定义显示参数
- /*-----------------------毫秒延时------------------------*/
- void delay(uint ms)
- {
- uint m,j;
- for (j=0;j<ms;j++)
- for (m=0;m<120;m++);
- }
- void displaytolcd()
- {
- uint i;
- LcdWriteCom(0x80); //向LCD1602写命令80H ,定义光标位置为首位
- for (i=0;i<sizeof(display);i++)
- {
- LcdWriteData(display[i]);
- delay(10);
- }
- }
- void disp_count()
- {
- display[6]=(zhuan/1000+'0'); //转换转速的千位
- display[7]=(zhuan/100%10+'0'); //转换转速的百位
- display[8]=(zhuan/10%10+'0'); //转换转速的十位
- display[9]=(zhuan%10+'0'); //转换转速的个位
- }
- /*-------------------外部中断0计数程序-------------------*/
- void counter() interrupt 0
- {
- if(!key1){count+=1;
- if(count==2) //2次循环为发动机转一圈
- {
- z+=1; //转圈计数加1
- count=1; //初始化计数
- }
- }
- }
- /*-----------------内部中断1计时计数程序-----------------*/
- void Timer_0() interrupt 1
- {
- TH0=0xDC; //10ms定时
- TL0=0x00;
- msec+=1;
- }
- void int_all()
- {
- z=0; //初始化z的值
- count=0; //初始化count的值
- zhuan=0; //初始化转的值
- TMOD=0x01; //内部中断定时器选择
- TH0=0xDC; //10ms定时
- TL0=0x00;
- EA=1; //开中断总开关
- ET0=1; //开内部中断0
- TR0=1; //计时器开始工作
- IT0=1; //外部中断0为下降沿触发
- EX0=1; //开外部中断0
- EX1=0;
- IT1=0;
- }
- /**********************************
- 函数声明
- **********************************/
- void LcdWriteCom(uchar com); /*LCD1602写入8位命令子函数 */
- void LcdWriteData(uchar dat); /*LCD1602写入8位数据子函数*/
- void LcdInit(); /*LCD1602初始化子程序*/
- void main()
- {
- int_all();
- LcdInit();
- while(1)
- {
- if(msec==10)
- {
- zhuan=10*z;
- /////z=0;
- msec=0;
- }
- display[13]=z%10+'0';
- disp_count(); //数据处理
- displaytolcd(); //LCD显示
- }
- }
复制代码
程序如上,自己从网上查资料然后修修改改就这样,其中lcd初始化什么的程序就没有写在这里了。
其中/*-------------------外部中断0计数程序-------------------*/
void counter() interrupt 0 { if(!key1){count+=1; if(count==2) //2次循环为发动机转一圈 { z+=1; //转圈计数加1 count=1; //初始化计数 } } } 这一部分程序不知道错在哪里,z的值总是0,这导致转速显示出来老是0。也许是程序其它的问题,我看了一整天还没发现。求解答~!
|