| 
				打卡等级:以坛为家II打卡总天数:485最近打卡:2025-10-31 07:55:24 金牌会员 
 
 
	积分1418 
 | 
 
| 本帖最后由 lclbf 于 2023-5-24 11:16 编辑 
 首先感谢STC官网免费提供学习视频。发个帖子的目的:主要是借官方网站保存自己学习记录,再是自己学习遇到的问题,
 写出来,避免下次出同样的错误,也给同样的初学者出现同样的问题,提供解决的办法。后面有对应程序的压缩文件。
 
 很多图片来自官方数据手册和冲哥讲义文档,再次感谢!!!
 
 第1个程序:用寄存器点亮一个灯。
 
 实验程序如下:
 
 /**屠龙刀2022-6-20版***/
 
 sfr P2   = 0XA0;//用到的P2口相关寄存器设置
 sfr P2M0 = 0X96;
 sfr P2M1 = 0X95;
 
 sbit P21 = P2^1;
 
 void main()
 {
 P2M0 = 0X00;//P2口初始化为准双向口
 P2M1 = 0X00;
 
 while(1)
 {
 P21 = 0;//P21口输出低电平,点亮LED,
 }
 }
 
 
 第2个程序:流水灯
 
 实验程序如下:
 
 /**屠龙刀2022-6-20版***/
 
 #include "STC32G.h"
 
 unsigned char cnt = 0;
 
 bit flag = 0; //流水标志
 
 void Delay100ms();
 
 void main()
 {
 static unsigned char temp = 0x01;
 unsigned char i;
 
 P2M0 = 0X00;//P2口初始化为准双向口
 P2M1 = 0X00;
 
 while(1)
 {
 //                /************方法1 左右流水灯***********/
 //                P2 = ~temp;
 //                temp = temp<<1;
 //
 //                if(temp == 0X70)
 //                {
 //                        temp = 0X01;
 //                }
 //                Delay100ms();
 //
 //                if(flag==0)
 //                {
 //                        P2 = ~(0x01<<cnt);
 //                Delay100ms();
 //                cnt++;
 //                if(cnt>=8)
 //                {
 //                        flag = 1;
 //                        cnt = 0;
 //                }
 //                }
 //
 //                else
 //                {
 //                        P2 = ~(0x80>>cnt);
 //                Delay100ms();
 //                cnt++;
 //                if(cnt>=8)
 //                {
 //                        flag = 0;
 //                        cnt = 0;
 //                }
 //                }
 
 ///************方法2 右移动流水灯***********/
 //                for(i = 0;i < 9;i++)
 //                {
 //                        P2 = ~(0x01 << i);                        //P2口正向流水灯,移位法
 //                        Delay100ms();                                                //延时500毫秒
 //                }
 
 
 /************方法3 ***********/
 P2 = 0XFE;
 Delay100ms();
 P2 = 0XFD;
 Delay100ms();
 P2 = 0XFB;
 Delay100ms();
 P2 = 0XF7;
 Delay100ms();
 P2 = 0XEF;
 Delay100ms();
 P2 = 0XDF;
 Delay100ms();
 P2 = 0XBF;
 Delay100ms();
 P2 = 0X7F;
 Delay100ms();
 
 }
 }
 
 void Delay100ms()                //@24.000MHz
 {
 unsigned long i;
 
 _nop_();
 _nop_();
 i = 599998UL;
 while (i) i--;
 }
 
 第2个程序: HIDI不断电下载点亮LED
 此程序在编译的时候出现警告,不影响效果,也可以自动下载。通过反复对比冲哥程序,
 没有问题,把冲哥程序复制过去也会出现警告。后面反复对比设置,发现设置有问题,
 
 
   
 在Options for Target 'Target1'里面L251 Misc下面有个disable Waming Numbers;冲哥里面有个57,
 我的里面是空白,输入57,警告就没有了。我把这个数字改成30,56, 58都会出现警告,后面在
 学习的QQ群问了,有群友回复:说的的警告有L57的提示,一看警告前面全都有L57。
 
 实验程序如下:
 /**屠龙刀2022-6-20版***/
 
 #include "stc.h"
 #include "usb.h"
 
 void sys_init(); //系统初始化
 
 //USB调试及复位所需定义
 char *USER_DEVICEDESC = NULL;
 char *USER_PRODUCTDESC = NULL;
 char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
 
 
 void main()
 {
 
 sys_init();  //系统初始化
 usb_init();  //USB初始化
 EA = 1;      //打开总中断
 
 while (1)
 {
 //                P2 = 0X0F;//点亮P2口高4位灯
 P2 = 0Xf0;//点亮P2口低4位灯
 }
 }
 
 
 void sys_init()
 {
 WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
 EAXFR = 1; //扩展寄存器(XFR)访问使能
 CKCON = 0; //提高访问XRAM速度
 
 P2M0 = 0X00;        //P2口初始化为准双向口
 P2M1 = 0X00;
 
 P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
 P3M1 |= 0x03;
 
 //设置USB使用的时钟源
 IRC48MCR = 0x80;    //使能内部48M高速IRC
 while (!(IRC48MCR & 0x01));  //等待时钟稳定
 }
 
 
 
 第4个程序:CDC不断电下载点亮LED
 这个程序在实验的时候也出现警告,当时测试时,第3个程序的警告还没有解决。原因和解决办法一样。只是警告数量不一样,
 警告前面都有L57。重新设置一下,警告就没有了。
 
 
 
 
 
 实验程序如下:
 /**屠龙刀2022-6-20版***/
 
 #include "stc.h"
 #include "usb.h"
 
 void sys_init();
 
 //USB调试及复位所需定义
 char *USER_DEVICEDESC = NULL;
 char *USER_PRODUCTDESC = NULL;
 char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
 
 sbit P21 = P2^1;
 sbit P22 = P2^2;
 
 void main()
 {
 
 sys_init();
 usb_init();  //USB初始化
 EA = 1;
 
 while (1)
 {
 P2 = 0X0F; //点亮P2口高4位
 //                        P22 = 0;    //点亮P2.2口灯
 }
 }
 
 
 void sys_init()
 {
 WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
 EAXFR = 1; //扩展寄存器(XFR)访问使能
 CKCON = 0; //提高访问XRAM速度
 
 P0M0 = 0X00;         //P0口初始化准双向口
 P0M1 = 0X00;
 P2M0 = 0X00;  //P2口初始化准双向口
 P2M1 = 0X00;
 
 P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
 P3M1 |= 0x03;
 
 //设置USB使用的时钟源
 IRC48MCR = 0x80;    //使能内部48M高速IRC
 while (!(IRC48MCR & 0x01));  //等待时钟稳定
 
 USBCLK = 0x00;//用CDC不断电下载,必须要这两行,HID下载不用
 USBCON = 0x90;
 }
 
 
 第5个程序:打印C语言运算符和进制数
 此实验时也出现打印不是自己想要的内容,如下图所示:后面在QQ群问群友解决了.
 
 
   出现上面问题的问题原因是:config.h文件里面宏定义问题,把打印设置到数码管输出了,如下图所示:
 
   
 更改为下图就可以了:
 
   输出结果正确如下图:
 
   第二个问题:
 “printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(100)=1.没有想明白为啥”
 看见的朋友若是知道,麻烦回复一下。自己理解是不是“%u”里面有个%的原因。
 
 
   
 冲哥给了回复:%在c语言里属于强制转义符,如果想单纯的输出%,而不是作为其他用途的话,在需要输出%的地方写入“%%”,这样两个%就可以了。
 如下图所示:
 
   
 实验程序如下:
 
 /**屠龙刀2022-6-20版***/
 
 #include "stc.h"
 #include "usb.h"
 
 void sys_init();
 
 //USB调试及复位所需定义
 char *USER_DEVICEDESC = NULL;
 char *USER_PRODUCTDESC = NULL;
 char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
 
 
 void main()
 {
 
 sys_init();
 usb_init();  //USB初始化
 EA = 1;
 
 while (1)
 {
 if( DeviceState != DEVSTATE_CONFIGURED )         //
 continue;
 if( bUsbOutReady )
 {
 usb_OUT_done();
 printf("1.12=%.3f\r\n",1.12);
 printf("1<<3=%u \r\n",1<<3);
 printf("1&3=%u \r\n",1&3);
 printf("1|3=%u \r\n",1|3);
 printf("~3=%u \r\n",~3);
 printf("!3=%u \r\n",!3);
 printf("当前温度为:%0.1f°\r\n",25.5);
 printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(100)=1.没有想明白为啥
 printf("100/3=%u \r\n",100/3);
 printf("(3+(5取余3)-2)=%u \r\n",3+(5%3)-2);
 }
 }
 }
 
 
 void sys_init()
 {
 WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
 EAXFR = 1; //扩展寄存器(XFR)访问使能
 CKCON = 0; //提高访问XRAM速度
 
 P3M0 = 0X00;   //P3口设置为准双向口
 P3M1 = 0X00;
 
 P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
 P3M1 |= 0x03;
 
 //设置USB使用的时钟源
 IRC48MCR = 0x80;    //使能内部48M高速IRC
 while (!(IRC48MCR & 0x01));  //等待时钟稳定
 
 USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
 USBCON = 0x90;
 }
 
 
 第6个程序: LED闪烁和花样式点灯
 
 实验程序如下:
 
 
 /**屠龙刀2022-6-20版***/
 
 #include "stc.h"
 #include "usb.h"
 
 //#define MAIN_Fosc  24000000UL
 
 void sys_init();
 void delay_ms(u16);
 
 //USB调试及复位所需定义
 char *USER_DEVICEDESC = NULL;
 char *USER_PRODUCTDESC = NULL;
 char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
 
 
 void main()
 {
 u8 a;
 sys_init();
 usb_init();  //USB初始化
 EA = 1;
 
 while (1)
 {
 if( DeviceState != DEVSTATE_CONFIGURED )         //
 continue;
 if( bUsbOutReady )
 {
 usb_OUT_done();
 a = 10;
 
 //                        do{
 //                                printf("%u\r\n",a++);//10 11 12 13 14
 //                        }while(a<15);
 
 do{
 printf("%u\r\n",++a);//11 12 13 14 15
 }while(a<15);
 
 //                        while(a<15)
 //                        {
 //                                printf("%u\r\n",++a);//11 12 13 14 15
 //                        }
 
 //                while(a<15)
 //                        {
 //                                printf("%u\r\n",a++);//10 11 12 13 14
 //                        }
 //
 }
 ///***********P2口灯全部闪烁****************/
 //                P2 = 0X00;        //点亮P2口
 //                delay_ms(200);
 //                P2 = 0Xff;         //熄灭P2口
 //                delay_ms(200);
 
 /***********P2口灯花样灯****************/
 P2 = 0XFE;       //点亮P2.0口
 delay_ms(200);
 P2 = 0Xff;                        //熄灭P2.0口
 delay_ms(200);
 
 P2 = 0XFD;                        //点亮P2.1口
 delay_ms(200);
 P2 = 0Xff;                        //熄灭P2.1口
 delay_ms(200);
 
 P2 = 0XFB;                        //点亮P2.2口
 delay_ms(200);
 P2 = 0Xff;                        //熄灭P2.2口
 delay_ms(200);
 
 P2 = 0XF7;     //点亮P2.3口
 delay_ms(200);
 P2 = 0Xff;                        //熄灭P2.3口
 delay_ms(200);
 
 P2 = 0XEF;     //点亮P2.4口
 delay_ms(200);
 P2 = 0Xff;                        //熄灭P2.4口
 delay_ms(200);
 
 P2 = 0XDF;     //点亮P2.5口
 delay_ms(200);
 P2 = 0Xff;                        //熄灭P2.5口
 delay_ms(200);
 
 P2 = 0XBF;     //点亮P2.6口
 delay_ms(200);
 P2 = 0Xff;                        //熄灭P2.6口
 delay_ms(200);
 
 P2 = 0X7F;    //点亮P2.7口
 delay_ms(200);
 P2 = 0Xff;                //熄灭P2.7口
 delay_ms(200);
 
 P2 = 0X0F;    //点亮高4位
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0XF0;    //点亮低4位
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0X7E;    //点亮P2.7 P2.0
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0XBD;    //点亮P2.6 P2.1
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0XDB;    //点亮P2.5 P2.2
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0XE7;    //点亮P2.4 P2.3
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0X00;    //P2口灯全亮
 delay_ms(200);
 P2 = 0Xff;    //P2口灯全灭
 delay_ms(200);
 
 P2 = 0XE7;    //点亮P2.4 P2.3
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0XDB;    //点亮P2.5 P2.2
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0XBD;    //点亮P2.6 P2.1
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 P2 = 0X7E;    //点亮P2.7 P2.0
 delay_ms(200);
 P2 = 0Xff;                //熄灭
 delay_ms(200);
 
 }
 }
 
 
 void sys_init()
 {
 WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
 EAXFR = 1; //扩展寄存器(XFR)访问使能
 CKCON = 0; //提高访问XRAM速度
 
 P1M0 = 0X00;    //P1口设置为准双向口
 P1M1 = 0X00;
 P2M0 = 0X00;   //P2口设置为准双向口
 P2M1 = 0X00;
 P3M0 = 0X00;   //P3口设置为准双向口
 P3M1 = 0X00;
 
 P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
 P3M1 |= 0x03;
 
 //设置USB使用的时钟源
 IRC48MCR = 0x80;    //使能内部48M高速IRC
 while (!(IRC48MCR & 0x01));  //等待时钟稳定
 
 USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
 USBCON = 0x90;
 }
 
 
 void delay_ms(u16 ms)
 {
 u16 i;
 
 do{
 i = MAIN_Fosc/6000;
 while(--i);
 }while(--ms);
 }
 
 
 第7个程序:模块化编程SOS求救灯
 
 学习这个的时候也有点小插曲,编译出现错误。代号L127 L128。如下图所示:
 
 
   
 后面发现,是忘就添加delay.c和math.c文件。
 
 
   
 后面通过反复找原因,反复看冲哥视频,对比以前的学习资料,找到这个问题,添加后,编译没有问题了。
 
 
   
 实验程序如下:
 main函数:
 
 /**屠龙刀2022-6-20版***/
 
 #include "stc.h"
 #include "usb.h"
 #include "delay.h"
 #include "math.h"
 
 #define MAIN_Fosc  24000000UL
 
 void sys_init();
 void delay_ms(u16 ms);
 //int Add(u16 Number1,u16 Number2);
 //int Sub(u16 Number1,u16 Number2);
 //int Mul(u16 Number1,u16 Number2);
 //int Div(u16 Number1,u16 Number2);
 
 //USB调试及复位所需定义
 char *USER_DEVICEDESC = NULL;
 char *USER_PRODUCTDESC = NULL;
 char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
 
 
 void main()
 {
 sys_init();
 usb_init();  //USB初始化
 EA = 1;
 
 while (1)
 {
 if( DeviceState != DEVSTATE_CONFIGURED )         //
 continue;
 if( bUsbOutReady )
 {
 usb_OUT_done();
 printf("计算Add(3,7)的结果为:%u\r\n",Add(3,7));
 printf("计算Sub(10,5)的结果为:%u\r\n",Sub(10,5));
 printf("计算Mul(10,5)的结果为:%u\r\n",Mul(10,5));
 printf("计算Div(10,5)的结果为:%u\r\n",Div(10,5));
 }
 /*********P2口灯闪烁3次间隔时间200ms,再闪烁3次间隔时间600ms,
 再闪烁3次间隔时间200ms,反复循环********************/
 P2 = 0X00;     //P2口灯亮
 delay_ms(200); //延时200ms
 P2 = 0Xff;                  //P2口灯熄灭
 delay_ms(200);
 P2 = 0X00;
 delay_ms(200);
 P2 = 0Xff;
 delay_ms(200);
 P2 = 0X00;
 delay_ms(200);
 P2 = 0Xff;
 delay_ms(200);
 
 P2 = 0X00;                                //P2口灯亮
 delay_ms(600);    //延时600ms
 P2 = 0Xff;        //P2口灯熄灭
 delay_ms(600);
 P2 = 0X00;
 delay_ms(600);
 P2 = 0Xff;
 delay_ms(600);
 P2 = 0X00;
 delay_ms(600);
 P2 = 0Xff;
 delay_ms(600);
 
 P2 = 0X00;
 delay_ms(200);
 P2 = 0Xff;
 delay_ms(200);
 P2 = 0X00;
 delay_ms(200);
 P2 = 0Xff;
 delay_ms(200);
 P2 = 0X00;
 delay_ms(200);
 P2 = 0Xff;
 delay_ms(200);
 }
 }
 
 
 void sys_init()
 {
 WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
 EAXFR = 1; //扩展寄存器(XFR)访问使能
 CKCON = 0; //提高访问XRAM速度
 
 /*******************************
 PnM1  PnM0
 0      0    准双向口
 0      1    推挽输出
 1      0    高阻输入
 1      1    开漏输出
 
 
 
 **********************************/
 
 P1M0 = 0X00;         //P1口设置为准双向口
 P1M1 = 0X00;
 P2M0 = 0X00;  //P2口设置为准双向口
 P2M1 = 0X00;
 P3M0 = 0X00;  //P3口设置为准双向口
 P3M1 = 0X00;
 
 P3M0 &= ~0x03; //P3.0 P3.1口设置高阻输入
 P3M1 |= 0x03;
 
 //设置USB使用的时钟源
 IRC48MCR = 0x80;    //使能内部48M高速IRC
 while (!(IRC48MCR & 0x01));  //等待时钟稳定
 
 USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
 USBCON = 0x90;
 }
 
 
 延时函数(delay.h)头文件:
 
 
 #ifndef __DELAY_H__
 #define __DELAY_H__
 
 #include "stc.h"
 
 void delay_ms(u16 ms);
 
 #endif
 
 
 延时函数(delay.c)C文件:
 
 
 #include "delay.h"
 
 void delay_ms(u16 ms)
 {
 u16 i;
 
 do{
 i = MAIN_Fosc/6000;
 while(--i);
 }while(--ms);
 }
 
 
 数学运算(math.h)头文件:
 
 
 #ifndef __MATH_H__
 #define __MATH_H__
 
 #include "stc.h"
 
 int Add(u16 Number1,u16 Number2);
 int Sub(u16 Number1,u16 Number2);
 int Mul(u16 Number1,u16 Number2);
 int Div(u16 Number1,u16 Number2);
 
 #endif
 
 
 数学运算(math.c) C文件:
 
 
 #include "math.h"
 
 int Add(u16 Number1,u16 Number2)//加法计算
 {
 return Number1+Number2;       //返回两个数的和
 }
 
 int Sub(u16 Number1,u16 Number2)  //减法计算
 {
 return Number1-Number2;       //返回两个数的差
 }
 
 int Mul(u16 Number1,u16 Number2)  //乘法计算
 {
 return Number1*Number2;       //返回两个数的积
 }
 
 int Div(u16 Number1,u16 Number2)  //除法计算
 {
 return Number1/Number2;       //返回两个数的商
 }
 
 
 第8个程序:按键控制灯
 此实验的时候发现了一个问题,按键按下移动灯,需要 加延时,后面自己解决了,没有想明白具体是啥原因。如下图所示:有文字描述。
 
   下面的程序不加延时也可以。
 
   
   
 实验程序如下:
 
 /**屠龙刀2022-6-20版***/
 
 #include "stc.h"
 #include "usb.h"
 
 #define MAIN_Fosc 24000000UL
 
 #define Key1 P32
 #define Key2 P33
 
 void sys_init();
 void delay_ms(u16);
 
 //USB调试及复位所需定义
 char *USER_DEVICEDESC = NULL;
 char *USER_PRODUCTDESC = NULL;
 char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
 
 
 void main()
 {
 u8 LED = 0XFE;
 u8 num = 0;
 u8 LedChar[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
 P2 = 0Xfe;
 
 sys_init();
 usb_init();  //USB初始化
 EA = 1;
 
 while (1)
 {
 if( DeviceState != DEVSTATE_CONFIGURED )         //
 continue;
 if( bUsbOutReady )
 {
 usb_OUT_done();
 
 //                        printf("%.1f\r\n",1.12);
 }
 ///************(Key1)P32按下点亮P20,(Key2)P33按下熄灭P20**************/
 //                if(Key1 == 0)
 //                        {
 //                                delay_ms(10);
 //                                if(Key1 == 0)
 //                                {
 //                                        printf("P32按键按下\r\n");
 //                                        P20 = 0;
 //                                }
 //                        }
 //                        if(Key2 == 0)
 //                        {
 //                                delay_ms(10);
 //                                if(Key2 == 0)
 //                                {
 //                                        printf("P33按键按下\r\n");
 //                                        P20 = 1;
 //                                }
 //                        }
 
 ///************(Key1)P32按下点亮P20,松开灯熄灭**************/
 //if(Key1 == 0)
 //                        {
 //                                delay_ms(10);
 //                                if(Key1 == 0)
 //                                {
 //                                printf("P32按键按下\r\n");//打印按键动作输出,按键按下就打印
 //                                        P20 = 0;
 //                                }
 //                                else
 //                                {
 //                                        P20 = 1;
 //                                }
 //                        }
 
 ///************(Key2)P33按下P20灯取反**************/
 //                if(Key2 == 0)
 //                        {
 //                                delay_ms(10);
 //                                if(Key2 == 0)
 //                                {
 //                                printf("P33按键按下\r\n"); //打印按键动作输出,按键按下就打印
 //                                        P20 = !P20;         //按键按下动作
 //                                        while(Key2 == 0)
 //                                        {
 //                                        }
 //                                        P20 = !P20;         //按键松开动作
 //                                }
 //                        }
 
 
 ///************(Key2)P33按下P2灯取反**************/
 //                if(Key2 == 0)
 //                        {
 //                                delay_ms(10);
 //                                if(Key2 == 0)
 //                                {
 ////                                printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
 //                                        P2 = ~P2; //按键按下动作
 //                                        while(Key2 == 0);
 ////                                        P2 = ~P2; //按键松开动作
 
 //                                }
 //                        }
 
 
 ///************(Key2)P33按下P2灯左移**************/
 if(Key2 == 0)
 {
 delay_ms(10);
 if(Key2 == 0)
 {
 printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
 //                                        while(Key2 == 0); //while(Key2 == 0)不能放这个位置,放这个位置不加延时灯不变化
 P2 = ((P2 << 1)+1);
 delay_ms(1);                //延时解决        while(Key2 == 0);不同位置,灯不变化的问题
 //                                        while(Key2 == 0);         //while(Key2 == 0)只能放这个位置,不用此句,按键按下灯也不变化
 if(P2 == 0XFF)//不能放在while(Key2 == 0)前面,否则按键按下不动作,加有延时就可以
 P2 = 0XFE;
 while(Key2 == 0); //while(Key2 == 0)不能放这个位置,放这个位置不加延时灯不变化
 }
 }
 
 /////************(Key2)P33按下P0灯左移 变量操作**************/
 //                                if(Key2 == 0)
 //                                                        {
 //                                                                delay_ms(10);
 //                                                                if(Key2 == 0)
 //                                                                {
 //                                                                        printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
 ////                                                                        while(Key2 == 0); //防此位置按键松手,才起作用
 //                                                                        LED  = ((LED  << 1)+1);
 //                                                                        if(LED  == 0XFF)//不能放在while(Key2 == 0)前面,否则按键按下不动作
 //                                                                        LED  = 0XFE;
 //                                                                        P2 = LED ;
 //                                                                        while(Key2 == 0);//防此位置按键按下,就起作用
 //                                                                }
 //                                                        }
 
 ///************(Key2)P33按下P0灯左移 数组法**************/
 //                                if(Key2 == 0)
 //                                                        {
 //                                                                delay_ms(10);
 //                                                                if(Key2 == 0)
 //                                                                {
 //                                                                        printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
 ////                                                                        while(Key2 == 0); //防此位置按键松手,才起作用
 //                                                                        LED  = LedChar[num];
 //                                                                        num++;
 //                                                                        if(num == 8)
 //                                                                                num = 0;
 //                                                                        P2 = LED;
 //                                                                        while(Key2 == 0);//防此位置按键按下,就起作用
 //                                                                }
 //                                                        }
 
 }
 }
 
 
 void sys_init()
 {
 WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
 EAXFR = 1; //扩展寄存器(XFR)访问使能
 CKCON = 0; //提高访问XRAM速度
 
 P0M0 = 0X00;         //P0口设置为准双向口
 P0M1 = 0X00;
 P1M0 = 0X00;         //P1口设置为准双向口
 P1M1 = 0X00;
 P2M0 = 0X00;         //P2口设置为准双向口
 P2M1 = 0X00;
 P3M0 = 0X00;         //P3口设置为准双向口
 P3M1 = 0X00;
 
 P3M0 &= ~0x03; //P3.0,P3.1设置为高阻输入
 P3M1 |= 0x03;
 
 //设置USB使用的时钟源
 IRC48MCR = 0x80;    //使能内部48M高速IRC
 while (!(IRC48MCR & 0x01));  //等待时钟稳定
 
 USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
 USBCON = 0x90;
 }
 
 
 void delay_ms(u16 ms)
 {
 u16 i;
 
 do{
 i = MAIN_Fosc/6000;
 while(--i);
 }while(--ms);
 }
 
 
 第9个程序:驱动蜂鸣器发声
 很久没有更新,今天抽个空更新。我没有有源蜂鸣器,是无源蜂鸣器,声音没有视频的好听,板子是自己做的扩展板。
 
   
   程序如下:
 
 #include "stc.h"
 #include "usb.h"
 
 #define MAIN_Fosc 24000000UL
 
 #define Beep P10  //蜂鸣器为P10口
 #define Key P32   //按键P32口
 
 bit BeepFlag = 0; //蜂鸣器工作标志,默认不响
 
 void sys_init(); //系统初始化
 void delay_ms(u16); //延时函数
 
 //USB调试及复位所需定义
 char *USER_DEVICEDESC = NULL;
 char *USER_PRODUCTDESC = NULL;
 char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
 
 
 void main()
 {
 sys_init();   //系统初始化
 usb_init();  //USB初始化
 EA = 1;      //开总中断
 
 while (1)
 {
 if( DeviceState != DEVSTATE_CONFIGURED )         //
 continue;
 if( bUsbOutReady )
 {
 usb_OUT_done();
 }
 
 ///**********按键按下不松手蜂鸣器响************/
 //        if(Key==0)  //按键按下
 //        {
 //                delay_ms(10);  //延时10ms
 //                if(Key==0)  //按键再次确认按下
 //                {
 //                        printf("Key已经按下!\r\n");
 //                        BeepFlag = 1; //蜂鸣器响
 //                        while(Key==1);//Key==0测试按键按下时蜂鸣器不
 //                        //响,松开蜂鸣器就响一下;Key==1测试按下按键不松手
 //                        //蜂鸣器就一直响,按键松开,蜂鸣器不响。
 ////                        BeepFlag = 1;        //此行放在while(Key==1);前面效果一样
 //                }
 //                else
 //                {
 //                        BeepFlag = 0;//蜂鸣器停止响
 //                }
 //
 //                if(BeepFlag == 1) //蜂鸣器响
 //                {
 //                        BeepFlag == 0; //蜂鸣器停止响
 //                        Beep = 0;      //蜂鸣器停止响
 //                        delay_ms(20); //延时20ms
 //                        Beep = 1;     //蜂鸣器响
 //                        delay_ms(50); //延时50ms
 //                }
 //                else
 //                {
 //                        BeepFlag == 1;    //蜂鸣器响
 //                        Beep = 1;        //蜂鸣器响
 //                }
 //        }
 
 /**********按键控制蜂鸣器响停************/
 if(Key==0)  //按键按下
 {
 delay_ms(10); //延时10ms
 if(Key==0)    //按键再次确认按下
 {
 printf("Key已经按下!\r\n");//打印输出按键按下
 BeepFlag = ~BeepFlag; //蜂鸣器状态翻转
 while(Key==0);//若是Key==1就不能实现按一下按键翻转
 //                        BeepFlag = ~BeepFlag;//此行放在while(Key==1);前面效果一样
 
 }
 }
 if(BeepFlag == 1) //若蜂鸣器响
 {
 Beep = 0; //蜂鸣器停止响
 delay_ms(5);//延时5ms
 Beep = 1;   //蜂鸣器响
 delay_ms(5);//延时5ms
 }
 else
 {
 Beep = 1;//蜂鸣器响
 }
 
 
 
 }
 }
 
 
 void sys_init()
 {
 WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
 EAXFR = 1; //扩展寄存器(XFR)访问使能
 CKCON = 0; //提高访问XRAM速度
 
 P0M0 = 0X00; //P0口设置为准双向口
 P0M1 = 0X00;
 P1M0 = 0X00; //P1口设置为准双向口
 P1M1 = 0X00;
 P2M0 = 0X00; //P2口设置为准双向口
 P2M1 = 0X00;
 
 P3M0 = 0X00; //P3口设置为准双向口
 P3M1 = 0X00;
 
 P3M0 &= ~0x03;
 P3M1 |= 0x03;
 
 //设置USB使用的时钟源
 IRC48MCR = 0x80;    //使能内部48M高速IRC
 while (!(IRC48MCR & 0x01));  //等待时钟稳定
 
 USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
 USBCON = 0x90;
 }
 
 
 void delay_ms(u16 ms)
 {
 u16 i;
 
 do{
 i = MAIN_Fosc/6000;
 while(--i);
 }while(--ms);
 }
 
 
 第10个程序:按键控制LED灯和蜂鸣器1,按键处理控制LED灯和蜂鸣器2
 按键控制LED灯和蜂鸣器1,只是使用了两个按键,用来模拟电磁炉的开关机和功能切换。
 按键控制LED灯和蜂鸣器2,采用了多函数方法,添加了专用的KEYLED.H KEYLED.C函数
 同时增加了按键3,实现了用LED灯来模拟电磁炉功能切换和开关机,还进行了工作状态指示。
 
 程序压缩见后面附件。
 
 第11个程序:数码管静态显示
 
 1,这个程序学习的时候遇到一个问题,如下:
 
 // 减法循环
 P2 = SegLED [Num]; //用数组来实现显示
 if(Num > 0)
 {
 Num--;      //循环数自减
 if(Num <= 0)    //为什么减法最低不能到0?
 //也就是说不显示0,最小显示1又变成9 了
 {
 Num = 9;
 }
 }
 delay_ms(500);   //延时500ms
 
 数码管不能显示0,显示到1又变成9了。
 
 2,通过一个按键设置数码管显示数字0-9循环,在按一下另外一个按键的时候,数码管上显示的数字几,
 蜂鸣器就响几声
 老师的这个作业没有想到方法来实现。
 程序文件见后面附件压缩文件包。
 
 第12个程序:数码管动态显示
 没有对应的硬件,自己用屠龙刀2022-6-20,自己搭接的四位数码管,硬件接口如下:
 
 P0.1 数码管最低位阳极控制开关,低电平开。
 P0.2 数码管次低位阳极控制开关,低电平开。
 P0.3 数码管次高位阳极控制开关,低电平开。
 P0.4 数码管最高位位阳极控制开关,低电平开。
 P2.0-P2.7对应数码管a b c d e f g dp。
 P7.5 蜂鸣器控制
 
 硬件不同,程序也和冲哥视频有区别。
 程序压缩 见后面附件。
 
 
 
 
 | 
 
 
1 点亮一个LED.rar
 14.89 KB, 下载次数: 344 
 
 
2 流水灯.rar
 39.17 KB, 下载次数: 342 
 
 
3 HIDI不断电下载点亮LED.rar
 112.59 KB, 下载次数: 363 
 
 
4 CDC不断电下载点亮LED.rar
 109.3 KB, 下载次数: 351 
 
 
5 打印C语言运算符和进制数.rar
 111.22 KB, 下载次数: 351 
 
 
6 LED闪烁和花样式点灯.rar
 113.3 KB, 下载次数: 332 
 
 
7 模块化编程SOS求救灯.rar
 121.33 KB, 下载次数: 325 
 
 
8 按键控制灯.rar
 113.14 KB, 下载次数: 331 
 
 
9 驱动蜂鸣器发声.rar
 112.63 KB, 下载次数: 337 
 
 
10 按键控制LED和蜂鸣器1.rar
 113.8 KB, 下载次数: 341 
 
 
10 按键控制LED和蜂鸣器2.rar
 128.82 KB, 下载次数: 325 
 
 
11 数码管静态显示.rar
 115.07 KB, 下载次数: 350 
 
 
12 数码管动态显示.rar
 117.6 KB, 下载次数: 339 
 |