17141200320 发表于 2024-1-4 13:03:27

第9集       数码管静态使用

1、按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管,尾缀A表示共阳,K表示共阴。
   
2、讲解了数码管控制原理

3、数码静态使用部分程序(按键加减,数码管显示相应的数)
u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
   u8 num;
   sys_int();
   usb_init();
   EA=1;
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
          P70=0//开启一个数码管
          P6=SEG_Tab;
          if (KEY1==0)   //KEY1按下是按键加数
          {
            delay_ms(10);
            if (KEY1==0)
               {
                  while(KEY1==0);
                  if(num<9)
                  {   
                     num++;
                   }
                  }
          }   
                     
          if (KEY2==0) //KEY2按键按下减数
          {
            delay_ms(10);
            if (KEY2==0)
               {
                  while(KEY2==0);
                  if(num>0)
                  {   
                     num--;
                   }
                  }
          }   
   }
}








}

17141200320 发表于 2024-1-4 13:03:27

第9集       数码管静态使用

1、按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管,尾缀A表示共阳,K表示共阴。
   
2、讲解了数码管控制原理

3、数码静态使用部分程序(按键加减,数码管显示相应的数)
u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
   u8 num;
   sys_int();
   usb_init();
   EA=1;
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
          P70=0//开启一个数码管
          P6=SEG_Tab;
          if (KEY1==0)   //KEY1按下是按键加数
          {
            delay_ms(10);
            if (KEY1==0)
               {
                  while(KEY1==0);
                  if(num<9)
                  {   
                     num++;
                   }
                  }
          }   
                     
          if (KEY2==0) //KEY2按键按下减数
          {
            delay_ms(10);
            if (KEY2==0)
               {
                  while(KEY2==0);
                  if(num>0)
                  {   
                     num--;
                   }
                  }
          }   
   }
}








}

17141200320 发表于 2024-1-4 13:03:27

第9集       数码管静态使用

1、按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管,尾缀A表示共阳,K表示共阴。
   
2、讲解了数码管控制原理

3、数码静态使用部分程序(按键加减,数码管显示相应的数)
u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
   u8 num;
   sys_int();
   usb_init();
   EA=1;
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
          P70=0//开启一个数码管
          P6=SEG_Tab;
          if (KEY1==0)   //KEY1按下是按键加数
          {
            delay_ms(10);
            if (KEY1==0)
               {
                  while(KEY1==0);
                  if(num<9)
                  {   
                     num++;
                   }
                  }
          }   
                     
          if (KEY2==0) //KEY2按键按下减数
          {
            delay_ms(10);
            if (KEY2==0)
               {
                  while(KEY2==0);
                  if(num>0)
                  {   
                     num--;
                   }
                  }
          }   
   }
}








}

17141200320 发表于 2024-1-5 08:00:52

第10集数码管动态显示

1、讲了8位数码管控制原理。写程序时注意要点,数码管刷新8位需要时间不大于20ms,因为人眼的视觉不容易分辨出50HZ以上的动态刷新。
2、在第9集基础上新增调用数组选择位码

数码管从第一位显示1至第8位显示8的动态刷新部分程序
u8 num;

u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码值
u8 COM_Tab={ 0X7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码

void main()
{
   u8 num;
   sys_int();
   usb_init();
   EA=1;
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
          P70=COM_Tab;
          P6=SEG_Tab;
          delay_ms(1);
          num++;
          if(num>7)
            num=0;
      
   }
   }   
                  
简易10秒免单计数器



17141200320 发表于 2024-1-5 08:43:17

第10集数码管动态显示

1、讲了8位数码管控制原理。写程序时注意要点,数码管刷新8位需要时间不大于20ms,因为人眼的视觉不容易分辨出50HZ以上的动态刷新。
2、在第9集基础上新增调用数组选择位码

数码管从第一位显示1至第8位显示8的动态刷新部分程序
   u8 num;u8 num;

u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码值
u8 COM_Tab={ 0X7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码

void main()
{
   sys_int();
   usb_init();
   EA=1;
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
          P70=COM_Tab;
          P6=SEG_Tab;
          delay_ms(1);
          num++;
          if(num>7)
            num=0;
      
   }
   }   
                  
简易10秒免单计数器

   u8 num;u8 num;

