七剑下天山之 冲哥 巨大奉献 !《32位8051单片机原理及应用》之具体,详细,非常少见
就算是点灯,也是和实践相结合,非常棒!!!
我们看看蜂鸣器+按键+LED的作业:
先奉上冲个的源程序:
- #include "COMM/stc.h" //调用头文件
- #include "COMM/usb.h"
- #include "test.h"
-
-
-
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
-
- void sys_init(); //函数声明
- void delay_ms(u16 ms); //unsigned int
-
- void main() //程序开始运行的入口
- {
- u8 LED_Data = 0XFE;
-
- u8 num=0;
- u8 LED_DataTab[8] = { 0XFE,0XFD, 0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
-
- sys_init(); //USB功能+IO口初始化
- usb_init(); //usb库初始化
- EA = 1; //CPU开放中断,打开总中断。
-
- P6 = LED_Data;
- while(1) //死循环
- {
- if( DeviceState != DEVSTATE_CONFIGURED ) //
- continue;
- if( bUsbOutReady )
- {
- usb_OUT_done();
-
- }
- // if( KEY1 == 0 )
- // {
- // delay_ms(10);
- // if( KEY1 == 0 )
- // {
- // while( KEY1 == 0 );
- // BEEP = !BEEP;
- // }
- // }
- Test();
- }
- }
- /*
- 11111110 0XFE
- 11111101 0XFD
- 11111011 0XFB
- 11110111 0XF7
- 11101111 0XEF
- 11011111 0XDF
- 10111111 0XBF
- 01111111 0X7F
- */
-
- void sys_init() //函数定义
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
- P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
- P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
- P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
- P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
- P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
- P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
-
- P3M0 = 0x00;
- P3M1 = 0x00;
-
- P3M0 &= ~0x03;
- P3M1 |= 0x03;
-
- //设置USB使用的时钟源
- IRC48MCR = 0x80; //使能内部48M高速IRC
- while (!(IRC48MCR & 0x01)); //等待时钟稳定
-
- USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
- USBCON = 0x90;
- }
-
-
复制代码
上面的Demo.c,下面是test.c:
复制代码 配套的test.h:
- #ifndef __TEST_H
- #define __TEST_H
-
- #include "COMM/stc.h" //调用头文件
- #include "COMM/usb.h"
-
-
- #define KEY1 P32 //定义一个按键 引脚选择P32
- #define KEY2 P33 //定义一个按键 引脚选择P33
- #define KEY3 P34 //定义一个按键 引脚选择P34
-
-
- #define BEEP P54 //定义一个按键 引脚选择P54
-
- #define MAIN_Fosc 24000000UL //定义主时钟
-
- void delay_ms(u16 ms);
- void Test(void);
-
- #endif
-
复制代码
其中test.c中49行:
if( Run_Flag&Run_Now==0 ) //如果没在工作
原来是:
if( Run_Now==0 ) //如果没在工作
我增加了Run_Flag&,这样保证在没有开机的时候,按开始工作和状态选择都没有动作
总之,冲哥对单片机的贡献是很大的,和其他学者不同的是,实用性很强,并且把自己平时的工作过程展现给大家,好难得!
|