千年老姚 发表于 2022-12-22 10:01:43

本帖最后由 千年老姚 于 2023-1-3 17:26 编辑

第六集留下的作业:SOS求救灯光编写三短三长三短(. . . _ _ _ . . .)
感谢姚总对我的实验箱的支持 但是目前实验箱还在路上呢
那就稍微写一下代码大概的思路吧
首先我使用的灯是P6.0,然后根据电路图,P4.0需要低电平,三极管才能打开。
那么答案已经呼之欲出了——只需要P4.0 = 0、P6.0 = 0,delay_ms()翻转实行长和短。
代码如下:(此处省略头文件已经访问速度,Delay.h等部分)
sfr P0 = 0x80;
sfr P0M1 = 0X93;
sfr P0M0 = 0X94; //P0端口操作完成

sfr P4 = 0XC0;
sfr P4M1 = 0XB3;
sfr P4M0 = 0XB4;//P4端口操作完成

sfr P6 = 0XE8;
sfr P6M1 = 0XCB;
sfr P6M0 = 0XCC;//P6端口操作完成
sbit P40 = P4^0; //三极管控制引脚
sbit P60 = P6^0;//led控制引脚
void main()
{
      P0M0=0X00;
      P0M1=0X00;//配置P0为准双向口
      P4M0=0X00;
      P4M1=0X00;//配置P4为准双向口
      P6M0=0X00;
      P6M1=0X00;//配置P6为准双向口
      while(1)      //死循环
       {
                P40 = 0;//三极管引脚输出电平
            /*以下为三短*/
                P60 = 0 ;
                delay_ms(100);
                P60 = 1;
                delay_ms(100);//短
                P60 = 0 ;
                delay_ms(100);
                P60 = 1;
                delay_ms(100);//短
                P60 = 0 ;
                delay_ms(100);
                P60 = 1;
                delay_ms(100);//短
            /*以下为三长*/
                P60 = 0 ;
                delay_ms(1000);
                P60 = 1;
                delay_ms(1000);//长
                P60 = 0 ;
                delay_ms(1000);
                P60 = 1;
                delay_ms(1000);//长
                P60 = 0 ;
                delay_ms(1000);
                P60 = 1;
                delay_ms(1000);//长
               /*以下为三短*/
                P60 = 0 ;
                delay_ms(100);
                P60 = 1;
                delay_ms(100);//短
                P60 = 0 ;
                delay_ms(100);
                P60 = 1;
                delay_ms(100);//短
                P60 = 0 ;
                delay_ms(100);
                P60 = 1;
                delay_ms(100);//短
         
       }
}
/*其实可以写成库函数的形式 但是我还没来得及写*/
总体代码如上 若有错误,请各位指正:lol

神农鼎 发表于 2022-12-22 10:02:29

现在贴图方便了,点击右上方 【高级模式】就可以贴图了

神农鼎 发表于 2022-12-22 11:51:32

对我的实验箱的支持 但是目前实验箱还在路上呢
====幸好昨日实验箱安排了,不知快递收件了没,即使快递收了,给不给你派送也是问题,
你要跟踪下快递单号,安排的同仁也将快递单号发楼上兄弟,跟踪进度

神农鼎 发表于 2022-12-22 12:04:00

客服刚保证: 你的快递优待,预计明天送达,已发单号   

千年老姚 发表于 2022-12-22 16:27:53

本帖最后由 千年老姚 于 2023-1-3 17:31 编辑

各位冬至好!刚才看完了第十和第十一集,以下为简略版笔记
若笔记有误,请各位指正:lol
第七章:按键点灯
一.按键的原理
1.按键的原理:
常开按键/常闭按键——实验箱上都是常开按键
10k上拉,300Ω限流
机械开关会有震动,闭合时不会马上稳定接通,因此在开关瞬间会有一连串的抖动。
二.按键的代码和实现过程
//省略部分代码
#define KEY1 P32 // 定义一个按键,引脚选择P32
#define KEY1 P33 // 定义一个按键,引脚选择P33
.......
/*****按下点亮,松开熄灭******/
if (KEY1== 0) //运算赋值,判断按键是否有被按下
{
Delay_ms(10);
if (KEY1== 0)
{
printf("按键P32已经按下\r\n");
}
}

/***按下熄灭,松开点亮****/
if (KEY2== 0) //运算赋值,判断按键是否有被按下
{
Delay_ms(10);
if (KEY2== 0)
{
printf("按键P33已经按下\r\n");
}
}

三.按键的应用
/*****按下点亮,松开熄灭******/
if (KEY1== 0) //运算赋值,判断按键是否有被按下
{
Delay_ms(10);
if (KEY1== 0)
{
printf("按键P32已经按下\r\n");
P60 = 0;//led0点亮
P40 = 0;
}
}
else//如果没按下
{
P60 = 1;//LED0熄灭
P40 = 0;
}

/***按下熄灭,松开点亮****/
if (KEY2== 0) //运算赋值,判断按键是否有被按下
{
Delay_ms(10);
if (KEY2== 0)
{
printf("按键P33已经按下\r\n");
P40 = 0;
P67 = 1;
}
}
else
{
P67 = 0;
}

