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 () ;
}