#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甚至就显示不出来了 |