找回密码
 立即注册
查看: 56|回复: 7

STC8H试验箱学习记录

[复制链接]
  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 96 天

    [LV.6]常住居民II

    11

    主题

    168

    回帖

    542

    积分

    高级会员

    积分
    542
    发表于 2024-5-12 15:48:33 | 显示全部楼层 |阅读模式
    89C51熟悉一遍了,开始学习8H
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 96 天

    [LV.6]常住居民II

    11

    主题

    168

    回帖

    542

    积分

    高级会员

    积分
    542
     楼主| 发表于 2024-5-12 15:51:41 | 显示全部楼层
    先上试验箱图片,感谢STC。
    截图202405121548534302.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 96 天

    [LV.6]常住居民II

    11

    主题

    168

    回帖

    542

    积分

    高级会员

    积分
    542
     楼主| 发表于 2024-5-12 15:59:43 | 显示全部楼层
    本帖最后由 lezjin 于 2024-5-12 16:01 编辑

    #include "../STC8H.h"
    #include "delay.h"

    void main(void)
    {
        unsigned char i;
        P6M0 = 0x00; P6M1 = 0x00;
        P4M0 = 0x00; P4M1 = 0x00;
        P40 = 0;

        while(1)
        {
           for(i = 0; i<8; i++)
           {
               P6 = ~(0x01 << i);
               delay_ms(200);
           }
        }

    先来个流水灯,成功点亮,查看官方例子,用的是数组查表的方法,感觉查表的方法应该比这个运算要快一些。不过点灯的话就无所谓了。

    19ea7fdf7a3f57f19d9a22b968f7fddf.mp4

    1.97 MB, 下载次数: 1

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 96 天

    [LV.6]常住居民II

    11

    主题

    168

    回帖

    542

    积分

    高级会员

    积分
    542
     楼主| 发表于 2024-5-12 16:26:53 | 显示全部楼层
    第二,定时器

    ISP生成的定时器代码中没有开中断,开启EA后不能运行,查看手册和官方例子,ET0没有打开,打开后正常运行。

    void Timer0_Init(void)                //1毫秒@11.0592MHz
    {
            AUXR |= 0x80;                        //定时器时钟1T模式
            TMOD &= 0xF0;                        //设置定时器模式
            TL0 = 0xCD;                                //设置定时初始值
            TH0 = 0xD4;                                //设置定时初始值
            TF0 = 0;                                //清除TF0标志
            TR0 = 1;                                //定时器0开始计时
    }


    #include "../STC8H.h"
    #include "stc8h_timer.h"

    unsigned int count;

    void main(void)
    {
        P6M0 = 0x00; P6M1 = 0x00;
        P4M0 = 0x00; P4M1 = 0x00;
        P40 = 0;
        Timer0_Init();
        ET0 = 1;
        EA = 1;
        while (1)
        {
            if(count >= 1000)      //  1毫秒@11.0592MHz  1000 次为一秒
            {
            count = 0;
            P67 = ~P67;   
            }
        }
    }


    void Time0_ISR() interrupt     TMR0_VECTOR//定时器0中断函数
    {
        count++;
    }

    time0.mp4

    1.37 MB, 下载次数: 1

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 64 天

    [LV.6]常住居民II

    6

    主题

    275

    回帖

    487

    积分

    中级会员

    积分
    487
    发表于 2024-5-12 17:05:20 | 显示全部楼层
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 96 天

    [LV.6]常住居民II

    11

    主题

    168

    回帖

    542

    积分

    高级会员

    积分
    542
     楼主| 发表于 2024-5-12 17:55:53 | 显示全部楼层
    三,数码管

    官方的例子数码管编码取反和位选那里(7-位置)不好理解,容易混淆,既然查表了,还要取反再做其他运算,和流水灯的查表就违背了, 这样流水灯还不如用循环。
    找了个数码管的原理图,重新编码了一下,显示函数逻辑就清晰了。

    #include "../STC8H.h"
    #include "stc8h_timer.h"

    //共阳数码管编码0-16,最后一个位熄灭状态, 高位 dp g f e d c b a 低位
    unsigned char code display_array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
                                        0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};      

    unsigned char code display_we[]={0x7F, 0xbf, 0xdf, 0xef,0xf7, 0xfb, 0xfd, 0xfe};      //位码


    typedef struct
    {
        unsigned char hour;     //时
        unsigned char minute;    //分
        unsigned char second;   //秒
    }Timetype_t;

    Timetype_t Time_count = {23, 59, 57};

    unsigned int g_scanflag;    //刷新时间标志位
    unsigned char g_display_index; //显示位索引
    unsigned char Ledbuff[6];   //显示缓存
    bit g_bms;  //1毫秒标志

    void displayrtc(void)
    {
        if(Time_count.hour >= 10)
        {
            Ledbuff[0] =  Time_count.hour / 10;
        }
        else
          Ledbuff[0] = 16;  //编码数组最后一个,熄灭状态,0xFF  

        Ledbuff[1] = Time_count.hour % 10;
        Ledbuff[2] = Time_count.minute / 10;
        Ledbuff[3] = Time_count.minute % 10;
        Ledbuff[4] = Time_count.second / 10;
        Ledbuff[5] = Time_count.second % 10;
    }


    void rtc (void)
    {
        if (++Time_count.second >= 60)
        {
            Time_count.second = 0;
            if (++Time_count.minute >= 60)
            {
                Time_count.minute = 0;
                if (++Time_count.hour >= 24)
                {
                    Time_count.hour = 0;
                }
            }
        }
    }

    void displayscan(void)
    {
       P7 = display_we[g_display_index];
       P6 = display_array[Ledbuff[g_display_index]];
       g_display_index++;
       g_display_index %= 6;
    }

    void main(void)
    {


        P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
        P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

        Timer0_Init();
        ET0 = 1;
        EA = 1;
      
        rtc();
        displayrtc();


        while (1)
        {
            if(g_bms)
            {
                g_bms = 0;
                if(++g_scanflag >= 1000)    //1秒刷新一次时间
                {
                    g_scanflag = 0;
                    rtc();
                    displayrtc();
                        
                }
            }
        }
    }


    void Time0_ISR(void) interrupt     TMR0_VECTOR//定时器0中断函数
    {
        displayscan();
        g_bms = 1 ;
    }


    截图202405121749466560.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 96 天

    [LV.6]常住居民II

    11

    主题

    168

    回帖

    542

    积分

    高级会员

    积分
    542
     楼主| 发表于 2024-5-12 18:04:54 | 显示全部楼层
    可以跑时间了

    数码管.mp4

    2.58 MB, 下载次数: 1

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 96 天

    [LV.6]常住居民II

    11

    主题

    168

    回帖

    542

    积分

    高级会员

    积分
    542
     楼主| 发表于 2024-5-12 19:52:02 | 显示全部楼层
    四。T0做外部计数器

    我只配置了T0,T1同理就没有配置,试的过程中发现   P3.4,P3.5 不使能内部4.1k上拉电阻,也能用,当然还是参考手册,设置为上拉4.1K电阻。
    同时注意到初始值都设置为0xff,试了下我把低位改成0XFe,测试现象按两次才会才会进入一次中断。

    #include "../STC8H.h"

    void main(void)
    {
        P0M0 = 0x00; P0M1 = 0x00;
        P1M0 = 0x00; P1M1 = 0x00;
        P2M0 = 0x00; P2M1 = 0x00;
        P3M0 = 0x00; P3M1 = 0x00;
        P4M0 = 0x00; P4M1 = 0x00;
        P5M0 = 0x00; P5M1 = 0x00;
        P6M0 = 0x00; P6M1 = 0x00;
        P7M0 = 0x00; P7M1 = 0x00;

        P3PU = 0x30;            //P3.4,P3.5使能内部4.1K上拉电阻
        P40 = 0;
      
              AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD = 0;                        //设置定时器模式
        TL0 = 0xff;                                //设置定时初始值
        TH0 = 0xff;                                //设置定时初始值
        TMOD = 0X04;
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;
      
        INTCLKO &= 0xfe;       //T0不输出时钟

        EA = 1;
        while (1)
        {
          
        }
    }


    void Time0_ISR(void) interrupt     TMR0_VECTOR//定时器0中断函数
    {
        P6= ~P6;
    }



    0XFF.mp4

    1.57 MB, 下载次数: 2

    OXFE.mp4

    1.41 MB, 下载次数: 1

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-14 14:34 , Processed in 0.068629 second(s), 59 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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