电子DIY小家 发表于 2023-3-29 09:31:32

      
得在好好理解下逻辑的问题,改成这样:

      P2 = SegLED ; //用数组来实现显示
      if(Num > 0)
      {
                Num--;      //循环数自减
      }      
      else
      {
                Num = 9;
      }
      delay_ms(500);   //延时500ms


lclbf 发表于 2023-3-29 10:35:24

你这样可以,我试过。

lclbf 发表于 2023-4-2 14:57:44

第13个程序:定时器
/************************************
1 按下按键,每10ms最末尾数字加1,
再次那些按键停止计数
      
硬件条件:
屠龙刀2022-6-20,自己搭接的四位数码管
P0.1 数码管最低位阳极控制开关,低电平开。
P0.2 数码管次低位阳极控制开关,低电平开。
P0.3 数码管次高位阳极控制开关,低电平开。
P0.4 数码管最高位位阳极控制开关,低电平开。
P2.0-P2.7对应数码管a b c d e f g dp。
P7.5 蜂鸣器控制
*************************************/
#include "stc.h"
#include "usb.h"

#define MAIN_Fosc 24000000UL

#define Beep P75                  //蜂鸣器脚位定义
#define Key1 P32                              //按键1脚位定义
#define Key2 P33                              //按键2脚位定义
#define DELAY 1                     //延时时间宏定义
#define DELAY1s 1000                //延时时间宏定义

u8 SegLED = {
                0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
          0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XFF
};//共阳数码管0-9显示代码,0-9带点显示代码

u8 SegTex = {0X89,0XF1,0XC7,0XA3,0X8C,0XC1,0XCE};//共阳数码管H J L o P U r显示代码
u8 WeiLed = {0XEF,0XF7,0XFB,0XFD,0XF9};//数码管位选控制最高到位到最低位
u8 ShowLed = {1,0,0,0};
//u8 ShowLed = {5,0,9,1};
u8 num = 3;
u32 Scount;                                        //1ms计数
bit RunStats;       //运行状态标志

void sys_init();                //系统初始化
void delay_ms(u16); //延时函数

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令

void LEDsfr()
{
      P0 = WeiLed;                                          //数码管位给P0口
      P2 = SegLED];      //数码管段给P2口

      if(num>0)                                                                              //数码管显示大于0就自减
                num--;
      else
                num = 3;                                                                        //数码管显示等于0就显示3
}      


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()
{      

      sys_init();                              //系统初始化
      usb_init();                        //USB初始化
      Timer0_Init();                //定时器0初始化
      EA = 1;                                          //打开总中断
      
      
      while (1)
      {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();                                                
                }



/*******按下按键,4位数码管每100ms最末尾数字加1,
再次那些按键停止计数      *************/
      
      if(Key1 == 0)                                                 //按键按下
      {               
                delay_ms(10);                                       //延时10ms去抖
                if(Key1 == 0)                     //确认按键按下
                        P75 = 0;                        //按下按键蜂鸣器响
                        delay_ms(10);                     //蜂鸣器响10ms
                        P75 = 1;                                                      //蜂鸣器停止响
//                        while(Key1 == 0);         //按键松开动作
                        if(RunStats==0)                   //运行状态为0
                              Scount = 0;                                        //计数清零
                        RunStats = !RunStats;      //运行状态翻转

                        while(Key1 == 0);                        //按键按下动作
      }
      
      }
}                        

void Timer0_Isr(void) interrupt 1
{
      LEDsfr();                                                                     //数码管刷新
      if(RunStats==1)                                                                //运行状态
      {                                                      
                Scount++;                                                                                 //1ms计数自加
      }
      ShowLed = Scount/10000%10; //数码管显示最高位
      ShowLed = Scount/1000%10;//数码管显示次高位
      ShowLed = Scount/100%10;   //数码管显示次低位
      ShowLed = Scount/10%10;    //数码管显示最低位
      
}


void sys_init()
{
      WTST = 0;                        //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
      EAXFR = 1;                         //扩展寄存器(XFR)访问使能
      CKCON = 0;                         //提高访问XRAM速度

      P0M0 = 0X00;                //P0口设置为准双向口
      P0M1 = 0X00;               
      P1M0 = 0X00;                //P1口设置为准双向口
      P1M1 = 0X00;               
      P2M0 = 0X00;                //P2口设置为准双向口
      P2M1 = 0X00;                        
      P3M0 = 0X00;                //P3口设置为准双向口
      P3M1 = 0X00;               
      P4M0 = 0X00;                //P4口设置为准双向口
      P4M1 = 0X00;               
      P5M0 = 0X00;                //P5口设置为准双向口
      P5M1 = 0X00;               
      P6M0 = 0X00;                //P6口设置为准双向口
      P6M1 = 0X00;               
      P7M0 = 0X00;                //P7口设置为准双向口
      P7M1 = 0X00;      
      
      
      P3M0 &= ~0x03;      //P30P31设置为高阻输入
P3M1 |= 0x03;
      
      //设置USB使用的时钟源
      IRC48MCR = 0x80;    //使能内部48M高速IRC
      while (!(IRC48MCR & 0x01));//等待时钟稳定

      USBCLK = 0x00;      //使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;
}


