完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include #define uint unsigned int #define uchar unsigned char // 宏定义 /*----------------------- 端口命名------------------------*/ ***it rs=P2^0; //LCD 的数据/命令选择端 ***it rw=P2^1; //LCD 的读写选择端 ***it e=P2^2; //LCD 的使能信号端 /*-------------------------------------------------------*/ /*----------------------- 定义参数------------------------*/ uint i,z,count,zhuan,msec; // 定义参数 uchar display[]={" speed= r/min "}; // 定义显示参数/*-------------------------------------------------------*/ /*----------------------- 毫秒延时------------------------*/ void delay(uint ms) { uint i,j; // 为延时引入i,j 两参数 for (j=0;j } /*-------------------------------------------------------*/ /*-------------------- 向LCD1602 写命令--------------------*/ void write_command(uchar command) { rs=0; // 数据、命令选择端0 为命令 rw=0; // 读、写选择端0 为写 P0=command; // 向LCD 写命令 delay(5); // 稍做延迟,代替检测忙状态 e=1; // 信号使能端高电平 delay(5); // 稍做延迟,代替检测忙状态 e=0; // 信号使能端低电平 } /*-------------------------------------------------------*/ /*-------------------- 向LCD1602 写数据--------------------*/ void write_data(uchar data0) { rs=1; // 数据、命令选择端1 为数据 rw=0; // 读、写选择端0 为写 P0=data0; // 向LCD 写数据 delay(5); // 稍做延迟,代替检测忙状态 e=1; // 信号使能端高电平 delay(5); // 稍做延迟,代替检测忙状态 e=0; // 信号使能端低电平 } /*-------------------------------------------------------*/ /*------------------- 外部中断0 计数程序-------------------*/ void counter(void) interrupt 0 { EX1=0; // 关外部中断1 count++; if(count==2) //2 次循环为发动机转一圈 { count=1; // 初始化计数 z++; // 转圈计数加1 } // 计数+1 EX1=1; // 开外部中断1 return; } /*-------------------------------------------------------*/ /*------------------------LCD 显示------------------------*/ void displaytolcd() { write_command(0x80); // 向LCD1602 写命令80H for (i=0;i write_data(display[i]); delay(5); } } /*-------------------------------------------------------*/ /*----------------- 内部中断0 计时计数程序-----------------*/ void timer_0(void) interrupt 1 { TH0=0x65; //50ms 定时 TL0=0xF3; msec++; if(msec==40) //50*40=2S { displaytolcd(); msec=0; zhuan=(z*1.3)/32; z=0; } } /*-------------------------------------------------------*/ /*---------------------- 端口初始化-----------------------*/ void int_all() { z=0; // 初始化z 的值 count=0; // 初始化count 的值 zhuan=0; // 初始化转的值 rw=0; // 选择LCD 写数据指令 delay(15); // 延时15ms write_command(0x38); // 向LCD1602 写命令38H delay(5); // 延时5ms write_command(0x0c); // 向LCD1602 写命令0EH delay(5); // 延时5ms write_command(0x06); // 向LCD1602 写命令06H TMOD=0x01; // 内部中断定时器选择 TH0=0x66; //50ms 定时 TL0=0x50; EA=1; // 开中断总开关 ET0=1; // 开内部中断0 TR0=1; // 计时器开始工作 IT0=1; // 外部中断0 为下降沿触发 EX0=1; // 开外部中断0 } /*-------------------------------------------------------*/ /*----------------------- 数据处理------------------------*/ void disp_count() { display[9]=(zhuan/1000+'0'); // 转换转速的千位 display[10]=(zhuan/100%10+'0'); // 转换转速的百位 display[11]=(zhuan/10%10+'0'); // 转换转速的十位 display[12]=(zhuan%10+'0'); // 转换转速的个位 } /*-------------------------------------------------------*/ /*------------------------ 主函数-------------------------*/ void main() { int_all(); // 全局初始化 while(1) { disp_count(); // 数据处理 displaytolcd(); //LCD 显示 } } |
|
相关推荐
3个回答
|
|
display[9]=(zhuan/1000+'0'); // 转换转速的千位,这里用的是变量zhuan,但在中断里用的是z++; // 转圈计数加1
最佳答案
|
|
|
|
最好能说明问题现象
|
|
|
|
只显示speed=0000r/min,怎么改变电机转速都不对
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
744 浏览 0 评论
【每周推荐】采用11代Intel CPU,基于youyeetoo X1开发板搭建少儿AI智能STEAM积木平台
865 浏览 0 评论
2679 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
2295 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
1716 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
5825 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-25 21:41 , Processed in 0.540956 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号