oce4n
发表于 2024-3-6 14:46:08
第七集 下,展现了按键控制灯的用法,寄存器操作,运算符算法的使用,跟着一步一步做还是比较有成就感的。
oce4n
发表于 2024-3-6 16:03:23
第八集上,蜂鸣器实战
模仿电磁炉功能项目实战还是比较贴近生活,大家都用过电磁炉都能知道要达到什么效果。冲哥写的非常详细,无论原理功能注释非常细心,学起来很清晰。
unsigned char pw_flag=0;//开关机标志位 0关 1开
unsigned char Run_Mode=0; // 模式选择标志位 0-8 0为无模式
void delay1ms(unsigned int k) //延时1ms函数,k等于多少就延时多少ms
{
unsigned int a,b,c,d;
for(d=0;d<k;d++)
for(c=1;c>0;c--)
for(b=50;b>0;b--)
for(a=2;a>0;a--);
}
void Test(void)
{
if(K2==0)
{
delay1ms(10);
if(K2==0)
{
while(K2==0);//按键按下,等待松开
//***************************************未开机执行的操作**********************
if(pw_flag==0)//如果没开机
{
pw_flag =1;//开机标志
Beep=0; //蜂鸣器开
delay1ms(10);
Beep=1; //蜂鸣器关
P1 = 0x00; //自检灯全开
delay1ms(200);
P1 = 0xff; //关灯
}else//开机时候 执行关机
{
pw_flag=0;
Beep=0;
delay1ms(10);
Beep=1;
P1 = 0xff;
Run_Mode=0;
}
}
}
if(pw_flag==1)
{
if(K3==0)
{
delay1ms(10);
if(K3==0)
{
while(K3==0);
Beep=0;
delay1ms(10);
Beep=1;
Run_Mode++;
if(Run_Mode>8)
Run_Mode=1;
P1 = ~(1<<(Run_Mode-1));
}
}
}
}附上部分代码
oce4n
发表于 2024-3-7 09:18:50
跟写了一节课,虽然项目比较简单,但是编写的逻辑没有冲哥那么清晰,好多东西考虑的不全面,加油多向冲哥学习;
void Test(void)
{
if(K2==0)
{
delay1ms(10);
if(K2==0)
{
//***************************************未开机执行的操作**********************
if(pw_flag==0)//如果没开机
{
pw_flag =1;//开机标志
Beep=0; //蜂鸣器开
delay1ms(10);
Beep=1; //蜂鸣器关
P1 = 0x00; //自检灯全开
delay1ms(200);
P1 = 0xff; //关灯
}else//开机时候 执行关机
{
Beep=0;
delay1ms(10);
Beep=1;
P1 = 0xff;
pw_flag=0;
Run_Mode=0;
led_b=0;//运行模式改成停止
}
while(K2==0);//按键按下,等待松开
}
}
if(pw_flag==1)//在开机状态下
{
if(K3==0)//按键3模式选择
{
delay1ms(10);
if(K3==0)
{
if(led_b==0)
{
Beep=0;
delay1ms(10);
Beep=1;
Run_Mode++;
if(Run_Mode>8)//模式大于8
Run_Mode=1; //回到模式一
P1 = ~(1<<(Run_Mode-1));
}while(K3==0);//按键3按下并等待松开
}
}
if(K4==0)//确认,启动
{
delay1ms(10);
if(K4==0)
{
if(Run_Mode>0)
{
Beep=0;
delay1ms(10);
Beep=1;
led_b=!led_b;
}while(K4==0);
}
}
if(led_b==1)
{
P1=0xff;
delay1ms(200);
P1 = ~(1<<(Run_Mode-1));
delay1ms(200);
}
else
{
P1 = ~(1<<(Run_Mode-1));
}
}
}
oce4n
发表于 2024-3-7 10:17:20
第九集 ,认识数码管 有共阴极数码管和共阳极数码管
void main()
{
unsigned char num=0;
while(1)
{
L1=0;
L2=0;
L4=0;
P0=NixieTable;
if(K2==0)
{
Delay1ms(10);
if(K2==0)
{
Beep=0;
Delay1ms(10);
Beep=1;
while(K2==0);//按下等待松开
if(num<9)
{num++;}//数字加
}
}
if(K3==0)
{
Delay1ms(10);
if(K3==0)
{
Beep=0;
Delay1ms(10);
Beep=1;
while(K3==0);
if(num>0)
{num--;}//数字减
}
}
}
}
李鑫发
发表于 2024-3-7 11:12:57
小伙子,加油
oce4n
发表于 2024-3-7 14:41:14
本帖最后由 oce4n 于 2024-3-7 14:52 编辑
第十集 数码管动态控制和原理,
这集逻辑没跟上,看了两遍才跟上,这集不懂的地方是这段算法取个位十位百位
Show_Tab=TimCNT/10000%10;
Show_Tab=TimCNT/1000%10+10;
Show_Tab=TimCNT/100%10;
Show_Tab=TimCNT/10%10;
附上数码管动态显示计时器的代码,好让自己温故而知新
因为我这个小开发板只有四位数码管,所以根据冲哥的思路改动了一下,也是可以实现的。
#include <REGX52.H>
//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
unsigned char Show_Tab={0,0,0,0};
unsigned long TimCNT = 0;//变量计次
unsigned char num=0;
bit Run_Sta = 0;//开始运行标志
sbit L1=P2^4;
sbit L2=P2^5;
sbit L3=P2^6;
sbit L4=P2^7;
sbit K2=P3^4;
sbit K3=P3^5;
sbit Beep=P2^3;
void Delay1ms(unsigned char xms) //@11.0592MHz
{
unsigned char data i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void NiXie(unsigned char i)
{
switch(i){
case 0:
L1=1;L2=0;L3=0;L4=0;break;
case 1:
L1=0;L2=1;L3=0;L4=0;break;
case 2:
L1=0;L2=0;L3=1;L4=0;break;
case 3:
L1=0;L2=0;L3=0;L4=1;break;
}
}
void Show_Fre(void)
{
NiXie(num);
P0=NixieTable];
Delay1ms(1);
num++;
if(num>3)
num=0;
}
void main()
{
while(1)
{
if(Run_Sta==1)
{ TimCNT++;
Show_Tab=TimCNT/10000%10;
Show_Tab=TimCNT/1000%10+10;
Show_Tab=TimCNT/100%10;
Show_Tab=TimCNT/10%10;
}
Show_Fre();
if(K2==0)
{
Delay1ms(10);
if(K2==0)
{
Beep=0;
Delay1ms(10);
Beep=1;
while(K2==0){
Show_Fre();
}
if(Run_Sta==0)
TimCNT=0;
Run_Sta = !Run_Sta;
}
}
}
}
oce4n
发表于 2024-3-7 15:27:54
李鑫发 发表于 2024-3-7 11:12
小伙子,加油
谢谢,我会继续努力的
oce4n
发表于 2024-3-8 14:50:13
第十一集,定时器的作用和意义
定时器是定时器和计数器的统称。
冲哥通过变速车讲解了12分频和不分频原理,举的例子非常贴近生活。冲哥先带我们通过查手册来配置定时器 ,优化了上节课计时器程序。后面用通过我们STC-ISP这个软件来配置自动生成定时器的代码,非常方便,节省了查手册的时间;STC-ISP软件集成的功能太多了,点赞
void Timer0_Init(void) //1毫秒@11.0592MHz
{
// AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA=1;
}
void Timer0_Isr(void) interrupt 1
{
Show_Fre();
if(Run_Sta==1)
{ TimCNT++;
Show_Tab=TimCNT/10000%10;
Show_Tab=TimCNT/1000%10+10;
Show_Tab=TimCNT/100%10;
Show_Tab=TimCNT/10%10;
}
}
最后附上定时器定时1ms的代码,不知道为啥我的stc89c52定时1ms来刷新数码管,数码管在闪烁我就能看见。用延时就没有闪烁;
oce4n
发表于 2024-3-12 10:40:02
第十二集,计数器的作用和定义
通过手册配置计数器1。2017电子设计大赛的题目
涉及M法测速,又叫频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。设编码器单圈总脉冲数为C,时间T0内,统计到的编码器脉冲数为M0,则转速n的计算公式为 n=M0/CT0
主要是配置计数器的过程
soma
发表于 2024-3-12 11:35:51
进来学习下