void delay_ms(u16 ms)
{
      u16 i;
      
      do{
                i = MAIN_Fosc/6000;
                while(--i);
      }while(--ms);
}

程序压缩如附件:

lclbf 发表于 2023-4-2 15:02:34

lclbf 发表于 2023-4-2 14:57
第13个程序:定时器
/************************************
1 按下按键,每10ms最末尾数字加1,

第14个程序:计数器

/************************************
1 转速表
      
硬件条件:
屠龙刀2022-6-20,自己搭接的四位数码管
P0.1 数码管最低位阳极控制开关,低电平开。
P0.2 数码管次低位阳极控制开关,低电平开。
P0.3 数码管次高位阳极控制开关,低电平开。
P0.4 数码管最高位位阳极控制开关,低电平开。
P2.0-P2.7对应数码管a b c d e f g dp。
P7.5 蜂鸣器控制
*************************************/
#include "stc.h"
#include "usb.h"

#define MAIN_Fosc 24000000UL

u8 num = 3;
u32 Count;
u32 Scount;


u8 SegLED = {
                0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
          0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XFF
};//共阳数码管0-9显示代码,0-9带点显示代码

u8 SegTex = {0X89,0XF1,0XC7,0XA3,0X8C,0XC1,0XCE};//共阳数码管H J L o P U r显示代码
u8 WeiLed = {0XEF,0XF7,0XFB,0XFD,0XF9};//数码管位选控制最高到位到最低位
u8 ShowLed = {0,0,0,0};
//u8 ShowLed = {5,0,9,1};


void sys_init();      //系统初始化
void delay_ms(u16);   //延时函数
void LEDsfr();                              //数码管刷新

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令



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()
{      

      sys_init();                              //系统初始化
      usb_init();                   //USB初始化
      Timer0_Init();                //定时器0初始化
      
      TMOD = 0x50;                        //设置计数器模式
      TL1 = 0x00;                              //设置计数初始值
      TH1 = 0x00;                              //设置计数初始值
      TF1 = 0;                                        //清除TF1标志
      TR1 = 1;                                        //定时器1开始计时
      ET1 = 1;                                        //使能定时器1中断
            
      P3PU = 0x20;                         //打开P35内部上拉4.1K
      
      EA = 1;                                                //开总中断
      
      
      while (1)
      {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();                                                
                }
      
      
      }
}                        


void Timer0_Isr(void) interrupt 1
{
      Count++;                                                                        //1ms自加
      if(Count>=1000)                                                                              //1s时间到
      {                                                               
                Count = 0;                                                                                        //清零
                Scount = (TH1*256) + TL1;                              //计数值
                TH1 = 0;
                TL1 = 0;
               
                ShowLed = Scount/1000%10;                //最高为显示
                ShowLed = Scount/100%10;                        //最次高为显示
                ShowLed = Scount/10%10;                        //最次低为显示
                ShowLed = Scount/1%10;                              //最最低为显示
      }
      LEDsfr(); //数码管刷新
}

void Timer1_Isr(void) interrupt 3
{
      
}

void LEDsfr()
{
      P0 = WeiLed;                                                //把数码管位给P0口
      P2 = SegLED];      //把数码管段给P0口

      if(num>0)                                                                              //如果数大余0就减
                num--;
      else                                                                                                //若数减到0就置3
                num = 3;
}      

void sys_init()
{
      WTST = 0;                        //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
      EAXFR = 1;                         //扩展寄存器(XFR)访问使能
      CKCON = 0;                         //提高访问XRAM速度

      P0M0 = 0X00;                //P0口初始化为准双向口
      P0M1 = 0X00;
      P1M0 = 0X00;                //P1口初始化为准双向口
      P1M1 = 0X00;
      P2M0 = 0X00;                //P2口初始化为准双向口
      P2M1 = 0X00;      
      P3M0 = 0X00;                //P3口初始化为准双向口
      P3M1 = 0X00;
      P4M0 = 0X00;                //P4口初始化为准双向口
      P4M1 = 0X00;
      P5M0 = 0X00;                //P5口初始化为准双向口
      P5M1 = 0X00;
      P6M0 = 0X00;                //P6口初始化为准双向口
      P6M1 = 0X00;
      P7M0 = 0X00;                //P7口初始化为准双向口
      P7M1 = 0X00;      
      
      
      P3M0 &= ~0x03;          //P30P31设置为高阻输入
P3M1 |= 0x03;
      
      //设置USB使用的时钟源
      IRC48MCR = 0x80;    //使能内部48M高速IRC
      while (!(IRC48MCR & 0x01));//等待时钟稳定

      USBCLK = 0x00;      //使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;
}


