scpcw
发表于 2025-2-18 20:17:21
第六集 I/O输入输出
学会了注释批量TAB(按住ALT向下拖鼠标选择)
了解AI8051的常设置参数
EAXFR = 1; //EAXFR(使能(EA Enable )扩展寄存器XFR访问 )XFR(Xtension Function Register 扩展功能寄存器) SFR(Special Function Register特殊功能寄存器)
WTST = 0; //程序读取等待控制寄存器WTST(Wait State)
CKCON = 0; //片内MCU扩展RAM数据总线时钟控制寄存器CKCON (Clock Control)
能把这几个寄存器名字记下最好
#include "ai8051u.h" //调用头文件
//不停电下载模板
#include "stc32_stc8_usb.h" //调用头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
//不停电下载模板
//全局变量-----------------------
//bit lamp1=1;
unsigned char lamp1=0xff;
//-------------------------------
void Delay20ms(void) //@40.000MHz
{
unsigned char data i, j, k;
i = 5;
j = 15;
k = 240;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
EAXFR = 1; //使能(EA Enable )扩展寄存器XFR访问 EAXFRXFR(xtension Function Register 扩展功能寄存器) SFR(Special Function Register特殊功能寄存器)
WTST = 0; //程序读取等待控制寄存器WTST(Wait State)
CKCON = 0; //片内MCU扩展RAM数据总线时钟控制寄存器CKCON (Clock Control)
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
//不停电下载模板
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
EA = 1; //IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
//不停电下载模板
while(1)
{
if (P32 == 0)
{
Delay20ms();
if (P32 == 0 )
{
if(lamp1 != 0) //如果灯不为0,不全亮
{
lamp1=lamp1<<1;
}
else
{
lamp1=0xff;
}
}
while(~P32); //等待松按钮
}
if (P33 == 0) //P33关灯
{
Delay20ms();
if (P33 == 0)
{
lamp1=0xff;
}
}
P2=lamp1; //按值亮灯
//不停电下载模板
if (bUsbOutReady){
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();}
//不停电下载模板
}
}
完成课后作业
scpcw
发表于 2025-2-19 08:14:44
07SEGS...aaa
.07SEGS...aaa
.07SEGS...aaa
.07SEGS...aaa
我的printf("aaa\r\n") ;怎么接收到的前后加了一些字符???
//使用串口“printf”打印信息需屏蔽以下两个定义
//#define PRINTF_SEGLED //printf输出重定向到ISP下载软件中的7段数码管
#define PRINTF_HID //printf输出直接重定向到USB HID接口
找了原因了:两条指令只用打开一条就行了,第一条是数码管用的,第二条是串口用的
scpcw
发表于 2025-2-19 18:55:14
第七集 定时器中断
看了视频,试一下脱离样本编程.
感悟:
之前有固定映象:初始化只能是开机后只能初始化一次,
其实这些设备的寄存器可以随时地,任意地改变.多次初始化就行了.
但是定时器0中断函数只能1个吗? (这个有待确认哪位大神能告诉我一下当然更感激了.)
定时器.mp4
scpcw
发表于 2025-2-19 19:30:44
#include "ai8051u.h" //调用头文件
//不停电下载模板
#include "stc32_stc8_usb.h" //调用头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
//不停电下载模板
//下面是全局变量-----------------------
bit single_double=0;
unsigned char GongDe=0x0;
//下面是函数定义-------------------------------
void Timer0_1S_Init(void); //1秒@40.000MHz
void Timer0_2S_Init(void); //1秒@40.000MHz
void Delay20ms(void) //@40.000MHz
{
unsigned char data i, j, k;
i = 5;
j = 15;
k = 240;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
EAXFR = 1; //使能(EA Enable )扩展寄存器XFR访问 EAXFRXFR(xtension Function Register 扩展功能寄存器) SFR(Special Function Register特殊功能寄存器)
WTST = 0; //程序读取等待控制寄存器WTST(Wait State)
CKCON = 0; //片内MCU扩展RAM数据总线时钟控制寄存器CKCON (Clock Control)
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
//不停电下载模板
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
EA = 1; //IE |= 0X80;
if (DeviceState != DEVSTATE_CONFIGURED)Delay20ms(); //等待USB完成配置
//不停电下载模板
while(1)
{
if (P32 == 0)
{
Delay20ms();
if (P32 == 0 )
{
single_double=~single_double;
if(single_double)
{
printf("双倍功德时间\r\n");
}else{
printf("单倍功德时间\r\n");
}
}
while(~P32); //等待松按钮
}
if (P33 == 0)
{
Delay20ms();
if (P33 == 0)
{
if(single_double) //根据单双功德初始Timer0
{
Timer0_2S_Init();
}else{
Timer0_1S_Init();
}
P20=0; //开灯
GongDe=GongDe+(char)single_double + 1;
printf("功德+%d当前功德:%d\r\n" , 1+(char)single_double , GongDe);
}
while(~P33); //等待松按钮
}
// 不停电下载模板
// if (bUsbOutReady){
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
// printf("测试printf\r\n");
// usb_OUT_done();
// }
// 不停电下载模板
}
}
void Timer0_Isr(void) interrupt 1
{
P20=1;
TR0=0;
}
void Timer0_1S_Init(void) //1秒@40.000MHz
{
TM0PS = 0x32; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xB1; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Timer0_2S_Init(void) //2秒@40.000MHz
{
TM0PS = 0x65; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xB1; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
scpcw
发表于 2025-2-19 19:31:43
有没有大神点评一下上面的代码.学习一下
scpcw
发表于 2025-2-19 20:25:14
这个USB库函数真是大有乾坤.
数码管,LED屏......
有趣!真是有趣!!!!!
stc32_stc8_usb.h里有函数定义.
哪里还有详细讲解呢?
scpcw
发表于 2025-2-19 23:56:02
虚拟数码管详解:
SEG7_ShowString("a%d b%d", (char)single_double+1,GongDe); //用printf的格式化参数
SEG7_ShowLong(GongDe,16); //用16进制显示
SEG7_ShowFloat(3.14159); //显示小数
byte cod
cod = 0x3f|0x80; //或0x80加小数点
cod = 0x06;
cod = 0x5b;
cod = 0x0; //0x00空格
cod = 0x66;
cod = 0x6d;
cod = 0x71;
cod = 0x71;
SEG7_ShowCode(cod); //用段码显示
tianjing818
发表于 2025-2-20 08:26:55
必须点赞
zhaoye818
发表于 2025-2-20 08:35:11
{:qiang:}加油
scpcw
发表于 2025-2-20 09:10:50
zhaoye818 发表于 2025-2-20 08:35
加油
有了大神的肯定,必须加油{:guzhang:}