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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4414|回復: 0
收起左側

Stc15f2k60s2單片機模擬量使用源程序

[復制鏈接]
ID:609989 發表于 2019-12-14 18:12 | 顯示全部樓層 |閱讀模式
感言:用了兩天時間,哎,不過弄出來真爽。

51hei.png
//硬件介紹:1.使用0~100N的壓力傳感器,模擬電壓輸出范圍是:1V~4.3V,P1.1是一個繼電器,設置成強推了,不用在意。
//功能介紹:1.獲取P1.0口模擬電壓值;2.轉換成浮點發送給上位機,上位機顯示“電壓值與壓力值”。
//接線介紹:將壓力傳感器與P1.0口相連接。
//注釋:程序使用的是查詢A/D方式,發送給上位機使用了兩種方式,選其中一種即可,程序都已經調通,可直接使用。
//感謝“wulin”大神。
#include <stc15f2k60s2.H>                        
#include <intrins.H>     
#include <stdio.h>
#define uint unsigned int               
#define uchar unsigned char            
#define ulint unsigned long int
     
#define FOSC 11059200L          //系統頻率
#define BAUD 9600            //串口波特率

#define ADC_POWER   0x80                //ADC power control dit (宏定義ADC電源控制位)1000 0000
#define ADC_FLAG    0x10                //ADC complete flag (宏定義ADC完成標志位)    0001 0000
#define ADC_START   0x08                //ADC start control dit (宏定義ADC啟動控制位)0000 1000
#define ADC_SPEEDLL 0x00                //420 clocks (宏定義420時鐘)速度控制         0000 0000
#define ADC_SPEEDL  0x20                //280 clocks (宏定義280時鐘)速度控制         0001 0000
#define ADC_SPEEDH  0x40                //140 clocks (宏定義140時鐘)速度控制         0010 0000
#define ADC_SPEEDHH 0x60                //070 clocks (宏定義70時鐘)速度控制          0011 0000

sbit Q1=P1^1;                                //驅動繼電器端口定義
uchar num1,num2;
uint  adcnum;
/*--------------------------------
   ms延時子程序 11.0592MHz時鐘
---------------------------------*/
void delayms(uint k)
{
    uint i,j;            
    for(i=k;i>0;i--)   
        for(j=1150;j>0;j--);
}
/*----------------------------
串口初始化
-----------------------------*/
void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位數據,可變波特率
        AUXR |= 0x01;                //串口1選擇定時器2為波特率發生器
        AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
        T2L = 0xE0;                        //設定定時初值
        T2H = 0xFE;                        //設定定時初值
        AUXR |= 0x10;                //啟動定時器2
}
/*----------------------------
   初始化ADC
-----------------------------*/
void InitADC()
{
        P1ASF=0x01;                            //設置P1.0端口作為模擬輸入
        ADC_RES=0;                            //Clear previous result (清除以前的結果)
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL;    //開啟ACD電源、設置轉換速度
        delayms(1);                                                //上電延時1ms                                       
}
/*----------------------------
   GET ADC
-----------------------------*/
uchar GetADCResult(uchar CHA)                                //獲取ADC結果
{
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//啟動轉換1000 1000
        _nop_();                        //延時確保正確讀到ADC_CONTR寄存器的值
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR & ADC_FLAG));        //等待ADC轉換完成標志置位 1001 1000
        ADC_CONTR &=~ADC_FLAG;                        //關閉ADC
        return ADC_RES ;                                //返回八位ADC結果
}
//第一種方法:數組
void Uartsend_1(unsigned char send)
{
    SBUF=send;                        //發送數據
    while(!TI);                        //等待前一幀數據發送完畢
    TI=0;                            //復位標志位
}
void U1_TX_C(char *send)
{
    unsigned char a=0;
    while(send[a])
    {
     Uartsend_1(send[a]);
     a++;
    }
}
void Uartsend_adc_1(unsigned long send) //我也不懂啥意思,照搬
{

    unsigned char a[4],b;
    send=GetADCResult(0);
      send=send*504/256;    //電壓計算
       a[0]=send%10+'0';        
       a[1]=send/10%10+'0';
    a[2]='.';                    
       a[3]=send/100+'0';        
   for(b=4;b>0;b--)            //發送
   Uartsend_1(a[b-1]);        //
}
//第二種方法:串口打印
void Uartsend_adc()
{
    float esp,esp1;
    num1=GetADCResult(0);
    esp=(num1*5.035/256)-0.002;    //電壓計算,最后這個0.002是我自己補償的
    TI=1;
    printf("電壓: %4.3f", esp); //保留小數點后兩位輸出
    printf("V \n");      
    while(!TI);//判斷是否發送完成  發送完成出循環
    TI = 0;   
    delayms(1000);
    TI=1;
    esp1=(esp-1.000)/0.033;
    printf("壓力: %2.1f", esp1); //保留小數點后兩位輸出
    printf("N \n");      
    while(!TI);//判斷是否發送完成  發送完成出循環
    TI = 0;   
}
/*--------------------------------------------------
主函數
---------------------------------------------------*/
void main()
{
        P1M1 = 0x01;                         //P1.0高阻 P1.1強推挽:0000 0001 ADC輸入高阻、繼電器強上拉
        P1M0 = 0x02;                         //P1.0高阻 P1.1強推挽:0000 0010 ADC輸入高阻、繼電器強上拉
        P_SW1= 0x40;                         //P3.6/P3.7串口1 RXD/TXD
        delayms(1000);
        Q1=0;                                //驅動繼電器端口初始化0        
        InitADC();                            //Init ADC sfr (初始化ADC SFR)
        UartInit();   
        while(1)
        {      
            
                SBUF=GetADCResult(0);//發送數據,發送的是ADC_RES值
                while(!TI);                                //等待發送完畢
                TI=0;                                                //發送中斷請求標志位清0
                delayms(2000);                        //延時2s發送一次
                adcnum=GetADCResult(0);                 //讀取一次
                Uartsend_adc_1(adcnum);
                U1_TX_C("V");
                delayms(2000);
                Uartsend_adc();
                delayms(2000);
               
        }
}

模擬量.rar

41.26 KB, 下載次數: 23, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃视频在线观看免费视频网站www | 免费观看成人av | 中文字幕在线视频一区二区三区 | 久久久久亚洲精品 | 一级片免费网站 | 国产欧美在线播放 | 中文字幕免费视频 | 久久久久久精 | 婷婷久久综合 | 国产福利91精品 | h视频在线看 | 亚洲网在线 | 精品国产乱码久久久久久果冻传媒 | 日韩精品久久 | 成人福利片 | 99精品一区二区三区 | 黄色精品视频网站 | 日韩免费av一区二区 | av在线成人 | 日韩一区二区在线视频 | 91精品国产91久久久久久密臀 | 欧美一区二区三区在线观看 | 亚洲一区二区三区免费在线观看 | 成人精品在线视频 | 日韩在线视频观看 | 欧美日韩成人在线 | 永久免费视频 | 日韩在线中文字幕 | 美女黄色在线观看 | 国内成人免费视频 | 日韩欧美精品一区 | 国产精品成人国产乱 | 欧美一区二区三区免费在线观看 | 亚洲一区二区三区免费视频 | 视频一区在线观看 | 国产日韩精品视频 | a国产视频| 伊人超碰 | 国产精品免费一区二区三区四区 | 国产成人精品一区二区在线 | 久国产 |