void delay_ms(u16 ms)
{
      u16 i;
      
      do{
                i = MAIN_Fosc/6000;
                while(--i);
      }while(--ms);
}

程序压缩文件如下:

lclbf 发表于 2023-4-2 15:20:33

本帖最后由 lclbf 于 2023-4-2 15:21 编辑

lclbf 发表于 2023-4-2 15:02
第14个程序:计数器

/************************************

第15个程序:多任务处理
    这个视频让我学会了,时间巡回处理问题。
具体程序压缩如下附件:

lclbf 发表于 2023-4-3 09:12:19

本帖最后由 lclbf 于 2023-4-3 10:09 编辑

通过一段时间的学习冲哥视频,收获不少,以前没有对应的开发箱,利用官方免费包邮提供的降龙棍和屠龙刀;
自己搭建一些电路学习。再次感谢STC官方的支持和帮助,官方认为我是真心学习又给我提供了开发箱9.6和仿真线.





现在开始好好利用开发箱,从头再次学习冲哥视频。因为以前硬件不一样,有的程序没有办法实际练习。
后面将每个视频一个楼层。
点灯实验用到的电路如下所示:

P4.0口是LED灯的总开关。低电平Q11导通,SYS_VCC的电压通过Q11加到所有LED的正极,给灯点亮提供第一个条件。
点亮灯的第二个条件是P6口,P6.0-A,P6.1-B,P6.2-C,P6.3-D,P6.4-E,P6.5-F,P6.6-G,P6.7-H,这个P6口也是数码管的段码
控制口,所以官方图纸上面有后缀字母,表示数码管对应的段。当P6口对应的脚输出低电平,对应的LED就点亮。
P6.0_A输出低电平点亮LED4
P6.1_B输出低电平点亮LED11
P6.2_C输出低电平点亮LED12
P6.3_D输出低电平点亮LED13
P6.4_E输出低电平点亮LED14
P6.5_F输出低电平点亮LED15
P6.6_G输出低电平点亮LED16
P6.7_H输出低电平点亮LED17




8H8K64U 发表于 2023-4-3 10:31:42

加油,期待您学成的一天!

lclbf 发表于 2023-4-4 08:48:14

STC8H8K64U 发表于 2023-4-3 10:31
加油,期待您学成的一天!

谢谢鼓励!一定坚持下去!

lclbf 发表于 2023-4-6 09:06:52

本帖最后由 lclbf 于 2023-4-7 08:08 编辑

attach://7229.rarlclbf 发表于 2023-4-3 09:12
通过一段时间的学习冲哥视频,收获不少,以前没有对应的开发箱,利用官方免费包邮提供的降龙棍和屠龙刀;
...
视频第一集:了解单片机,看看视频即可。
第二集:硬件介绍,对应没有硬件基础的多看看,特别是实物和原理图要对应看,学习官方的硬件设计思维,单片机编程要
对硬件结合,必须清楚硬件设计的目的。
第三集:开发环境的搭建和程序下载,这集视频要结合官方数据手册多看,多联系。官方数据手册有我发现有几个版本,一定
要看最新的。视频和手册对于软件的下载方法和下载地址都有提供。破解软件后面附件有压缩包,可以破解到2032年,有需要的可以下载。
第四集:点亮一个LED,1,不用头文件,直接寄存器控制点亮LED。2,USC_HID不断电下载。3,USB_CDC不断电下载。


程序和破解文件压缩包如下:

lclbf 发表于 2023-4-7 16:30:49

本帖最后由 lclbf 于 2023-4-14 14:41 编辑

lclbf 发表于 2023-4-6 09:06
视频第一集:了解单片机,看看视频即可。
第二集:硬件介绍,对应没有硬件基础的多看看,特别是实物和原理 ...
第五集:C语言运算符和进制数入门,这部分是通过打印来学习C语言中关于二进制,十六进制。这是学习单片机常用的两种进制数。
学习本集视频,打印输出是又出现了前面的错误,打印输出显示“7SEGS”;问题原因和处理方法:config.h文件里面宏定义问题(usb.h
里面也有这两个宏定义,注意这里修改是无效的),把打印设置到数码管输出了,前面学习遇到也说了解决办法。但是在学习过程中
初学者要注意:官方的Demo程序中的usb.h、config.h等头文件,不同的Demo里面的内容是不一样的,发现问题按照Keil软件提示多对
比冲哥视频里面的学习程序包里面的对应文件(有的头文件冲哥目前视频没有讲,可能在后面会有讲解)。
下面是要掌握是知识点,来自冲哥教程。








学习程序文件如下面压缩包,里面有详细注解。



页: 1 2 [3] 4 5 6 7 8
查看完整版本: 冲哥视频学习笔记