u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码值
u8 COM_Tab={ 0X7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码
u8 Show_Tab={ 0,0,0,0,0,0,0,0 };
u32 TimCount=0;//计数单位1ms
bit   RUN_State=0;//K
void main()
{
   sys_int();
   usb_init();
   EA=1;
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
      
         Show_Tab=1; //选择1
         Show_Tab=10; //选择0.
         Show_Tab=0; //选择0
         Show_Tab=0;//选择0
         
          P70=COM_Tab;
          P6=SEG_Tab];
          delay_ms(1);
          if( RUN_State ==1 )
          {
            TimCount++;
             Show_Tab=TimCount/10000%10;
             Show_Tab=TimCount/1000%10+10;//x显示小数点和千位
             Show_Tab=TimCount/100%10;//取百位
             Show_Tab=TimCount/10%10;//取十位

    }

          num++;
          if(num>7)
            num=0;

          if(KEY1==0)
          {
         delay_ms(10);
             if(KEY1==0)
             {
               BEEP=0;
               delay_ms(10);
               BEEP=0;
               while(kEY1==0)
               {
                      P70=COM_Tab;
                      P6=SEG_Tab];
                     delay_ms(1);
                     num++;
                     if(num>7)
                     num=0;   
                  }
               if( RUN_State ==0)
               TimCount=0;
   
               RUN_State= ! RUN_State;
               
               }


          }
      
   }
   }   
      



小涵子爸爸 发表于 2024-1-5 09:24:03

又见点灯

17141200320 发表于 2024-1-6 09:50:23

第十一集定时器的使用

1、定时器是定时器和计数器的统称。
    1.1、设置为定时器时,可实现硬件计时,或使程序每隔一固定时间完成一项操作。
    1.2、设置为计数器时候能够对脉冲进行计数。
    1.3、替代长时间的delay,提高CPU的运行效率和处理速度,能及时响应某个事件。
2、stc32G单片机定时器使用原理
    2.1先设置功能为定时器/计数器(本质都是加法计数器)   

    STC32G系列单片机内部设置了5个24位定时器/计数器(8位预分频+16位计数)。5个16位定时TO、TI、T2、T3和T4都具有计数方式和定时方式两种工作方式。

对定时器/计数器TO和TI,用它们在特殊功能寄存器TMOD中相对应的控制位C/T来选择TO或T1为定时器还是计数器。对定时器/计数器T2,用特殊功能寄存器AUXR中的控制位T2 C/T来选择T2为定时器还是计数器。对定时器/计数器T3,用特殊功能寄存器T4T3M中的控制位T3_C/T来选择T3为定时器还是计数器。对定时器/计数器T4,用特殊功能寄存器T4T3M中的控制位T4_C/T来选择T4为定时器还是计数器。定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。
只是计数脉冲来源不同:如果计数脉冲来自系统
时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1:如果计数脉冲来自单片机外部引脚,则为计数方式,每来一个脉冲加1。
2.2、如果在定时器模式,设置不分频或者12分频
      当定时器/计数器TO、T1及T2工作在定时模式时,特殊功能寄存器 AUXR中的T0x12、T1x12和T2x12 分别决定是系统时钟/12还是系统时钟/1(不分频)后让TO、TI和T2进行计数。当定时器/计数器 T3和T4 工作在定时模式时,特殊功能寄存器T4T3M中的T3x12和T4x12分别决定是系统时钟/12还是系统时钟/1(不分频)后让T3和T4进行计数。当定时器/计数器工作在计数模式时,对外部脉冲计数不分频。
定时方式◇此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1:



2.3定时器的工作模式
操作特殊功能寄存器TMOD位


2.4定时器设置
   定时器0/1控制寄存器(TCON)



2.5中断使能寄存器IE(中断允许位)



2.6定时器0模式0(16位自动重装载模式)



=65536-(Sysclk(hz)*定时时间(s))/T*(TM0PS+1)
2.7定时器程序举例应用
简易10秒免单采用定时方式计数器部分程序

   u8 num;u8 num;

u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码值
u8 COM_Tab={ 0X7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码
u8 Show_Tab={ 0,0,0,0,0,0,0,0 };
u32 TimCount=0;//计数单位1ms
bit   RUN_State=0;//K
void SEG_Fre (void)
{
   P70=COM_Tab;
   P6=SEG_Tab];
num++;
if(num>7)
num=0;   
}