/***按键按下一次,led状态改变一次***/
if (KEY2== 0) //运算赋值,判断按键是否有被按下
{
Delay_ms(10);
if (KEY2== 0)
{
printf("按键P33已经按下,LED取反一次\r\n");
P40 = 0;
P67 = !P67;//LED熄灭
//delay_ms(500);//取长延时,但是效果不好。
while(KEY2 == 0)
{

}
}

}
else
{
P67 = 0;
}

//while的位置可以使得按键按下后执行出来的状态不一样,具体要看场景应用

/***按键按下一次,led向左移位***/
if (KEY2== 0) //运算赋值,判断按键是否有被按下
{
Delay_ms(10);
if (KEY2== 0)
{
printf("按键P33已经按下,LED取反一次\r\n");
P40 = 0;
P6 = ((P6<<1)+1);
if (P6 = 0XFF)
P6 =0XFE ;
while(KEY2 == 0) //如果按键一直是按下的,一直执行while
{

}
}
}

另解:
u8 LED_Data = 0xfe
P6 = LED_Data;
if (KEY2== 0) //运算赋值,判断按键是否有被按下
{
Delay_ms(10);
if (KEY2== 0)
{
printf("按键P33已经按下,LED\r\n");
P40 = 0;
LED_Data = ((LED_Data<<1)+1);
if (LED_Data = 0XFF) //本来是直接输出P6,先计算,后输出
LED_Data =0XFE ;

P6=LED_Data
while(KEY2 == 0) //如果按键一直是按下的,一直执行while
{

}
}
}

/*初始状态
1111 1110——111 1110 0——11 1110 00
要想后面不补0——在左移位后+1
1111 1110——1111 1101——1111 1011
问题:后面全熄灭
增加判断语句
1111 1101
1111 1011 */


四.数组的使用
举例:
/***P32按键按下一次,led向右移位***/
P6=0XFE; delay_ms(500);
P6=0XFD; delay_ms(500);
P6=0XFB; delay_ms(500);
P6=0XF7; delay_ms(500);
P6=0XEF; delay_ms(500);
P6=0XDF; delay_ms(500);
P6=0XBF; delay_ms(500);
P6=0X7F; delay_ms(500);
/*1111 11100XFE
1111 1101 0XFD
1111 1011 0XFB
1111 0111 0XF7
1110 1111 0XEF
1101 1111 0XDF
1011 1111 0XBF
0111 1111 0X7F
而用数组,便可以解决以上问题
数组使用分为如下三步:
1.定义
类型 名称[长度] = { 数值 };
2.使用
赋值:名称[索引] = 数值
在void main ()定义
u8_LED_DataTab={0XFE,0XFD,0xFB,0XF7,0XEF,0XDF,0XBF,0X7F};
/***P32按键按下一次,led向右移位***/
P6=LED_DataTab; delay_ms(500);
num++;
if (num>7)
num = 0;//数组实现流水灯
LED_DataTab = 0XFE;
//索引数组 数字-1

总结:
1.学会掌握按键的用法
2.掌握数组
课后练习:按下按键,切换led输出不同的效果。

千年老姚 发表于 2022-12-22 16:29:21

今天学习笔记就到此,最后祝各位冬至快乐!
我是吃汤圆的 你们吃啥的:lol

千年老姚 发表于 2022-12-22 16:34:29

神农鼎 发表于 2022-12-22 11:51
对我的实验箱的支持 但是目前实验箱还在路上呢
====幸好昨日实验箱安排了,不知快递收件了没,即使快递收了 ...

好的!已收到
漳州现在目前疫情态势稳定,应该能准时派送:victory:

神农鼎 发表于 2022-12-22 17:09:11

收到后,咱还是先 点灯大师 开始,上几张图片或视频
https://www.stcaimcu.com/data/attachment/forum/202212/21/083036oh0t0bwo4ts3h0hb.jpg

千年老姚 发表于 2022-12-23 10:26:21

本帖最后由 千年老姚 于 2023-1-3 17:32 编辑

各位早上好!今天是2023考研的最后一天
刚看完了第十二集,以下为今天本人的笔记,有误请各位指出!:lol
祝各位考研学子能够取得好成绩!

