24小时热门版块排行榜    

CyRhmU.jpeg
查看: 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客户端
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小木木赏金

新虫 (小有名气)

引用回帖:
2楼: Originally posted by WindManZhou at 2017-06-05 16:46:52
这么简单,有什么可以解释的,直接说自己的难点在哪里

主函数里面的程序和定时器0中断里面的程序讲的是什么?

发自小木虫Android客户端
3楼2017-06-05 17:44:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 小木木赏金 的主题更新
信息提示
请填处理意见