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

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

   火... [复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 2025-9-26 16:45:27 | 显示全部楼层
实际上,冲哥的ADC应用:判断A键(SW11)按键按长下,就没有执行:

  1. switch(ADC_KeyRead( ADC_Read(0)))
  2.                         {
  3.                                 case  1:                     break;
  4.                                 case  11+0x80:  RUN_STATE =1; blink_bit=0; break;  //A按键SW11长按,时钟由运行状态进入设置状态
  5.                                
  6.                        
  7.                         }       
复制代码
把 case 11+0x80: 中的11换成0--9,都是可以执行的,问题还是在ADC测量的时候,A----F没能正确识别!
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 2025-9-27 17:06:32 | 显示全部楼层
折腾到今天,发现暂时只能认输:


原因估计在USB模拟串口的 USB_CDC和ADC的兼容问题:

我们退后一步:先把USB模拟串口的功能去掉,专心学习ADC以及ADC应用:

先把时钟实验搞好:

ADC应用-时钟.zip

225.09 KB, 下载次数: 17

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2025-10-15 13:44:23
已绑定手机

4

主题

93

回帖

1611

积分

金牌会员

积分
1611
发表于 2025-9-27 18:48:50 | 显示全部楼层
冲哥好久没有更新了,我现在正打算把3.0\3.1单独弄出来用于下载。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:293
  • 最近打卡:2025-10-15 06:24:04

0

主题

66

回帖

1484

积分

金牌会员

积分
1484
发表于 2025-9-27 20:51:31 | 显示全部楼层
冲哥视频不仅讲得好,声音也好听,
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 2025-10-7 09:14:18 | 显示全部楼层
今天继续学习冲哥的视频:第二十二集:CDC串口通信


之前的故障,我也没有搞清楚,到达是软件兼容还是硬件故障

其实我在没有退休的时候就偶尔遇到这种现象,在这台机上的故障,无法在其他PC上复现

所以就算现在退休在家,也组装了8台PC,所以这次ADC读取超过9就出错,也是因为手头的

PC多,操作系统的版本不同,硬件配置不同的原因吧

先看程序:
  1. #include "COMM/stc32g.h"                //调用头文件
  2. #include "COMM/stc32_stc8_usb.h"
  3. #include "seg_led.h"
  4. #include "key.h"
  5. #include "beep.h"
  6. #include "tim0.h"
  7. #include "exit.h"
  8. #include "adc.h"
  9. #include "ntc.h"
  10. #include "usart2.h"
  11. #include "stdio.h"
  12. #include "math.h"
  13. /*
  14. 项目名称:简易串口控制器。
  15. 1.串口发送字符        Ax\r\n,(x表示0-7)板子点亮对应LED
  16.                                 Axxxxxxxx(x表示0或者1)板子点亮(熄灭)对应LED
  17. 2.串口发送                Bxxxxxxxx\r\n,xxxxxxxx表示一个八位数,八位数码管显示这8位数
  18. 2.串口发送                Z\r\n,板子给电脑发送“Hello STC”;
  19. 3.串口发送字符        Cx\r\n,(x表示0-1)板子打开/关闭蜂鸣
  20. 4.串口发送字符        D\r\n,板子通过串口发送当前温度给电脑。
  21. */
  22. bit  TIM_10MS_Flag;                        //10ms的标志位
  23. u16 Tme_CountDown = 0;                //全局变量
  24. void sys_init();        //函数声明
  25. void delay_ms(u16 ms);        //unsigned int
  26. void main()                                        //程序开始运行的入口
  27. {
  28. //        char str[30];
  29.         int temp=0;
  30.         float Temp_xs=0;
  31.         sys_init();                                //USB功能+IO口初始化
  32.        
  33.         usb_init();                //调用USB_CDC初始化库函数
  34.         delay_ms(500);
  35.         Timer0_Init();        //定时器0初始化
  36.        
  37.         ADC_Init();       
  38.        
  39.         P1M0 = 0x00; P1M1 = 0x08;
  40.        
  41.         EUSB = 1 ;            //使能USB中断
  42.        
  43.         EA = 1;                                        //CPU开放中断,打开总中断。
  44. //        while( DeviceState != DEVSTATE_CONFIGURED )    //等待USB完成配置
  45.         while(1)                //死循环
  46.         {
  47.                 //delay_ms(2);
  48.                 if( bUsbOutReady )            //当硬件接收完成上位机通过串口助手发送数据后会自动将bUsbOutReady置1,
  49.                                                                 //接收的数据字节数保存在 OutNumber 变量中,接收的数据保存在 UsbOutBuffer 缓冲区                                                       
  50.                 {
  51.                        
  52.                         switch( UsbOutBuffer[0] )
  53.                         {
  54.                                 case 'A':                        //点亮某个LED的命令
  55.                                         if(( UsbOutBuffer[1]>=48 ) && ( UsbOutBuffer[1]<=55 ))
  56.                                         {
  57.                                                 //LED = ~(1<<(UsbOutBuffer[1]-48));
  58.                                                 LED0 = ~(UsbOutBuffer[1]-48);LED1 = ~(UsbOutBuffer[2]-48);LED2 = ~(UsbOutBuffer[3]-48);LED3 = ~(UsbOutBuffer[4]-48);
  59.                                                 LED4 = ~(UsbOutBuffer[5]-48);LED5 = ~(UsbOutBuffer[6]-48);LED6 = ~(UsbOutBuffer[7]-48);LED7 = ~(UsbOutBuffer[8]-48);
  60.                                         }
  61.                                         break;
  62.                                 case 'B':
  63.                                                 SEG0= UsbOutBuffer[1]-48;SEG1= UsbOutBuffer[2]-48;SEG2= UsbOutBuffer[3]-48;SEG3= UsbOutBuffer[4]-48;
  64.                                                 SEG4= UsbOutBuffer[5]-48;SEG5= UsbOutBuffer[6]-48;SEG6= UsbOutBuffer[7]-48;SEG7= UsbOutBuffer[8]-48;
  65.                                        
  66.                                                 break;
  67.                                 case 'C':
  68.                                                 if(UsbOutBuffer[1]==48)
  69.                                                         BEEP = 0;
  70.                                                 else
  71.                                                         BEEP = 1;       
  72.                                         break;
  73.                                 case 'D':
  74.                                                 temp = Temp_Cal( ADC_Read(3) );
  75.                                                 Temp_xs = temp;
  76. //                                                sprintf(str,"温度:%d\r\n",(int)temp);
  77. //                                                sprintf(str,"温度:%f\r\n",(float)Temp_xs/10);
  78.                                                 printf("温度:%.2f\r\n",(float)Temp_xs/10);
  79.                                                
  80.                                                
  81.                                         break;
  82.                                 case 'Z':
  83.                                         printf("HELLO STC!\r\n");
  84.                                     //PrintString2("HELLO STC!\r\n");
  85.                                         break;
  86.                                 default:
  87.                                         break;                               
  88.                         }
  89.                         Rec_Flag = 0;
  90.                        
  91.                        
  92.                        
  93. //                        USB_SendData(UsbOutBuffer,OutNumber); //使用USB_SendData库函数可向上位机发送数据,这里的测试代码为将接收数据原样返回
  94. //                       
  95. //                        printf_usb("1. Read Num:%d\n", OutNumber);
  96. //            printf_usb("2. Read Num:%d\n", OutNumber);
  97. //            printf_usb("3. Read Num:%d\n", OutNumber);
  98. //            printf_usb("4. Read Num:%d\n", OutNumber);
  99.                        
  100.                         usb_OUT_done();                       //处理完成接收的数据后,调用usb_OUT_done 准备接收下一笔数据
  101.                        
  102.                 }
  103.                
  104.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  105.                 {
  106.                         TIM_10MS_Flag = 0;                                                                        //清空标志位       
  107.                 }
  108.         }
  109. }
  110. void Timer0_Isr(void) interrupt 1
  111. {
  112.         static timcount = 0;
  113.        
  114.         SEG_LED_Show();                        //数码管刷新的
  115.        
  116.         timcount++;                                //1ms+1
  117.         if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
  118.         {
  119.                 timcount = 0;
  120.                 TIM_10MS_Flag = 1;        //10ms时间到了
  121.         }
  122. }
  123. void sys_init()                //函数定义
  124. {
  125.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  126.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  127.     CKCON = 0; //提高访问XRAM速度
  128.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  129.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  130.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  131.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  132.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  133.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  134.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  135.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  136.        
  137.     P3M0 = 0x00;
  138.     P3M1 = 0x00;
  139.    
  140.     P3M0 &= ~0x03;
  141.     P3M1 |= 0x03;
  142. }
  143. void delay_ms(u16 ms)        //unsigned int
  144. {
  145.         u16 i;
  146.         do
  147.         {
  148.                 i = MAIN_Fosc/6000;
  149.                 while(--i);
  150.         }while(--ms);
  151. }
复制代码
由于现在的STC-USB CDC 的库文件和头文件,已经和冲哥讲座中的有所不同,所以有些地方有改动

实际的STC把有些设置封装到库函数去了,总之CDC串口确实好用!
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

782

积分

高级会员

积分
782
发表于 2025-10-7 09:19:25 | 显示全部楼层
现在STC的处理方案,就更加成熟,使用起来就不容易出错,但是实际上,很多细节我也没有搞懂:

例如:sprintf(str,"温度:%d\r\n",(int)temp);
        sprintf(str,"温度:%f\r\n",(float)Temp_xs/10);

和        printf("温度:%.2f\r\n",(float)Temp_xs/10);

的使用条件,就真没有搞清楚,只能跟着冲哥,不敢胡乱发挥,嘻嘻
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 12:29 , Processed in 0.141844 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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