#include "adc.h"
void Adc_Init()
{
P1M0 = 0x00; //设置P10,P11为ADC口
P1M1 |= 0x03;
ADCTIM = 0x3F; //ADC时序控制寄存器,
// ADCCFG = 0x0F; //ADC控制寄存器.设置ADC转换结果左对齐,ADC工作时钟频率系统时钟/2/16,
ADCCFG = 0x2F; //ADC控制寄存器.设置ADC转换结果右对齐,ADC工作时钟频率系统时钟/2/16,
ADC_CONTR = 0x80; //ADC控制寄存器,0x80打开ADC电源
}
u16 ADC_Read(u8 no) //读取ADC值
{
u16 ADC_Val;
ADC_CONTR &= 0xF0; //清空ADC通道
ADC_CONTR |= no; //选择ADC通道
ADC_CONTR |= 0x40; //启动ADC转换
_nop_();
_nop_();
while(!(ADC_CONTR&0x20)) //等待转换完成
ADC_CONTR &= ~0x20;
// ADC_Val = ADC_RES+ADC_RESL; //左对齐模式读取ADC值
ADC_Val = (ADC_RES<<8)+ADC_RESL; //右对齐模式读取ADC值
return ADC_Val;
}
u16 ADC_CAL_Voltage(u16 num) //计算ADC值对应的电压
{
returnnum*2.5*1000/4096;
}
这是ADC读取函数,想问一下ADC值左移和右移的计算 公式,我上面的为什么读取的值相差那么大.
请高手给看一下.谢谢!
串口通信,正在学习
#include <STC8H.H>
sbit P_COM1 = P3^3; //推挽输出
sbit P_COM2 = P3^4; //推挽输出
sbit P_COM3 = P3^5; //推挽输出
sbit P_SEGA = P2^5; //推挽输出
sbit P_SEGB = P2^7; //推挽输出
sbit P_SEGC = P2^1; //推挽输出
sbit P_SEGD = P2^3; //推挽输出
sbit P_SEGE = P2^4; //推挽输出
sbit P_SEGF = P2^6; //推挽输出
sbit P_SEGG = P2^0; //推挽输出
sbit P_SEGH = P2^2; //推挽输出
unsigned char code t_display[]={
0x40, /* 0 */
0x79, /* 1 */
0x24, /* 2 */
0x30, /* 3 */
0x19, /* 4 */
0x12, /* 5 */
0x02, /* 6 */
0x78, /* 7 */
0x00, /* 8 */
0x10, /* 9 */
0x08, /* 10 */
0x03, /* 11 */
0x46, /* 12 */
0x21, /* 13 */
0x06, /* 14 */
0x0e, /* 15 */
0x3f, /* "-", */
0x7f, /* " " */
};
unsigned char Dis_Index =0;
unsigned char LED_Tmp= {17,17,17};
void SEG_Init()
{
P3M0 |= 0x38; P3M1 &= ~0x38;
P2M0 = 0xff; P2M1 = 0x00;
P_COM1 = 0;
P_COM2 = 0;
P_COM3 = 0;
}
void Display_Scan()
{
P_COM1 = 0;P_COM2 = 0;P_COM3 = 0;
if(++Dis_Index >= 4)
{
Dis_Index = 0;
if(Dis_Index < 3)
{
B = t_display];
P_SEGA = B0; P_SEGB = B1; P_SEGC = B2; P_SEGD = B3;
P_SEGE = B4; P_SEGF = B5; P_SEGG = B6; P_SEGH = B7;
if(Dis_Index == 0) P_COM1 = 1;
else if(Dis_Index == 1) P_COM2 = 1;
else P_COM3 = 1;
}
}
}
#include <STC8H.H>
#include "SEG.H"
unsigned int cnt;
unsigned char sec;
void Timer0_Init(void) //1毫秒@24.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
P_SW2 |=0x80; //访问XSFR
P0M1 = 0; P0M0 = 0;
P1M1 = 0; P1M0 = 0;
P2M1 = 0; P2M0 = 0;
P3M1 = 0; P3M0 = 0;
P4M1 = 0; P4M0 = 0;
P5M1 = 0; P5M0 = 0;
P6M1 = 0; P6M0 = 0;
P7M1 = 0; P7M0 = 0;
SEG_Init();
Timer0_Init();
EA = 1;
while(1)
{
LED_Tmp = sec%10;
LED_Tmp = sec/10%10;
LED_Tmp = sec/100%10;
}
}
void Timer0_Isr(void) interrupt 1
{
Display_Scan();
if(++cnt == 1000)
{
cnt = 0;
sec ++;
if(sec>=150)
sec = 0;
}
}
#include <STC8H.H>
#include "SEG.H"
unsigned int cnt;
unsigned char sec;
void Timer0_Init(void) //1毫秒@24.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
我的数码管显示函数只能显示一位数码管,其它两位不会显示,请大神们帮忙看看
ZIJIN_CHJ 发表于 2026-2-4 08:30
#include
sbit P_COM1 = P3^3; //推挽输出
下面的定时器函数是点错了多发了一个
我是根据梁工的T12控制函数里的数码管显示函数抄来的,为什么我的只显示一位数码管,原程序用的是共阴数码管,我用的是共阳的数码管,所以只把控制引脚和数码管显示的字模改动了.
ZIJIN_CHJ 发表于 2026-2-4 08:39
我是根据梁工的T12控制函数里的数码管显示函数抄来的,为什么我的只显示一位数码管,原程序用的是共阴数码管, ...
看了半天也没看出问题在那里,请大神们帮忙看看.
ZIJIN_CHJ 发表于 2026-2-4 08:41
看了半天也没看出问题在那里,请大神们帮忙看看.
现在可以了,这是正确的函数
//-------------数码管动态扫描函数在定时器中断函数中调用-------------
void Display_Scan()
{
if(++Dis_Index >= 4) //数码管显示的4个时隙
{
Dis_Index = 0;
}
P_COM1 = 0;P_COM2 = 0;P_COM3 = 0; //关闭数码管的位选
if(Dis_Index < 3) //0 - 3 用于数码管的显示扫描
{
B = t_display]; //将数码管要显示的字模给到B寄存器然后在分配给数码管的段控制
P_SEGA = B0; P_SEGB = B1; P_SEGC = B2; P_SEGD = B3;
P_SEGE = B4; P_SEGF = B5; P_SEGG = B6; P_SEGH = B7;
if(Dis_Index == 2) P_SEGH = B_VS_FlashPoint;
if(Dis_Index == 0) P_COM1 = 1; //数码管显示标志为0时,第一位数码管的位使能
else if(Dis_Index == 1) P_COM2 = 1; //数码管显示标志为1时,第二位数码管的位使能
else P_COM3 = 1; //数码管显示标志为2时,第三位数码管的位使能
}
}
ZIJIN_CHJ 发表于 2026-2-4 18:18
现在可以了,这是正确的函数
//-------------数码管动态扫描函数在定时器中断函数中调用-------------
上面我把端口扫描放在了Dis_Index循环语句里面,所以数码管就只能显示一个个位,现在还有一个问题是小数点一直显示,我的数码管用的是7位字模,用8位字模显示不了正确的数字,还没有搞明白.