乐高
发表于 2025-1-20 22:03:26
乐高 发表于 2025-1-20 17:37
第十一集 矩阵键盘 课后小练
看到了,我已经不是第一个了。有人已经捷足先登了。
LXC0011
发表于 2025-1-20 22:07:24
#include"ai8051u.h"
#include"stc32_stc8_usb.h" //调用头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80;
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 接口配置
EA=1;
IE2|=0x80;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P40=0;
P00=0;
}
}
USB不停电下载程序,可以减少断电下载程序的作用。
蓝鹰
发表于 2025-1-21 11:07:20
{:4_250:}
dyx811
发表于 2025-1-21 11:58:55
看到更新13集啦,好开心!
LXC0011
发表于 2025-1-21 21:13:26
C语言基础,需要注意数据类型,不要超出范围,以及学习各个运算符号。
#include"ai8051u.h"
#include"stc32_stc8_usb.h" //调用头文件
#define u8 unsigned char //8位无符号数 0-255
#define u16 unsigned int //16位无符号数 0-65535
u8 X = 20;
u8 Y = 10;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80;
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 接口配置
EA=1;
IE2|=0x80;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
if(X>Y)
{
PRINTF("条件为真");
}
else
{
PRINTF("条件为假");
}
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
// printf("X/Y=%u\r\n",(u16)(X/Y));
// printf("X%%Y=%u\r\n",(u16)(X%Y));
//usb_OUT_done();
}
P40=0;
P00=0;
}
}
LXC0011
发表于 2025-1-21 22:21:19
I/O输入、输出,注意电气方面硬件的电路电压不要弄错;
按键程序注意消抖,
单片机执行速度很快,要注意某些程序会多次执行。特别是根据按键输入的情况。
练习代码如下
#include"ai8051u.h"
#include"stc32_stc8_usb.h" //调用头文件
#include"intrins.h"
#define u8 unsigned char //8位无符号数 0-255
#define u16 unsigned int //16位无符号数 0-65535
u8 state=0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void main(void)
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
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 接口配置
EA=1;
IE2|=0x80;
P40=0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
// printf("X/Y=%u\r\n",(u16)(X/Y));
// printf("X%%Y=%u\r\n",(u16)(X%Y));
usb_OUT_done();
}
//按下P32灯亮,松开灯灭
// if(P32==0)
// {
// P00=0;
// }
// else
// {
// P00=1;
// }
if(P32==0)
{
Delay20ms();
if(P32==0)
{
state=!state;
P00=state;
while(P32=0);
}
}
}
}
LXC0011
发表于 2025-1-21 23:44:17
定时器设计注意,时钟周期的设置,相比经典8051单片机多了一些寄存器。算法有一些区别,但定时时间可以更长;
注意需要精确定时时,还需自己计算一下时间,可能有误差,可以再手动增加一下空操作,让定时更准一些。
代码如下
#include"ai8051u.h"
#include"stc32_stc8_usb.h" //调用头文件
#include"intrins.h"
#define u8 unsigned char //8位无符号数 0-255
#define u16 unsigned int //16位无符号数 0-65535
u8 state=0;
u8 Run_state=0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void Timer0_Init(void) //3秒@24.000MHz
{
TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x3F; //设置定时初始值
TH0 = 0x01; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
int count=1;
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
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 接口配置
EA=1;
IE2|=0x80;
Timer0_Init(); //定时器初始化
P40=0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
// printf("X/Y=%u\r\n",(u16)(X/Y));
// printf("X%%Y=%u\r\n",(u16)(X%Y));
usb_OUT_done();
}
// if(P32==0)
// {
// Delay20ms();
// if(P32==0)
// {
// printf("按键按键次数\xfd:%d 次\r\n",(int)count);
// count++;
// while(P32=0);
// }
// }
// //任务2
// if(P32==0)
// {
// Delay20ms();
// if(P32==0)
// {
// //printf("按键按键次数\xfd:%d 次\r\n",(int)count);
// //count++;
// P00=0;
//
//
//
// while(P32=0);
// }
// }
//任务3
if(P32==0)
{
Delay20ms();
if(P32==0)
{
//printf("按键按键次数\xfd:%d 次\r\n",(int)count);
//count++;
Run_state=!Run_state;
if(Run_state=1)
{
Timer0_Init();
}
else
{
TR0=0;
P00=1;
P01=1;
}
while(P32=0);
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
state=!state;
// P00=state;
P00=state;
P01=!state;
//TR0 = 0; //关闭定时器
}
LXC0011
发表于 2025-1-21 23:53:54
AI8051U外设确实比较强,价格也便宜,关键是国产的,必须支持;
外部触发中断方式也增强了不少,上升沿;下降沿均可触发;
单片机,运行速度够快
xiaoxia9623
发表于 2025-1-22 00:30:08
为什么没有上升沿中断和高电平中断,低电平中断了???
xiaoxia9623
发表于 2025-1-22 00:30:49
需要用到上升沿中断怎么处理啊??