|
求助,怎么寫這個的主函數代碼,讓這里的AD轉換器得到的數據隨著變阻器阻值的變化,在某個范圍內報警(亮燈并且發出警報)
ad轉換器的轉換代碼已經成功
#include <reg52.h> //頭文件
#define uchar unsigned char //宏定義無符號字符型
#define uint unsigned int //宏定義無符號整型
sbit CS_0832 = P1^0;
sbit CLK_0832 = P1^1;
sbit DO_0832 = P1^2; // DI、DO不同時有效,可共用一個接口
sbit DI_0832 = P1^2;
/******************************************************************
延時函數
******************************************************************/
void delayms(unsigned int xms)
{
unsigned int x;
unsigned char y;
for(x = xms; x > 0; x--)
for(y = 114; y>0; y--);//11.0592MHz: 114 //12MHz: 124
}
extern void _nop_ ( void );
#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0
//把模擬電壓值轉換成8位二進制數并返回
unsigned char read0832()
{
unsigned char i, ch = 0, ch1 = 0;
CS_0832=0; // 片選,DO為高阻態
DI_0832=1;
// 此處暫停T-SetUp: 250ns (由pulse0832完成)
pulse0832(); // 第一個脈沖,起始位,DI置高
DI_0832=1;
pulse0832(); // 第二個脈沖,DI=1表示雙通道單極性輸入
DI_0832=1;
pulse0832(); // 第三個脈沖,DI=1表示選擇通道1(CH2)
// 51單片機為準雙向IO口:應先寫入1再讀取
DI_0832=1;
// MSB FIRST DATA
for(i = 0; i < 8; ++i) {
pulse0832();
ch <<= 1;
if(DO_0832==1)
ch |= 0x01;
}
// MSB FIRST輸出的最后一位與LSB FIRST輸出的第一位是在
// 同一個時鐘下降沿之后,故此處先執行讀取,后執行pulse
// LSB FIRST DATA
for(i = 0; i < 8; ++i) {
ch1 >>= 1;
if(DO_0832==1)
ch1 |= 0x80;
pulse0832();
}
CS_0832=1; // 取消片選,一個轉換周期結束
return (ch==ch1) ? ch : 0; // 返回轉換結果
}
/*************************************************************************
CLK振蕩信號
**************************************************************************/
void timer0( ) interrupt 1 //定時器0工作方式1
{
TH0=(65536-2)/256; //重裝計數初值
TL0=(65536-2)%256; //重裝計數初值
}
/*************************************************************************
主函數
**************************************************************************/
void main()
{
TMOD=0X01; //定時器中斷0
TH0=(65536-2)/256; //定時時間高八位初值
TL0=(65536-2)%256; //定時時間低八位初值
EA=1; //開CPU中斷
ET0=1; //開T/C0中斷
TR0=1;
|
|