#include <reg51.h>
sbit CLK= P3^1;
sbit EOC = P3^0;
sbit CS = P2^7;
sbit WRR = P3^6;
sbit RDD = P3^7;
unsigned char code SegmentTable[] =
{
0xC0, // 0
0xf9, // 1
0xa4, // 2
0xb0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xf8, // 7
0x80, // 8
0x90 // 9
};
void delay(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++); // 調整 120 的值以改變延時長度
}
}
void Timer0_Init() {
TMOD = 0x01; // 定時器0,模式1(16位定時模式)
TH0 = 0xFC; // 設置初值高位
TL0 = 0x18; // 設置初值低位
ET0 = 1; // 允許定時器0中斷
EA = 1; // 開啟總中斷
TR0 = 1; // 啟動定時器0
}
void Timer0_ISR() interrupt 1 {
TH0 = 0xFC; // 重置初值高位
TL0 = 0x18; // 重置初值低位
P3 ^= 0x02; // 翻轉P3.1電平(高->低或低->高)
}
void ADC_START()
{
CS = 0;
WRR = 0;
delay(1); // 穩定信號
CS = 0;
WRR = 1; //與非讓START為低電平,不觸發
delay(1);
}
unsigned char ADC_GET()
{
while (EOC == 0); // 等待 EOC = 1,表示轉換完成
delay(5);
RDD = 0;
CS = 0;
delay(5);
return P0; // 返回采樣結果
}
void main()
{
unsigned int Result;
unsigned char digits[3];
unsigned char i;
unsigned char position[]={0x02,0x04,0x08};
Timer0_Init(); // 初始化定時器
CS = 1;
WRR = 1;
while (1)
{
ADC_START();
Result = ADC_GET();
RDD = 1;
CS = 0;
Result = Result*100/51;
digits[0] = Result/100; //最高位
digits[1] = Result%100/10;
digits[2] = Result%100%10; // 小數部分
for(i = 0;i<3;i++)
{
P2 = position[i];
P1 = SegmentTable[digits[i]];
if(i == 0)
{
P1 = P1 -0x80;
}
delay(1);
P2 = 0x00;
}
}
}
現在已經實現功能了,但是數碼管會閃爍
而且delay函數沒法往下調了,j到119甚至就顯示不出來了 |