电子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软件提示多对
比冲哥视频里面的学习程序包里面的对应文件(有的头文件冲哥目前视频没有讲,可能在后面会有讲解)。
下面是要掌握是知识点,来自冲哥教程。
学习程序文件如下面压缩包,里面有详细注解。