找回密码
 立即注册
楼主: 曹会杰

擎天柱 核心板学习打卡

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-1-5 13:23:50 | 显示全部楼层
#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值对应的电压
{
        return  num*2.5*1000/4096;
}

这是ADC读取函数,想问一下ADC值左移和右移的计算 公式,我上面的为什么读取的值相差那么大.

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-1-5 13:24:58 | 显示全部楼层
请高手给看一下.谢谢!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-1-7 15:25:38 | 显示全部楼层
Screenshot 2026-01-07 152222.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-1-15 13:45:20 | 显示全部楼层
串口通信,正在学习

屏幕截图 2026-01-15 133656.png

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-2-4 08:30:32 | 显示全部楼层
#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[3]= {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[LED_Tmp[Dis_Index]];
                        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[0] = sec%10;
                LED_Tmp[1] = sec/10%10;
                LED_Tmp[2] = 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中断
}

我的数码管显示函数只能显示一位数码管,其它两位不会显示,请大神们帮忙看看
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-2-4 08:33:10 | 显示全部楼层
ZIJIN*** 发表于 2026-2-4 08:30
#include

sbit        P_COM1 = P3^3;        //推挽输出

下面的定时器函数是点错了多发了一个
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-2-4 08:39:28 | 显示全部楼层
我是根据梁工的T12控制函数里的数码管显示函数抄来的,为什么我的只显示一位数码管,原程序用的是共阴数码管,我用的是共阳的数码管,所以只把控制引脚和数码管显示的字模改动了.
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-2-4 08:41:35 | 显示全部楼层
ZIJIN*** 发表于 2026-2-4 08:39
我是根据梁工的T12控制函数里的数码管显示函数抄来的,为什么我的只显示一位数码管,原程序用的是共阴数码管, ...

看了半天也没看出问题在那里,请大神们帮忙看看.
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-2-4 18:18:47 | 显示全部楼层
ZIJIN*** 发表于 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[LED_Tmp[Dis_Index]];        //将数码管要显示的字模给到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时,第三位数码管的位使能
                }
       
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2026-03-31 10:56:10
已绑定手机

6

主题

144

回帖

1138

积分

金牌会员

积分
1138
发表于 2026-2-4 18:28:46 | 显示全部楼层
ZIJIN*** 发表于 2026-2-4 18:18
现在可以了,这是正确的函数

//-------------数码管动态扫描函数在定时器中断函数中调用-------------

上面我把端口扫描放在了Dis_Index循环语句里面,所以数码管就只能显示一个个位,现在还有一个问题是小数点一直显示,我的数码管用的是7位字模,用8位字模显示不了正确的数字,还没有搞明白.
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-31 20:20 , Processed in 0.113077 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表