找回密码
 立即注册
楼主: admin

视频教学:《32位8051单片机原理及应用》,一等奖2万, 送实验箱; 冲哥版

   火... [复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-12 08:19:57
已绑定手机

0

主题

1

回帖

6

积分

新手上路

积分
6
发表于 5 天前 | 显示全部楼层
开课讲得很好,对单片机有概况介绍,对不同阶段的人群都进行分析。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-12 14:38:09
已绑定手机

0

主题

1

回帖

8

积分

新手上路

积分
8
发表于 5 天前 | 显示全部楼层
冲哥不仅讲课精彩,而且音质也好,像播音员
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:25
  • 最近打卡:2025-09-15 09:59:03
已绑定手机

2

主题

190

回帖

528

积分

高级会员

积分
528
发表于 前天 09:59 | 显示全部楼层
七剑下天山之 冲哥 巨大奉献 !《32位8051单片机原理及应用》之具体,详细,非常少见

就算是点灯,也是和实践相结合,非常棒!!!
我们看看蜂鸣器+按键+LED的作业:
先奉上冲个的源程序:
  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/usb.h"
  3. #include "test.h"
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7.        
  8. void sys_init();        //函数声明
  9. void delay_ms(u16 ms);        //unsigned int
  10. void main()                                        //程序开始运行的入口
  11. {
  12.         u8 LED_Data = 0XFE;
  13.        
  14.         u8 num=0;
  15.         u8 LED_DataTab[8] = { 0XFE,0XFD, 0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
  16.        
  17.         sys_init();                                //USB功能+IO口初始化
  18.         usb_init();                                //usb库初始化
  19.         EA = 1;                                        //CPU开放中断,打开总中断。
  20.        
  21.         P6 = LED_Data;
  22.         while(1)                //死循环
  23.         {
  24.                 if( DeviceState != DEVSTATE_CONFIGURED )         //
  25.                         continue;
  26.                 if( bUsbOutReady )                                                               
  27.                 {
  28.                         usb_OUT_done();
  29.                 }
  30. //                if( KEY1 == 0  )
  31. //                {
  32. //                        delay_ms(10);
  33. //                        if(  KEY1 == 0 )
  34. //                        {
  35. //                                while(  KEY1 == 0 );
  36. //                                BEEP = !BEEP;
  37. //                        }
  38. //                }
  39.                 Test();
  40.         }
  41. }
  42. /*
  43. 11111110 0XFE
  44. 11111101 0XFD
  45. 11111011 0XFB
  46. 11110111 0XF7
  47. 11101111 0XEF
  48. 11011111 0XDF
  49. 10111111 0XBF
  50. 01111111 0X7F
  51. */
  52. void sys_init()                //函数定义
  53. {
  54.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  55.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  56.     CKCON = 0; //提高访问XRAM速度
  57.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  58.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  59.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  60.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  61.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  62.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  63.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  64.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  65.        
  66.     P3M0 = 0x00;
  67.     P3M1 = 0x00;
  68.    
  69.     P3M0 &= ~0x03;
  70.     P3M1 |= 0x03;
  71.     //设置USB使用的时钟源
  72.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  73.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  74.     USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
  75.     USBCON = 0x90;
  76. }
复制代码
上面的Demo.c,下面是test.c:
  1. #include "test.h"
  2. bit Run_Flag = 0;                //0-1 开关机变量
  3. u8  Run_Mode = 0;                //0-8 模式几 0:没有模式
  4. bit Run_Now = 0;                //0:停止工作  1:开始工作
  5. void Test(void)                //电磁炉的功能
  6. {
  7.         if( KEY1 == 0  )                //开关机键
  8.         {
  9.                 delay_ms(10);
  10.                 if(  KEY1 == 0 )
  11.                 {
  12. //----------------------还没有开机的时候,执行这个开机功能---------------------                       
  13.                         if( Run_Flag==0 )                        //还没有开机
  14.                         {
  15.                                 Run_Flag = 1;                        //开机变量改为1,表示已经开机了
  16.                                 BEEP = 0;                                //打开蜂鸣
  17.                                 delay_ms(10);                        //延时10ms
  18.                                 BEEP = 1;                                //关闭蜂鸣
  19.                                 P40 = 0;                                //打开led的总电源
  20.                                 P6 = 0X00;                                //点亮全部LED
  21.                                 delay_ms(200);                        //延时200ms
  22.                                 P6 = 0XFF;                                //熄灭全部LED
  23.                         }
  24. //----------------------已经开机的时候,执行这个关机功能---------------------                               
  25.                         else
  26.                         {
  27.                                 Run_Flag = 0;
  28.                                 BEEP = 0;                                //打开蜂鸣
  29.                                 delay_ms(10);                        //延时10ms
  30.                                 BEEP = 1;                                //关闭蜂鸣       
  31.                                 P6 = 0XFF;                                //熄灭全部LED       
  32.                                 Run_Mode = 0;                        //模式清0
  33.                                 Run_Now         = 0;                        //运行的模式改成停止                       
  34.                         }
  35.                         while(  KEY1 == 0 );                //按钮按下,并等待按钮松开
  36.                 }
  37.         }
  38.        
  39.         if( KEY2 == 0 )                                        //切换模式
  40.         {
  41.                 delay_ms( 10 );
  42.                 if( KEY2 == 0 )
  43.                 {
  44.                        
  45.                         if( Run_Flag&Run_Now==0 )                //如果没在工作
  46.                         {
  47.                                 BEEP = 0;                                //打开蜂鸣
  48.                                 delay_ms(10);                        //延时10ms
  49.                                 BEEP = 1;                                //关闭蜂鸣                       
  50.                                 Run_Mode ++;                        //模式选择
  51.                                 if( Run_Mode>8 )                //如果模式>8
  52.                                         Run_Mode = 1;                //回到模式1
  53.                                
  54.                                 P6 = ~(1<< (Run_Mode-1));                //1<<1      0000 0001 -> 1111 1110  
  55.                        
  56.                         }
  57.                         while( KEY2 == 0);                //等待松开执行了
  58.                        
  59.                 }
  60.         }
  61.        
  62.         if( KEY3 == 0 )                //按键按下才会执行里面得大括号
  63.         {
  64.                 delay_ms( 10 );
  65.                 if( KEY3 == 0 )
  66.                 {
  67.                         if( Run_Mode>0 )                //已经选择了模式
  68.                         {
  69.                                 BEEP = 0;                                //打开蜂鸣
  70.                                 delay_ms(10);                        //延时10ms
  71.                                 BEEP = 1;                                //关闭蜂鸣                               
  72.                                 Run_Now = !Run_Now;                //运行和停止之间的切换
  73.                         }
  74.                         while( KEY3 == 0);                //等待松开执行了
  75.                 }
  76.         }
  77.         if( Run_Now == 1 )                //正在运行
  78.         {
  79.                 P6 = 0XFF;                                        //全部熄灭
  80.                 delay_ms(200);
  81.                 P6 = ~(1<< (Run_Mode-1));        //点亮这个灯
  82.                 delay_ms(200);
  83.         }
  84.         else                                        //停止运行
  85.         {
  86.                 P6 = ~(1<< (Run_Mode-1));
  87.         }
  88.                
  89.        
  90. }
  91. void delay_ms(u16 ms)        //unsigned int
  92. {
  93.         u16 i;
  94.         do
  95.         {
  96.                 i = MAIN_Fosc/6000;
  97.                 while(--i);
  98.         }while(--ms);
  99. }
复制代码
配套的test.h:
  1. #ifndef __TEST_H
  2. #define __TEST_H
  3. #include "COMM/stc.h"                //调用头文件
  4. #include "COMM/usb.h"
  5. #define KEY1 P32                //定义一个按键 引脚选择P32
  6. #define KEY2 P33                //定义一个按键 引脚选择P33
  7. #define KEY3 P34                //定义一个按键 引脚选择P34
  8. #define BEEP P54                //定义一个按键 引脚选择P54
  9. #define MAIN_Fosc 24000000UL        //定义主时钟
  10. void delay_ms(u16 ms);
  11. void Test(void);       
  12. #endif
复制代码
其中test.c中49行:
if( Run_Flag&Run_Now==0 )                //如果没在工作

原来是:
if( Run_Now==0 )                //如果没在工作

我增加了Run_Flag&,这样保证在没有开机的时候,按开始工作和状态选择都没有动作

总之,冲哥对单片机的贡献是很大的,和其他学者不同的是,实用性很强,并且把自己平时的工作过程展现给大家,好难得!
回复

使用道具 举报 送花

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-17 03:43 , Processed in 0.118590 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表