4000是人为设置的,写程序的人考虑的,你问问就可以了,我觉得你设10000也没有什么大碍。
单片机12M晶体,12T模式下计时器加1的时间为1us,所以4000 1us 就是4ms,是先有想得到的定时周期,才有的计数器初值的,不要搞混。

简易数字电压表的设计 可以测量0到5V范围内的8路输入电压值,并在4位LED数码管上轮流显示或单路选择显示
用斩波稳零运算放大器进行前置放大,可以达到001mV的精度,如ICL7650,它在25℃环境下的失调电压是007μV(典型值)。 另外放大电路中的比例电阻也要用高精度低温漂的金属膜或线绕电阻。
单片机怎么设计ADC0832两路电压表
这个题目的内容太过复杂了,但可以给你一个建议:
根据要求,选一个显示位数、精度符合显示要求的数字电压表(这个有现成的很好解决);
在电压表的输入端接一个具有八选一的自动循环及手动控制输出的循环切换器(这是你要求的重点)。
八选一自动循环及手动控制循环切换器组成结构:
振荡器,触发器,继电器(或电子开关)
振荡器输出的频率信号经分频后去触发触发器,其中触发信号的频率可以设定(如2秒一次,或更长的时间一次),触发器共有八只,分别控制八个继电器(这里建议你用继电器,因为继电器的触点电阻值非常小,对检测精度的影响也可以承受,而电子开关的阻值就比较大,有得要达到几个欧姆,对你要求达到的05级的显示精度是肯定不够的)。八个继电器分别接通八路的输入电压,当某个继电器吸合时,该路的电压信号就被接通到电压表并被显示。
在振荡器经分频的触发信号与触发器的连线上设一个开关,当选择振荡器的触发信号回路与触发器联通时,为自动显示;当其断开时就连接到一个按钮开关上,通过按动按钮开关就可步进地选择八路输入电压信号中的其中一路。如果你希望是直接选中某路的电压进行显示,那么这个手动按钮开关就可以不设,在八个继电器线圈的通电回路中各引出一个结点,组成一个可相互锁定的选控回路,即,当选中其中的任何一路时,其他所有的信号回路读被断开。
如果你认为可以的话,就先画一个方框图,然后再把具体的电路补充进去,再作一些优化改进就可以了。
uchar ADC0832_Read(uchar ch)
{
/读取ADC的 CH 通道电压值,ADC作为2路单独电压输入/
uchar i;
uchar ADC_buff=0;
uchar temp=0;
EA = 0;
ADC0832_CS = 1;
ADC0832_DIO = 1; /启动位/
ADC0832_CLK = 0;
ADC0832_CS = 0;
nop();
ADC0832_CLK = 1;
nop();
ADC0832_CLK = 0;
ADC0832_DIO = 1; /送 SGL/DIF 位 /
nop();
ADC0832_CLK = 1;
nop();
ADC0832_CLK = 0;

if(ch==0) ADC0832_DIO = 0; /送转换通道值/
else ADC0832_DIO = 1;
ADC0832_CLK = 1;
nop();
ADC0832_CLK = 0;
nop();
ADC0832_DIO = 1; /释放DIO端口,转由ADC控制/
nop();
ADC0832_CLK = 1;
nop();
for(i=0;i<8;i++){ /准备读取8位数据/
nop();
ADC0832_CLK = 0;
nop();
nop();
ADC_buff=ADC_buff<<1;
if(ADC0832_DIO==1) ADC_buff=ADC_buff+1; /读取数据/
ADC0832_CLK = 1;
}
for(i=0;i<8;i++){
temp = temp>>1;
if(ADC0832_DIO==1) temp = temp | 0x80; /读取校验数据/
ADC0832_CLK = 1;
nop();
ADC0832_CLK = 0;
nop();
}
ADC0832_CS = 1;
ADC0832_CLK = 1;

//if(temp == ADC_buff) ADC_flag = 1;
//else ADC_flag = 0;
EA = 1;
return ADC_buff; /返回转换值/
}