第八章:蜂鸣器的应用
1.认识蜂鸣器有源蜂鸣器/无源蜂鸣器区别1、有源蜂鸣器内部带震荡源,所以只要一通电就会叫,而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。2、价格不同,有源蜂鸣器要比无源蜂鸣器贵,贵在里面多了震荡源。主要围绕有源蜂鸣器来开展。2.控制原理根据硬件原理图P54高电平打开,反之关闭
file:///C:/Users/asus/Desktop/%E5%9B%BE%E7%89%871.png尝试:写按钮按下打开蜂鸣器,按钮按下关闭蜂鸣器省略部分代码<div align="left">#define BEEP P54</div><div align="left">......</div><div align="left">void main()</div><div align="left">{</div><div align="left">...</div><div align="left">while(1)</div><div align="left">{</div><p style="text-indent: 2em;">if (KEY1 == 0)</p><p style="text-indent: 2em;">{</p><p style="text-indent: 2em;">delay_ms(10);</p><p style="text-indent: 2em;">if (KEY1 == 0)</p><p style="text-indent: 2em;">{</p><p style="text-indent: 2em;">while      (KEY1 == 0)</p><p style="text-indent: 2em;">BEEP = !BEEP;</p><p style="text-indent: 2em;">}</p><p style="text-indent: 2em;">}</p><div align="left">}</div><div align="left">}</div>
3.蜂鸣器实战运用需求分析:按键*2,LED*8,蜂鸣器*11、按键1按下,蜂鸣10ms,LED1-8全部点亮200ms在熄灭,表示开机。2.开机后,按键2按下,蜂鸣10ms,LED1-8轮流点亮,表示切换煲汤、烧水等功能。3.开机后按键1再次按下,蜂鸣10ms,LED全部熄灭,表示关机。新建test.h和test.ctest.c部分<div align="left">/****省略部分函数声明****/</div><div align="left">bit Run_Flag = 0;   //0-1 开关机变量</div><div align="left">u8 Run_Mode = 0;//0-8 模式几 0:没有模式</div><div align="left">void Test(void)//电磁炉的功能</div><div align="left">{</div><p style="text-indent: 2em;">if (KEY1 == 0)//开关机键</p><p style="text-indent: 2em;">{</p><p style="text-indent: 2em;">delay_ms(10);</p><p style="text-indent: 2em;">if (KEY1 == 0)</p><p style="text-indent: 2em;">{</p><p style="text-indent: 2em;">while      (KEY1 == 0) ; //按钮按下,并等待按钮松开</p><p style="text-indent: 2em;">/**********还没有开机的时候执行这个开机功能************/</p><p style="text-indent: 2em;">if (Run_Flag == 0)//还没开机</p><p style="text-indent: 2em;">{</p><p style="text-indent: 2em;">Run_Flag = 1; //开机变量值为1,表示已经开机</p><p style="text-indent: 2em;">BEEP = 0;   //打开蜂鸣器</p><p style="text-indent: 2em;">delay_ms(10);//延时10ms</p><p style="text-indent: 2em;">BEEP = 1;   //关闭蜂鸣器</p><p style="text-indent: 2em;">P40 = 1;//打开led三极管</p><p style="text-indent: 2em;">P6 = 0X00; //点亮全部LED;</p><p style="text-indent: 2em;">delay_ms(200);//延时200ms</p><p style="text-indent: 2em;">P6 = 0XFF; //熄灭全部LED;</p><p style="text-indent: 2em;">}</p><p style="text-indent: 2em;">/***********已经开机的时候,执行关机功能************/</p><p style="text-indent: 2em;">else</p><p style="text-indent: 2em;">{</p><p style="text-indent: 2em;">Run_Flag = 0;</p><p style="text-indent: 2em;">BEEP = 0;    //打开蜂鸣</p><p style="text-indent: 2em;">delay_ms(10);    //延时10ms</p><p style="text-indent: 2em;">BEEP = 1;   //关闭蜂鸣</p><p style="text-indent: 2em;">P6 = 0XFF;   //熄灭全部LED</p><p style="text-indent: 2em;">Run_Mode = 0; //关机后runmode清零</p><p style="text-indent: 2em;">}</p><p style="text-indent: 2em;">}</p><p style="text-indent: 2em;">}</p>
<p style="text-indent: 2em;">if (KEY2 == 0)</p><p style="text-indent: 2em;">{</p><p style="text-indent: 2em;">delay_ms(10);</p><p style="text-indent: 2em;">if(KEY2 == 0)</p><p style="text-indent: 2em;">{</p><p style="text-indent: 2em;">while(KEY2 == 0); //等待松开执行</p><div align="left">BEEP = 0;    //打开蜂鸣</div><div align="left">delay_ms(10);    //延时10ms</div><div align="left">BEEP = 1;   //关闭蜂鸣</div><p style="text-indent: 2em;">Run_Mode ++ ;//模式自加</p><p style="text-indent: 2em;">if (Run_Mode > 8)//如果模式大于8</p><p style="text-indent: 2em;">Run_Mode =1;//回到模式1</p>
<div align="left">//P6 = 0XFE;P6<<1+1;</div><div align="left">P6 = ^(1<< (Run_Mode-1) )//1<<1   0000 0001需要取反 1111 1110</div><p style="text-indent: 2em;">//8位取反,用的^取反</p><div align="left">}</div><p style="text-indent: 2em;">}</p><div align="left">}</div>
总结:1.了解蜂鸣器怎么使用2.尝试去使用蜂鸣器课后练习:增加按键3,按下后表示启动,选择的对应的功能的LED持续闪烁,表示正在工作,且在工作的时候无法切换功能。
file:///C:/Users/asus/Desktop/%E5%9B%BE%E7%89%872.png


千年老姚 发表于 2022-12-23 10:30:35

第八集补图:
页: 1 2 [3] 4 5
查看完整版本: 接下来我在这个帖子里准备发对冲哥视频做的笔记