void main()
{
   sys_int();
   usb_init();
    TMOD=0X00;//设置定时器0为16位自动重装模式
    TL0=0X30;   //计算出的24Mhz时钟下的1ms的定时时间初值
    TH0=0XF8;
    TR0 = 1;      //启动定时器
    ET0 = 1;      //使能定时器中断
    EA = 1;      //cpu开放中断,打开总中断
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
      
         Show_Tab=1; //选择1
         Show_Tab=10; //选择0.
         Show_Tab=0; //选择0
         Show_Tab=0;//选择0
         SEG_Fre () ;//数码管刷新
         
          if(KEY1==0)
          {
         delay_ms(10);
             if(KEY1==0)
             {
               BEEP=0;
               delay_ms(10);
               BEEP=0;
               while(kEY1==0);
                if( RUN_State ==0)
               TimCount=0;
               RUN_State= ! RUN_State;
               
               }
          }   
   }
   }


void Timer_Isr() interrupt1       //1ms执行1次
{
SEG_Fre () ;
if( RUN_State ==1 )
          {
            TimCount++;
             Show_Tab=TimCount/10000%10;
             Show_Tab=TimCount/1000%10+10;//x显示小数点和千位
             Show_Tab=TimCount/100%10;//取百位
             Show_Tab=TimCount/10%10;//取十位

            }

}

17141200320 发表于 2024-1-6 15:21:10


第12集计数器的应用

1、计数器的用途
    如电机测速、按键检查、流量计频率等
2、计数器的配置




计数器设置
T1_C/T=1;//计数模式
T1_GATE=0;

举例


电机测试部分程序

2.7定时器程序举例应用
#defineMAIN_Fosc    24000000UL//定义主时钟
char *USER_DEVICEDESC =NULL;
char*USER_PRODUCTDESC =NULL;
char*USER_STCISPCMD =" @STCISR# ";

u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x78,0x00,0x10,0xff};//段码值
u8 COM_Tab={ 0X7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码
u8 Show_Tab={ 20,20,20,20,0,0,0,0 };
u32 TimCount=0;//计数单位1ms

u16 Count_T1 =0;
   u8 num =0;
bit   RUN_State=0;//K
voidsys_init();
voiddelay_ms(u16 ms);

void SEG_Fre (void)
{
   P70=COM_Tab;
   P6=SEG_Tab];
num++;
if(num>7)
num=0;   
}
void Timer0_Init(void )//1毫秒@24.000MHZ
{
AUXR & = 0X7F;
TMOD & = 0XF0;
TL0= 0X30;
TH0 = 0XF8;
TF0 = 0;
TR0 = 1;
ET0 = 1;
}


void main()
{
   sys_int();
   usb_init();
    TMOD=0X40;//设置定时器1为16位自动重装模式
    TL1=0X00;   //计算出的24Mhz时钟下的1ms的定时时间初值
    TH1=0X00;
    TF1 = 0;
    TR1 = 1;      //启动定时器
    ET1 = 1;      //使能定时器中断
    P3PU = 0X20;   //打开内部上拉电阻
    Timer0_Init();
    P40 = 0;//LED的电源控制三级管打开
    EA = 1;      //cpu开放中断,打开总中断
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
   }
}
void Timer1_Isr() interrupt3

    P60 = !P60;//LED取反


void Timer0_Isr() interrupt1       //1ms执行1次
{
    TimCount++;
   if( TimCount>=2000)
       {
             TimCount = 0;
             Count_t1 = (TH1X256)+TL1;
            TH1=0;
            TL1=0;
             Show_Tab=TimCount/1000%10;
             Show_Tab=TimCount/100%10+10;
             Show_Tab=TimCount/10%10;//取十位
             Show_Tab=TimCount/1%10;//取个位
         }
         SEG_Fre () ;
}

17141200320 发表于 2024-1-6 15:21:10


第12集计数器的应用

1、计数器的用途
    如电机测速、按键检查、流量计频率等
2、计数器的配置




计数器设置
T1_C/T=1;//计数模式
T1_GATE=0;

举例


电机测试部分程序

2.7定时器程序举例应用
#defineMAIN_Fosc    24000000UL//定义主时钟
char *USER_DEVICEDESC =NULL;
char*USER_PRODUCTDESC =NULL;
char*USER_STCISPCMD =" @STCISR# ";

