|
感言:用了兩天時(shí)間,哎,不過弄出來(lái)真爽。
51hei.png (4.54 KB, 下載次數(shù): 64)
下載附件
2019-12-15 00:32 上傳
//硬件介紹:1.使用0~100N的壓力傳感器,模擬電壓輸出范圍是:1V~4.3V,P1.1是一個(gè)繼電器,設(shè)置成強(qiáng)推了,不用在意。
//功能介紹:1.獲取P1.0口模擬電壓值;2.轉(zhuǎn)換成浮點(diǎn)發(fā)送給上位機(jī),上位機(jī)顯示“電壓值與壓力值”。
//接線介紹:將壓力傳感器與P1.0口相連接。
//注釋:程序使用的是查詢A/D方式,發(fā)送給上位機(jī)使用了兩種方式,選其中一種即可,程序都已經(jīng)調(diào)通,可直接使用。
//感謝“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 //系統(tǒng)頻率
#define BAUD 9600 //串口波特率
#define ADC_POWER 0x80 //ADC power control dit (宏定義ADC電源控制位)1000 0000
#define ADC_FLAG 0x10 //ADC complete flag (宏定義ADC完成標(biāo)志位) 0001 0000
#define ADC_START 0x08 //ADC start control dit (宏定義ADC啟動(dòng)控制位)0000 1000
#define ADC_SPEEDLL 0x00 //420 clocks (宏定義420時(shí)鐘)速度控制 0000 0000
#define ADC_SPEEDL 0x20 //280 clocks (宏定義280時(shí)鐘)速度控制 0001 0000
#define ADC_SPEEDH 0x40 //140 clocks (宏定義140時(shí)鐘)速度控制 0010 0000
#define ADC_SPEEDHH 0x60 //070 clocks (宏定義70時(shí)鐘)速度控制 0011 0000
sbit Q1=P1^1; //驅(qū)動(dòng)繼電器端口定義
uchar num1,num2;
uint adcnum;
/*--------------------------------
ms延時(shí)子程序 11.0592MHz時(shí)鐘
---------------------------------*/
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位數(shù)據(jù),可變波特率
AUXR |= 0x01; //串口1選擇定時(shí)器2為波特率發(fā)生器
AUXR |= 0x04; //定時(shí)器2時(shí)鐘為Fosc,即1T
T2L = 0xE0; //設(shè)定定時(shí)初值
T2H = 0xFE; //設(shè)定定時(shí)初值
AUXR |= 0x10; //啟動(dòng)定時(shí)器2
}
/*----------------------------
初始化ADC
-----------------------------*/
void InitADC()
{
P1ASF=0x01; //設(shè)置P1.0端口作為模擬輸入
ADC_RES=0; //Clear previous result (清除以前的結(jié)果)
ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //開啟ACD電源、設(shè)置轉(zhuǎn)換速度
delayms(1); //上電延時(shí)1ms
}
/*----------------------------
GET ADC
-----------------------------*/
uchar GetADCResult(uchar CHA) //獲取ADC結(jié)果
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//啟動(dòng)轉(zhuǎn)換1000 1000
_nop_(); //延時(shí)確保正確讀到ADC_CONTR寄存器的值
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //等待ADC轉(zhuǎn)換完成標(biāo)志置位 1001 1000
ADC_CONTR &=~ADC_FLAG; //關(guān)閉ADC
return ADC_RES ; //返回八位ADC結(jié)果
}
//第一種方法:數(shù)組
void Uartsend_1(unsigned char send)
{
SBUF=send; //發(fā)送數(shù)據(jù)
while(!TI); //等待前一幀數(shù)據(jù)發(fā)送完畢
TI=0; //復(fù)位標(biāo)志位
}
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; //電壓計(jì)算
a[0]=send%10+'0';
a[1]=send/10%10+'0';
a[2]='.';
a[3]=send/100+'0';
for(b=4;b>0;b--) //發(fā)送
Uartsend_1(a[b-1]); //
}
//第二種方法:串口打印
void Uartsend_adc()
{
float esp,esp1;
num1=GetADCResult(0);
esp=(num1*5.035/256)-0.002; //電壓計(jì)算,最后這個(gè)0.002是我自己補(bǔ)償?shù)?br />
TI=1;
printf("電壓: %4.3f", esp); //保留小數(shù)點(diǎn)后兩位輸出
printf("V \n");
while(!TI);//判斷是否發(fā)送完成 發(fā)送完成出循環(huán)
TI = 0;
delayms(1000);
TI=1;
esp1=(esp-1.000)/0.033;
printf("壓力: %2.1f", esp1); //保留小數(shù)點(diǎn)后兩位輸出
printf("N \n");
while(!TI);//判斷是否發(fā)送完成 發(fā)送完成出循環(huán)
TI = 0;
}
/*--------------------------------------------------
主函數(shù)
---------------------------------------------------*/
void main()
{
P1M1 = 0x01; //P1.0高阻 P1.1強(qiáng)推挽:0000 0001 ADC輸入高阻、繼電器強(qiáng)上拉
P1M0 = 0x02; //P1.0高阻 P1.1強(qiáng)推挽:0000 0010 ADC輸入高阻、繼電器強(qiáng)上拉
P_SW1= 0x40; //P3.6/P3.7串口1 RXD/TXD
delayms(1000);
Q1=0; //驅(qū)動(dòng)繼電器端口初始化0
InitADC(); //Init ADC sfr (初始化ADC SFR)
UartInit();
while(1)
{
SBUF=GetADCResult(0);//發(fā)送數(shù)據(jù),發(fā)送的是ADC_RES值
while(!TI); //等待發(fā)送完畢
TI=0; //發(fā)送中斷請(qǐng)求標(biāo)志位清0
delayms(2000); //延時(shí)2s發(fā)送一次
adcnum=GetADCResult(0); //讀取一次
Uartsend_adc_1(adcnum);
U1_TX_C("V");
delayms(2000);
Uartsend_adc();
delayms(2000);
}
}
|
-
-
模擬量.rar
2019-12-14 18:11 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
41.26 KB, 下載次數(shù): 23, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|