| 查看: 1289 | 回复: 3 | ||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | ||
[求助]
求大神帮我详细解释一下这段程序!
|
||
#include <reg52.h> //调用单片机头文件#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255#define uint unsigned int //无符号整型 宏定义 变量范围0~65535#include <intrins.h>bit flag_300ms ;uchar code table_num[]="0123456789abcdefg";sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器sbit e =P1^2; //片选信号 下降沿触发unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;unsigned int time[6]={0};/***********************1ms延时函数*****************************/void delay_1ms(uint q){ uint i,j; for(i=0;i<q;i++) for(j=0;j<110;j++);}/********************************************************************* 名称 : delay_uint()* 功能 : 小延时。* 输入 : 无* 输出 : 无***********************************************************************/void delay_uint(uint q){ while(q--);}/********************************************************************* 名称 : write_com(uchar com)* 功能 : 1602命令函数* 输入 : 输入的命令值* 输出 : 无***********************************************************************/void write_com(uchar com){ e=0; rs=0; rw=0; P0=com; delay_uint(25); e=1; delay_uint(100); e=0;}/********************************************************************* 名称 : write_data(uchar dat)* 功能 : 1602写数据函数* 输入 : 需要写入1602的数据* 输出 : 无***********************************************************************/void write_data(uchar dat){ e=0; rs=1; rw=0; P0=dat; delay_uint(25); e=1; delay_uint(100); e=0; }/********************************************************************* 名称 : write_string(uchar hang,uchar add,uchar *p)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 write_string(1,5,"ab cd ef;" * 输入 : 行,列,需要输入1602的数据* 输出 : 无***********************************************************************/void write_string(uchar hang,uchar add,uchar *p){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p == '\0') break; write_data(*p); p++; } }/***********************lcd1602上显示两位十进制数************************/void write_sfm3(uchar hang,uchar add,uint date){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/100%10); write_data(0x30+date/10%10); write_data(0x30+date%10); }/***********************lcd1602初始化设置************************/void init_1602(){ write_com(0x38); // write_com(0x0c); write_com(0x06); delay_uint(1000); write_string(1,0," Heart Rate " ; write_string(2,0," 000/min " ;}/*************定时器0初始化程序***************/void time_init() { EA = 1; //开总中断 TMOD = 0X01; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时}/***********外部中断0初始化程序****************/void init_int0() //外部中断0初始化程序{ EX0=1; //允许外部中断0中断 EA=1; //开总中断 IT0 = 1; //外部中断0负跳变中断}/****************主函数***************/void main(){ init_1602(); //1602初始化 time_init(); //初始化定时器 init_int0(); //外部中断0初始化程序 while(1) { if(displayOK==0)//如果显示关 { rate = 0; } else//如果显示开 { rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5); } write_sfm3(2,5,rate); delay_1ms(300); }}void int0() interrupt 0{ if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理 { TR0=1;//开定时器 } else { time=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间 TH0 = 0x3c; TL0 = 0xb0; // 50ms 12M timecount=0;//50ms计数清零 i++; if(i==6)//记录到超过等于6次时间 { i=1;//计数从1开始 displayOK=1; //测得5次开始显示? } }}/*************定时器0中断服务程序***************/void time0_int() interrupt 1{ TH0 = 0x3c; TL0 = 0xb0; // 50ms 12M timecount++;//每50ms一次计数 if(timecount>25) //当超过25*50ms=1.5s没有检测到信号停止显示 { i=0;//数据个数清零 timecount=0;//50ms计数清零 displayOK=0;//显示关 TR0=0;//定时器关 TH0 = 0x3c; TL0 = 0xb0; // 50ms 12M }}发自小木虫Android客户端 |
» 猜你喜欢
请问哪里可以有青B申请的本子可以借鉴一下。
已经有4人回复
真诚求助:手里的省社科项目结项要求主持人一篇中文核心,有什么渠道能发核心吗
已经有6人回复
孩子确诊有中度注意力缺陷
已经有14人回复
三甲基碘化亚砜的氧化反应
已经有4人回复
请问下大家为什么这个铃木偶联几乎不反应呢
已经有5人回复
请问有评职称,把科研教学业绩算分排序的高校吗
已经有5人回复
2025冷门绝学什么时候出结果
已经有3人回复
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有4人回复
康复大学泰山学者周祺惠团队招收博士研究生
已经有6人回复
AI论文写作工具:是科研加速器还是学术作弊器?
已经有3人回复
3楼2017-06-05 17:44:22













* 输入 : 行,列,需要输入1602的数据* 输出 : 无***********************************************************************/void write_string(uchar hang,uchar add,uchar *p){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p == '\0') break; write_data(*p); p++; } }/***********************lcd1602上显示两位十进制数************************/void write_sfm3(uchar hang,uchar add,uint date){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/100%10); write_data(0x30+date/10%10); write_data(0x30+date%10); }/***********************lcd1602初始化设置************************/void init_1602(){ write_com(0x38); // write_com(0x0c); write_com(0x06); delay_uint(1000); write_string(1,0," Heart Rate "
回复此楼