久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2372|回復: 0
打印 上一主題 下一主題
收起左側

單片機脈搏測量器(程序+proteus仿真)不顯示 求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:801890 發表于 2020-7-13 16:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
主程序:
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include<stdio.h>
#include "delay.h"
#include "1602.h"
#include "18b20.h"
unsigned char i_i=0,timecount=0,displayOK=0,rate=0,aa=0;        //中間變量值
unsigned int time[6]={0};                          //記錄多次心率值求平均
unsigned char xdata dis0[16];//定義顯示區域臨時存儲數組
unsigned char xdata dis1[16];          //顯示數組暫存
unsigned char update_flag =0;                //更新標志變量
unsigned long xdata time_50ms=0;        //        定時器變量
unsigned char readTemp = 0;                 //讀取溫度標志
int temp1;                                   //溫度讀取值
float temperature;                   //溫度實際值
unsigned char i;//變量i
unsigned char MesCount;           //短信發送計數
sbit P2_2=P2^2;
void Init_Timer0(void);        //函數聲明
void init_int0(void);
void uartSendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void uartSendByte(unsigned char dat);
void BuShuCheck(void);
void TIM2Inital(void);
/****************主函數***************/
void main()
{        
        EX0=1;                          //允許外部中斷0中斷
        EA=1;                           //開總中斷
        IT0 = 1;                   //外部中斷0負跳變中斷
        Init_Timer0();                    //初始化定時器
        TIM2Inital();
        UART_Init();

        LCD_Init();           //初始化液晶
        DelayMs(20);          //延時有助于穩定
        LCD_Clear();                  //清屏
        DelayMs(50);


        sprintf(dis1,"Now:%3d/min",(unsigned int)rate);
        LCD_Write_String(0,0,"Heart Rate");                        
        LCD_Write_String(0,1,dis1);          //顯示心率

//        uartSendStr("ready ok !",10);

        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);          //心率計算 5次求平均值
                }
                if(update_flag==1)
                {
                        sprintf(dis0,"Now:%3dbpm %4.1fC",(unsigned int)rate,temperature);  //打印當前心率和溫度
                        LCD_Write_String(0,1,dis0);          //顯示心率
                        update_flag =0;                   //更新標志清零
                }

                if(readTemp == 1)                                //讀取溫度標志
                {
                    temp1=ReadTemperature();                //讀取溫度
                        temperature=(float)temp1*0.0625;                  //溫度值轉換
                        if(MesCount == 0)                          //數據發送計數
                        {
                                MesCount =1;
                                uartSendStr("AT+CIPSEND=0,16\r\n",17);                //發送32位數據
                        }
                        else
                        {
                                MesCount = 0;                                   //發送數據                                
                                uartSendStr(dis0,16);                   //發送數據內容
                        }
                        readTemp =        0;
                }
        }
}


/*************定時器0初始化程序***************/
void Init_Timer0(void)         
{
        TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
//        TH0=(65536-20000)/256;                  //重新賦值 20ms
//        TL0=(65536-20000)%256;
        EA=1;            //總中斷打開
        ET0=1;           //定時器中斷打開
        TR0=1;           //定時器開關打開

}

void int0() interrupt 0
{
                EX0=0;//暫時關外部中斷
                if(timecount<8)   //當連續兩次檢測時間間隔小于8*50ms=400ms不處理
                {
                                TR0=1;//開定時器
                }
                else
                {
                        time[i_i]=timecount*50+TH0*0.256+TL0/1000;//算出間隔時間
                        TH0 = 0x3c;
                        TL0 = 0xb0;     // 50ms         12M
                        timecount=0;//50ms計數清零
                        i_i++;
                        if(i_i==6)//記錄到超過等于6次時間
                        {
                                i_i=1;//計數從1開始
                                displayOK=1;    //測得5次開始顯示?
                        }                                                               
                }
                EX0=1;
}

/*************定時器0中斷服務程序***************/
void time0_int() interrupt 1
{        
        TH0 = 0x3c;
        TL0 = 0xb0;     // 50ms         12M
        timecount++;//每50ms一次計數
        if(timecount>65)     //當超過25*50ms=1.5s沒有檢測到信號停止顯示
        {
                        i_i=0;//數據個數清零
                        timecount=0;//50ms計數清零
                        displayOK=0;//顯示關
                        TR0=0;//定時器關
                        TH0 = 0x3c;
                        TL0 = 0xb0;     // 50ms         12M
                        P2_2=0;
                        P2_2=1;
        }
}



void TIM2Inital(void)
{
  RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自動重載
  RCAP2L = (65536-60000)%256;
  ET2=1;                     //打開定時器中斷
  EA=1;                      //打開總中斷
  TR2=1;                     //打開定時器開關
}
void TIM2(void) interrupt 5 using 1//定時器2中斷
{
    TF2=0;
        time_50ms++;
        if(time_50ms%2==0)                  //定時100ms到
        {
                update_flag=1;                    //更新標志置位
                if(time_50ms % 20 ==0) //定時1s
                {
                        readTemp =1;         //讀取溫度置位
                }
        }           
}

void UART_Init(void)
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
    TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz
        TL1 = TH1;  
    TR1   = 1;                  // TR1:  timer 1 打開                        
    EA    = 1;                  //打開總中斷
    ES    = 1;                  //打開串口中斷
}

void uartSendByte(unsigned char dat)
{
        unsigned char time_out;
        time_out=0x00;
        SBUF = dat;                          //將數據放入SBUF中
        while((!TI)&&(time_out<100))  //檢測是否發送出去
        {time_out++;DelayUs2x(10);}        //未發送出去 進行短暫延時
        TI = 0;                                                //清除ti標志
}

void uartSendStr(unsigned char *s,unsigned char length)
{
        unsigned char NUM;
        NUM=0x00;
        while(NUM<length)        //發送長度對比
        {
                uartSendByte(*s);  //放松單字節數據
                s++;                  //指針++
                NUM++;                  //下一個++
           }
}

void UART_SER (void) interrupt 4         //串行中斷服務程序
{
        if(RI)                        //判斷是接收中斷產生
        {
                RI=0;                      //標志位清零
        }
        if(TI)  //如果是發送標志位,清零
        TI=0;
}


仿真電路.rar

25 KB, 下載次數: 21, 下載積分: 黑幣 -5

PULSE2.rar

60.78 KB, 下載次數: 8, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美二区在线 | 一区二区在线视频 | www.黄色网| 欧美一区二区免费在线 | 精品国产乱码一区二区三区a | 中文字幕一区二区三区四区 | 久久com | 美女一级毛片 | 成人久久18免费网站图片 | 日本不卡一区 | www.色53色.com | 中文字幕亚洲精品 | 成人久久 | 国产成人精品免费视频 | 成人精品国产 | av小说在线| 毛片在线看看 | 国产日韩精品在线 | 久久精品综合 | 一级免费看片 | 精品久久久久久红码专区 | 三级视频国产 | 亚洲欧美日韩电影 | 国产精品久久一区二区三区 | 精品在线一区二区 | 噜啊噜在线 | 国产免费一区二区三区最新6 | 性福视频在线观看 | 午夜激情小视频 | 亚洲一区二区三区 | 欧美精品一二三区 | 永久精品 | 日韩不卡一区二区 | 成人免费视频在线观看 | 99久久视频 | 亚洲欧美国产精品一区二区 | 亚洲欧美成人影院 | 国产精品久久久久婷婷二区次 | 99re6在线视频精品免费 | 91精品国产一区二区三区蜜臀 | 一区二区三区四区不卡视频 |