《8051U深度入门到32位51大型实战教学视频》之学习打卡
第三集已学习,已手敲代码,测试通过学习打卡点灯 8个灯成功点亮 (分号要英文格式,否则编译不通过)
第四集 成功实现USB不停电下载,跟着冲哥步骤 添加库函数、添加USB库文件。
USB库文件操作好之后 注意都勾选 然后 先用普通下载,之后可以实现不停地下载
第五集 C语言基础 ,已手敲代码测试通过
串口发送 选择一致的串口号 否则无法发送接收
运算符的用法
第六集 while()用法,I/O口输入输出 学习打卡 手敲代码
按键输入检测,抖动的解决办法:延时20ms消去抖动if(按键是否按下)
下载软件里的 软件延时计算器方便快捷 ;
注意调用的头文件以免编译出错
第七集 定时器中断 学习手敲代码
任务二灯按下三秒后熄灭
任务3 救护车灯控 灯按下 等交替闪烁再按两个灯熄灭。
用“定时器计算器”的小工具, 右下角的 “使能定时器中断 ”注意要勾选,不然就少了一条语句,按键后无反应的原因。
第八集跟着冲哥学习手敲代码, 用一个定时器实现任务一LED1实现 0.3秒取反一次、 LED2实现 0.6秒取反一次、 LED1实现 0.9秒取反一次
for 和数组的应用
任务2:数组点亮LED,实现流水灯。代码
第九集 数码管 用官方下载软件里的工具窗口里的字库生成工具:
第十一集 矩阵按键 学习手敲代码
第十二集 复位系统 学习手敲代码
硬件复位和软件复位
第十三集 中断系统,已手敲代码,测试通过
当按下外部中断INT1/P33, LED01显示取反
主程序代码:
#include "config.h"
#include "task.h"
#include "io.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay3000ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 17999998UL;
while (i) i--;
}
void main(void)
{
Sys_init();
usb_init();
IE2 |= 0x80;
Timer0_Init();
INT1_Init();
EA = 1;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED);
//WDT_CONTR = 0x24;
while(1)
{
if (bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber);
usb_OUT_done();
}
// Task_Pro_Handler_Callback();
// WDT_CONTR = 0x34; //Çå¿Õ¿´ÃŹ·
P00 = !P00;
Delay3000ms();
//if(P33 == 0)
//P01 = !P01;
}
}
void Timer0_Isr(void) interrupt 1
{
Task_Marks_Handler_Callback();
}
测试视频
代码
第十四集 I/O中断
中断号大于31在Keil 中编译出错的 方法:中断号拓展工具 。下载后解压 安装到Keil 的安装目录里
下载链接:https://www.stcaimcu.com/data/download/Tools/%E6%8B%93%E5%B1%95Keil%E7%9A%84C%E4%BB%A3%E7%A0%81%E4%B8%AD%E6%96%AD%E5%8F%B7.zip
学习手敲代码 测试通过
主程序 代码:增加P3_IO_Init(); // IO中断初始化
io.c 代码:增加
void P3_IO_Init(void)
{
P3IM0 = 0X00; //中断模式设置为下降沿
P3IM1 = 0X00;
P3INTE = 0X08;//打开中断
}
void P3_IO_ISR(void)interrupt 40
{
u8 intf;
intf = P3INTF;
if( intf ) //判断有没有IO出发中断
{
P3INTF = 0;
if(intf & 0x08 )
{
P01 = !P01;
}
}
}
第十五集 定时器做计数器学习手敲代码 测试成功
1.
2. tim.c 代码
#include "tim.h"
u32 Count_T1 = 0;
void TIM1_Count_Init(void)
{
T1_CT = 1;
T1_M1 = 0;
T1_M0 = 0;
T1_GATE = 0;
TH1 = (65536-Count_num)>>8;
TL1 = (65536-Count_num);
P3PU |= 0x20; //内部4.1K上拉电阻打开
TR1 = 1;//启动定时器1
ET1 = 1;//打开定时器外部中断
}
void Timer1_Isr(void) interrupt 3 //1MS执行一次
{
Count_T1 ++;
}
void T1_RunTask(void)
{
u32 count_th_t1 = 0;
count_th_t1 = ((u16)TH1 << 8) + (u16)TL1;
count_th_t1 -= 65526;
SEG7_ShowLong(Count_T1*Count_num+count_th_t1,10);
}
3.完成视频
4.任务二 定时器1 测量INT1引脚低电平脉冲宽度代码
tim.c 代码
#include "tim.h"
u32 Count_T1 = 0;
void Timer1_Isr(void) interrupt 3
{
static u32 count_p33 = 0;
if(P33 == 0)
{
count_p33 ++ ;
}
else
{
if(count_p33 > 0)
{
Count_T1 = count_p33;
}
count_p33 = 0;
}
}
void Timer1_Init(void) //100微秒@24.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x38; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
}
void T1_RunTask(void)
{
//SEG7_ShowLong(Count_T1,10);//显示整数
SEG7_ShowString("%07.01f",((float)Count_T1)/10);
}
打卡 第十六集串口的简单应用
2.
usart.c 代码:
#include "usart.h"
#include "io.h"
u8 Rec_Dat;
u8 Rec_Num = 0;
bitB_TX2_Busy = 0;
void Uart2_Isr(void) interrupt 8
{
if (S2CON & 0x02)
{
S2CON &= ~0x02;
B_TX2_Busy = 0;
}
if (S2CON & 0x01)
{
S2CON &= ~0x01;
Rec_Dat = S2BUF;
}
}
void Uart2_Init(void) //9600bps@24.000MHz
{
P_SW2 |= 0x01; //UART2/USART2: RxD2(P4.6), TxD2(P4.7)
S2CON = 0x50;
AUXR |= 0x04;
T2L = 0x8F;
T2H = 0xFD;
AUXR |= 0x10;
IE2 |= 0x01;
Rec_Num = 0;
B_TX2_Busy = 0;
}
void Uart2_SendStr(u8 *puts)
{
for (; *puts != 0;puts++)
{
S2BUF = *puts;
B_TX2_Busy = 1;
while(B_TX2_Busy);
}
}
void Usart2_RunTask(void)
{
if(Rec_Num >= 6)
{
if((Rec_Dat == '\n') && (Rec_Dat == '\r'))
{
if( (Rec_Dat == 'O') &&(Rec_Dat == 'P') &&(Rec_Dat == 'E') &&(Rec_Dat == 'N') )
{
passward = 16;
passward = 16;
passward = 16;
passward = 16;
Uart2_SendStr( "打开成功\r\n");
}
else if( (Rec_Dat == 'C') &&(Rec_Dat == 'L') &&(Rec_Dat == 'O') &&(Rec_Dat == 'S') &&(Rec_Dat == 'E') )
{
passward = 17;
passward = 17;
passward = 17;
passward = 17;
Uart2_SendStr( "关闭成功\r\n");
}
Rec_Num = 0;
}
}
}
3.串口2发送字符串函数 puts:字符串指针
void Uart2_SendStr(u8 *puts)
{
for (; *puts != 0;puts++) //遇到停止符0结束
{
S2BUF = *puts;
B_TX2_Busy = 1;
while(B_TX2_Busy);
}
}
4.串口2接收成功
页:
[1]