冲哥8051实验箱-STC32G12K128
本帖最后由 15614423926 于 2023-6-26 08:59 编辑第八集作业:
程序不复杂,但是也调了好久,主要还得是仔细,细心,静下心来,切要浮躁!
void Test(void) //电磁炉的功能
{
/*----------------------------------------------------------------------------*/
if(KEY1 == 0) //开关按键
{
delay_ms(10);
if(KEY1 == 0)
{
while(KEY1 == 0); //按钮按下,并等待按钮松开
/*-------------------------------还没有开机时,执行开机功能--------------------*/
if(Run_Flag == 0) //如果还没开机
{
Run_Flag = 1; //开机变量改为1,表示已经开机
BEEP = 0; //打开蜂鸣器
delay_ms(2000);
BEEP = 1; //关闭蜂鸣器
P2 = 0; //LED全部点亮
delay_ms(500);
P2 = 0xFF; //LED全部关闭
}
/*-------------------------------已经开机时,执行关机功能--------------------*/
else
{
Run_Flag = 0;
BEEP = 0; //打开蜂鸣器
delay_ms(2000);
BEEP = 1; //关闭蜂鸣器
P2 = 0; //LED全部点亮
delay_ms(500);
P2 = 0xFF; //LED全部关闭
Run_Mode = 0; //模式清0
Run_Now = 0; //工作状态清0
}
}
}
/*----------------------------------------------------------------------------*/
if(KEY2 == 0) //功能按键
{
delay_ms(10);
if(KEY2 == 0)
{
while(KEY2 == 0); //按钮按下,并等待按钮松开
/*-------------------------------已经开机时,执行功能跳变--------------------*/
if(Run_Now == 0)
{
BEEP = 0; //打开蜂鸣器
delay_ms(100);
BEEP = 1; //关闭蜂鸣器
Run_Mode++; //模式选择
if(Run_Mode > 8) //如果模式大于8
Run_Mode = 1; //回到模式1
P2 =~(1 << (Run_Mode-1)); //1<<10000 0001 -> 1111 1110
}
}
}
/*--------------------------------功能开始停止执行------------------------*/
if(KEY3 == 0) //功能开始暂停按键
{
delay_ms(10);
if(KEY3 == 0)
{
if(Run_Mode > 0) //已经选择了模式
{
BEEP = 0; //打开蜂鸣器
delay_ms(100);
BEEP = 1; //关闭蜂鸣器
Run_Now = !Run_Now; //运行停止间切换
}
while(KEY3 == 0);
}
delay_ms(10);
}
/*
模式 Run_Mode-1 1 << (Run_Mode-1) ~(1 << (Run_Mode-1))
1 0 0000 0001 1111 1110 FE
2 1 0000 0010 1111 1101 FD
3 2 0000 0100 1111 1011 FB
4 3 0000 1000 1111 0111 F7
5 4 0001 0000 1110 1111 EF
6 5 0010 0000 1101 1111 DF
7 6 0100 0000 1011 1111 BF
8 7 1000 0000 0111 1111 7F
*/
if(Run_Now == 1) //正在运行
{
P2 = 0xFF;
delay_ms(300);
P2 =~(1 << (Run_Mode-1));
delay_ms(300);
}
else //停止运行
{
P2 =~(1 << (Run_Mode-1));
}
}
第九集数码管的静态使用:
主要掌握数字0-9,“.”的表示方法,以及共阴极和共阳极的区别,一般来说,数码管不会用单片机自己的io口去驱动,驱动能力有限,需要三极管的帮助,共阴极用P型三极管,共阳极用N型三极管来驱动。
P67P66P65P64P63P62P61P60十进制16进制
dpgfedcba
011000000192C0
111111001249F9
210100100164A4
310110000176B0
41001100115399
51001001014692
61000001013082
711111000248F8
81000000012880
91001000014490
第十集数码管的动态显示:
需要注意每个延时不能太短,我们这边程序就以1ms为准,且需要保证总共一个循环结束的时间不能大于20ms,因为人眼的视觉不容易分辨出50HZ以上的动态刷新
第十一集定时器的使用:
辅助寄存器:
默认是/12,12分频:
定时器所对应的模式关系:
定时器0定时器1定时器2定时器3定时器4
模式016位自动重载16位自动重载16位自动重载16位自动重载16位自动重载
模式116位不可重载16位不可重载无无无
模式28位自动重载8位自动重载无无无
模式316位自动重载(不可屏蔽)无无无无
波特率发生器
可可可可
模式选择:
开启中断:
允许T0中断:
定时器的计算公式:
其中Sysclk为系统时钟,TMOPS默认为0,为写入的数值,T为分频值,默认为12。
其中,TM0PS,定时器0时钟预分频寄存器默认值为0
经计算,14.5.1的定时器0是0.001s,即1ms
定时器和延时没有关系,在初始化定时器后,会在设定好的时间进入中断函数;
中断频率越低越好;
也可以用STC软件直接生成相关代码。
定时器0中断初始化函数:
中断执行函数:
第十二集计数器的使用:
设置中断为计数模式:
定时器1中断初始化:
做外部计数试验,需要打开内部上拉电阻
若要显示4位十进制,可定义u16类型
M法测速:
M法测速:又叫做频率测量法。
这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。
设编码器单圈总脉冲数为C, 时间T0内,统计到的编码器脉冲数为M0,则转速n的计算公式为:
T法测速:又叫做周期测量法。
这种方法是建立一个已知频率的高频脉冲并对其计数,计数时间由捕获到的编码器相邻两个脉冲的间隔时间TE决定, 计数值为M1。
设编码器单圈总脉冲数为C,高频脉冲的频率为F0,则转速n的计算公式为:
现存问题,外部中断,如何配置IO参数信息!
其中,外部中断引脚已经指定好,不可指定和随意配置
P3.4为T0中断引脚
P3.5为T1中断引脚
第十三集简易多任务处理:
keil5添加预设函数头
templates右键进行添加,增加完成后,需要重新打开程序才会生效
static :
即静态变量。static指修饰符,可以用来修饰变量,也可以用来修饰函数。
如果是在函数外面定义的,那么static说明的变量可以在当前c程序文件中使用。
如果是在函数内部定义的,那么这个变量只初始化一次,即使再次调用这个函数,这个static变量也不会再次被初始化。
bdata:
c51中"bdata"是片内RAM,位寻址方式;存储器类型说明的意思
c51中"bdata"的用法:
C51中的两种位变量,除了特殊功能寄存器中的可位寻址的位外,还有位于单片机内部RAM字节。
地址0x20~0x2F的16个字节的128个可寻址位,位地址从0x00~0x7F。
比如我有一个变量:uchar(unsigned char) BData;
这是一个字节,我可以用:bdata BData=0x00;
然后用:sbit BData_0=BData^0;
sbit BData_1=BData^1;
sbit BData_2=BData^2;
……
就是把字节拆成8个位
楼主,后续学习经验可在此贴跟帖,加油,争取提前送您实验箱 STC爱好者 发表于 2023-5-26 09:33
楼主,后续学习经验可在此贴跟帖,加油,争取提前送您实验箱
ok
页:
[1]