|
程序:
/******************調用頭文件*******************/
#include "reg52.h"
#include "intrins.h"
/*****************定義地址**********************/
sbit KEY = P1^0; //按鍵
sbit ADD_C = P1^2;
sbit ADD_B = P1^3;
sbit ADD_A = P1^4; // 選輸入口
sbit CLK = P1^5; // 時鐘
sbit START = P1^6; // 轉換啟動信號
sbit EOC = P1^7; // 轉換結束信號
sbit OE = P1^1; // 輸出允許信號
/*****************定義全局變量********************/
int flag = 0;
/*****************數碼管段碼**********************/
unsigned char code DUAN[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //不帶小數點
unsigned char code DUAN1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x80}; //帶小數點
/*****************電壓值區間******************/
float JS[] = {0,62.5,125,187.5,250,312.5,375,437.5,500};
/*******************讀ADC*******************/
void read_adc(void)
{
START = 0;
_nop_();
START = 1;
_nop_();
START = 0;
while(EOC==0);
OE=1;
}
/*****************AD值區間計算*********************/
int LED_JS(float AD)
{
int t0 = 0;
int i = 0;
for(; i<8 ;i++)
{
if(AD >= JS[i])
if(AD <= JS[i+1])
t0 = i;
}
return t0+1;
}
/*****************不精確延時**********************/
void delay_ms(int i)
{
int j=0;
while(i--)
{
for(j=0;j<120;j++);
}
}
/*****************數碼管顯示**********************/
void display1(unsigned char ADC1_PORT)
{
int AD1 = ADC1_PORT * 500.0/255.0;
P2 = 0xFD; P0 = DUAN1[AD1/100]; delay_ms(5); // 位選:P2^1 個位
P2 = 0xFB; P0 = DUAN[(AD1/10)%10]; delay_ms(5); // 位選:P2^2 小數點后一位
P2 = 0xF7; P0 = DUAN[AD1%10]; delay_ms(5); // 位選:P2^3 小數點后兩位
}
/*****************LED顯示**********************/
void display2(unsigned char ADC2_PORT)
{
float AD2 = ADC2_PORT * 1.96;
P2 = 0xFF; // 清屏
switch(LED_JS(AD2))
{
case 1: P0 = 0xff; break;
case 2: P0 = 0xfe; break;
case 3: P0 = 0xfc; break;
case 4: P0 = 0xf8; break;
case 5: P0 = 0xe0; break;
case 6: P0 = 0xc0; break;
case 7: P0 = 0x80; break;
case 8: P0 = 0x00; break;
default:P0 = 0xef;
}
}
/*******************初始化*******************/
void init()
{
ADD_C=0;
ADD_B=1;
ADD_A=1; // 選擇第三通道
CLK=0; //時鐘
START=1; // 內部寄存器清零
EOC=1; // 轉換結束
OE=0; // 使能
TMOD=0x02; // 0000_0010 8位 0~255
TH0=200;
TL0=200; // 裝載初值
EA=1; // 開總中斷
ET0=1; // 開定時器中斷
TR0=1; // 開定時器
}
/****************mAin函數*******************/
void main()
{
init(); // 初始化
while(1)
{
if(KEY == 0) // 檢測到按鍵
{
delay_ms(5); // 防抖
if(KEY == 0)
{
while(!KEY); // 等松手
flag ++; // 加1
flag &= 0x01; // 與0x01相與 保證每次進入flag都為0或1
}
}
if(flag == 0)
{
read_adc();
display1(P3);
OE=0;
}
if(flag == 1)
{
read_adc();
display2(P3);
OE=0;
}
}
}
/****************中斷服務程序*******************/
void TIM0_Serves() interrupt 1 // 用于產生CLK
{
CLK = !CLK;
}
|
-
-
-
01.zip
2020-4-7 17:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
58.42 KB, 下載次數: 53, 下載積分: 黑幣 -5
|