u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x78,0x00,0x10,0xff};//段码值
u8 COM_Tab={ 0X7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码
u8 Show_Tab={ 20,20,20,20,0,0,0,0 };
u32 TimCount=0;//计数单位1ms

u16 Count_T1 =0;
   u8 num =0;
bit   RUN_State=0;//K
voidsys_init();
voiddelay_ms(u16 ms);

void SEG_Fre (void)
{
   P70=COM_Tab;
   P6=SEG_Tab];
num++;
if(num>7)
num=0;   
}
void Timer0_Init(void )//1毫秒@24.000MHZ
{
AUXR & = 0X7F;
TMOD & = 0XF0;
TL0= 0X30;
TH0 = 0XF8;
TF0 = 0;
TR0 = 1;
ET0 = 1;
}


void main()
{
   sys_int();
   usb_init();
    TMOD=0X40;//设置定时器1为16位自动重装模式
    TL1=0X00;   //计算出的24Mhz时钟下的1ms的定时时间初值
    TH1=0X00;
    TF1 = 0;
    TR1 = 1;      //启动定时器
    ET1 = 1;      //使能定时器中断
    P3PU = 0X20;   //打开内部上拉电阻
    Timer0_Init();
    P40 = 0;//LED的电源控制三级管打开
    EA = 1;      //cpu开放中断,打开总中断
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
   }
}
void Timer1_Isr() interrupt3

    P60 = !P60;//LED取反


void Timer0_Isr() interrupt1       //1ms执行1次
{
    TimCount++;
   if( TimCount>=2000)
       {
             TimCount = 0;
             Count_t1 = (TH1X256)+TL1;
            TH1=0;
            TL1=0;
             Show_Tab=TimCount/1000%10;
             Show_Tab=TimCount/100%10+10;
             Show_Tab=TimCount/10%10;//取十位
             Show_Tab=TimCount/1%10;//取个位
         }
         SEG_Fre () ;
}

17141200320 发表于 2024-1-6 15:22:58

本帖最后由 17141200320 于 2024-1-6 15:57 编辑

第12集计数器的应用

1、计数器的用途
    如电机测速、按键检查、流量计频率等
2、计数器的配置





计数器设置
T1_C/T=1;//计数模式
T1_GATE=0;

举例


电机测试部分程序
#defineMAIN_Fosc    24000000UL//定义主时钟
char *USER_DEVICEDESC =NULL;
char*USER_PRODUCTDESC =NULL;
char*USER_STCISPCMD =" @STCISR# ";

u8 SEG_Tab={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x78,0x00,0x10,0xff};//段码值
u8 COM_Tab={ 0X7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位码
u8 Show_Tab={ 20,20,20,20,0,0,0,0 };
u32 TimCount=0;//计数单位1ms

u16 Count_T1 =0;
   u8 num =0;
bit   RUN_State=0;//K
voidsys_init();
voiddelay_ms(u16 ms);

void SEG_Fre (void)
{
   P70=COM_Tab;
   P6=SEG_Tab];
num++;
if(num>7)
num=0;   
}
void Timer0_Init(void )//1毫秒@24.000MHZ
{
AUXR & = 0X7F;
TMOD & = 0XF0;
TL0= 0X30;
TH0 = 0XF8;
TF0 = 0;
TR0 = 1;
ET0 = 1;
}


void main()
{
   sys_int();
   usb_init();
    TMOD=0X40;//设置定时器1为16位自动重装模式
    TL1=0X00;   //计算出的24Mhz时钟下的1ms的定时时间初值
    TH1=0X00;
    TF1 = 0;
    TR1 = 1;      //启动定时器
    ET1 = 1;      //使能定时器中断
    P3PU = 0X20;   //打开内部上拉电阻
    Timer0_Init();
    P40 = 0;//LED的电源控制三级管打开
    EA = 1;      //cpu开放中断,打开总中断
   while(1)
    {
      if ( DeviceState != DEVSTATE_CONFIGURED )
          Continue;
      if(bUsboutREADY)
         {
            usb_out_done();
          }
   }
}
void Timer1_Isr() interrupt3

    P60 = !P60;//LED取反


void Timer0_Isr() interrupt1       //1ms执行1次
{
    TimCount++;
   if( TimCount>=2000)
       {
             TimCount = 0;
             Count_t1 = (TH1X256)+TL1;
            TH1=0;
            TL1=0;
             Show_Tab=TimCount/1000%10;
             Show_Tab=TimCount/100%10+10;
             Show_Tab=TimCount/10%10;//取十位
             Show_Tab=TimCount/1%10;//取个位
         }
         SEG_Fre () ;
}


页: 1 [2] 3
查看完整版本: 【已送实验箱】LED点灯学习