- 打卡等级:以坛为家I
- 打卡总天数:337
- 最近打卡:2025-04-30 07:42:48
高级会员
- 积分
- 816
|
本帖最后由 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, 下载次数: 236
-
-
2 流水灯.rar
39.17 KB, 下载次数: 232
-
-
3 HIDI不断电下载点亮LED.rar
112.59 KB, 下载次数: 246
-
-
4 CDC不断电下载点亮LED.rar
109.3 KB, 下载次数: 238
-
-
5 打印C语言运算符和进制数.rar
111.22 KB, 下载次数: 242
-
-
6 LED闪烁和花样式点灯.rar
113.3 KB, 下载次数: 225
-
-
7 模块化编程SOS求救灯.rar
121.33 KB, 下载次数: 226
-
-
8 按键控制灯.rar
113.14 KB, 下载次数: 224
-
-
9 驱动蜂鸣器发声.rar
112.63 KB, 下载次数: 225
-
-
10 按键控制LED和蜂鸣器1.rar
113.8 KB, 下载次数: 222
-
-
10 按键控制LED和蜂鸣器2.rar
128.82 KB, 下载次数: 213
-
-
11 数码管静态显示.rar
115.07 KB, 下载次数: 223
-
-
12 数码管动态显示.rar
117.6 KB, 下载次数: 220
|