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

学习冲哥视频 《32位8051单片机原理及应用》打卡

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-8-30 16:15:13 | 显示全部楼层
本帖最后由 chun1234 于 2024-8-30 16:28 编辑

学习冲哥的《STC32G单片机视频教程》   第十七课 模数转换器ADC


一、模数转换器是什么:
模数转换器即A/D转换器,通常是指一个将模拟信号转变为数字信号的电子元件。
STC32G系列单片机内部集成了一个12位高速A/D转换器。ADC的时钟频率为系统频率2分频再经过用户设置的分频系数进行再次分频。
ADC转换结果的数据格式有两种:左对齐和右对齐,可方便用户进行读取和引用。
冲哥在这里引用了一段裁切木板的视频来讲解如何形成的二进制转换结果,很直观,易懂易用。
注意:使用ADC功能时有Vref引脚的单片机,千万千万不能悬空,必须接外部参考电压源或者VCC

二、STC32G单片机ADC使用原理:
1ADC控制寄存器共有5个位:
  ADC_POWER ADC电源控制位
  ADC_START ADC转换启动控制位
  ADC_FLAG  ADC转换结束标志位
  ADC_CHS  ADC模拟通道选择位
  ADC_EPWMT 使能PWM实时触发ADC功能

2ADC转换结果计算公式:
   ADC-1.png
3、高精度ADC采集 参考电路图:
       ADC-2.png

三、编写最简单的ADC采集代码:
  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/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. #define MAIN_Fosc 24000000UL        //定义主时钟
  10. char *USER_DEVICEDESC = NULL;
  11. char *USER_PRODUCTDESC = NULL;
  12. char *USER_STCISPCMD = "@STCISP#";
  13. bit  TIM_10MS_Flag;                  //10ms的标志位
  14. u16 Tme_CountDown = 0;                //全局变量
  15. void sys_init();        //函数声明
  16. void delay_ms(u16 ms);        //unsigned int
  17. void main()                                        //程序开始运行的入口
  18. {
  19.         sys_init();                                //USB功能+IO口初始化
  20.         usb_init();                                //usb库初始化
  21.         Timer0_Init();                        //定时器0初始化
  22.         ADC_Init();
  23.         
  24.         EA = 1;                                        //CPU开放中断,打开总中断。
  25.          
  26.         while(1)                //死循环
  27.         {
  28.                 delay_ms(2);
  29.                 if( DeviceState != DEVSTATE_CONFIGURED )         //
  30.                         continue;
  31.                 if( bUsbOutReady )                                                               
  32.                 {
  33.                         usb_OUT_done();
  34.                 }
  35.                
  36.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  37.                 {
  38.                         TIM_10MS_Flag = 0;                                                                        //清空标志位
  39.                         
  40.                         //ADC_Read(0);                                                                                //读取DC的数值
  41.                         
  42.                         printf("当前ADC数\xfd值:%d\t%dmv\r\n",(int)adc_val,(int)ADC_CAL_Voltage(adc_val));                                //串口打印ADC数值
  43.                                                 
  44.                 }               
  45.         }
  46. }
  47. void Timer0_Isr(void) interrupt 1
  48. {
  49.         static timcount = 0;
  50.         
  51.         SEG_LED_Show();                        //数码管刷新的
  52.         
  53.         timcount++;                                //1ms+1
  54.         if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
  55.         {
  56.                 timcount = 0;
  57.                 TIM_10MS_Flag = 1;        //10ms时间到了
  58.         }
  59. }
  60. void sys_init()                //函数定义
  61. {
  62.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  63.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  64.     CKCON = 0; //提高访问XRAM速度
  65.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  66.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  67.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  68.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  69.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  70.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  71.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  72.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  73.         
  74.     P3M0 = 0x00;
  75.     P3M1 = 0x00;
  76.    
  77.     P3M0 &= ~0x03;
  78.     P3M1 |= 0x03;
  79.     //设置USB使用的时钟源
  80.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  81.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  82.     USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
  83.     USBCON = 0x90;
  84. }
  85. void delay_ms(u16 ms)        //unsigned int
  86. {
  87.         u16 i;
  88.         do
  89.         {
  90.                 i = MAIN_Fosc/6000;
  91.                 while(--i);
  92.         }while(--ms);
  93. }
复制代码

  以上代码已经验证通过。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-9-4 14:33:50 | 显示全部楼层
本帖最后由 chun1234 于 2024-9-4 14:37 编辑

学习冲哥的《STC32G单片机视频教程》   第十八课 ADC采集电源电压和ADC按键

一、ADC反推电源电压
1、测量出Vref引脚电压的意义?
ADC-1.png
由公式得知:我们需要知道Vref的电压才能换算出引脚上的输入电压!但是我们做小仪表的时候很多都是直接电池供电,锂电池电压3.7-4.3V,有时还会去掉基准电压电路和稳压电路。所以首先换算出Vref的引脚电压至关重要。
   尽管电池电压不是稳定的,那我们只要测出某一个时刻的Vref引脚电压,可以多测几次,开头几次不要,只取稳定以后的Vref引脚电压即可。

   2、具体实现过程请看以下代码:
   
  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/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. #define MAIN_Fosc 24000000UL        //定义主时钟
  10. char *USER_DEVICEDESC = NULL;
  11. char *USER_PRODUCTDESC = NULL;
  12. char *USER_STCISPCMD = "@STCISP#";
  13. bit  TIM_10MS_Flag;                        //10ms的标志位
  14. u16 Tme_CountDown = 0;                //全局变量
  15. bit RUN_STATE = 0;                //0:正常运行  1:参数设置
  16. u8 S_HOUR = 0;
  17. u8 S_MINUTE = 0;
  18. u8 S_SECOND = 0;
  19. void sys_init();        //函数声明
  20. void delay_ms(u16 ms);        //unsigned int
  21. void TIME_SET_Second(void)
  22. {
  23.         S_SECOND ++;
  24.         if( S_SECOND>60 )
  25.         {
  26.                 S_SECOND = 0;
  27.                 S_MINUTE++;
  28.         }        
  29. }
  30. void main()                                      //程序开始运行的入口
  31. {
  32.         u16 VREF_VAL;
  33.         u16 count;
  34.         u8 keynum;
  35.         sys_init();                                //USB功能+IO口初始化
  36.         usb_init();                                //usb库初始化
  37.         
  38.         delay_ms(500);
  39.         Timer0_Init();                        //定时器0初始化
  40. //        ADC_Init();        
  41.         
  42.         VREF_VAL = ADC_VrefCal();//adc初始化+电源电压读取
  43.         
  44.         EA = 1;                                        //CPU开放中断,打开总中断。
  45.         while(1)                //死循环
  46.         {
  47.                 delay_ms(2);
  48.                 if( DeviceState != DEVSTATE_CONFIGURED )         //
  49.                         continue;
  50.                 if( bUsbOutReady )                                                               
  51.                 {
  52.                         usb_OUT_done();
  53.                         
  54.                 }
  55.                
  56.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  57.                 {
  58.                         TIM_10MS_Flag = 0;                                                                        //清空标志位
  59.                         
  60.                         Clock_InitShow(S_HOUR,S_MINUTE,S_SECOND);                                        //刷新数码管的数值
  61.                         BEEP_RUN();
  62.                         
  63.                         if( RUN_STATE == 0)                                                                        //正常运行
  64.                         {
  65.                                 count++;
  66.                                 if( count==100 )                                                                //计数到达10ms*100的时候执行一次        
  67.                                 {
  68.                                         count=0;
  69.                                         TIME_SET_Second();
  70.                                         if(( S_HOUR==0 ) && ( S_MINUTE==0 ) && ( S_SECOND==30 ))         //        时间到达00 - 00 - 30的时候
  71.                                         {
  72.                                                 BEEP_ON(300);
  73.                                         }
  74.                                 }
  75.                                 
  76.                         }
  77.                         keynum = ADC_KeyRead(ADC_Read(0));
  78.                         switch( keynum )
  79.                         {
  80.                                 
  81.                                 case 11+0X80:        
  82.                                         RUN_STATE=1;blink_bit = 0;
  83.                                         break;        //按钮A长按,
  84.                                 
  85.                                 case 12+0X80:        
  86.                                         if( RUN_STATE==1 )
  87.                                         {
  88.                                                 blink = 0;
  89.                                                 Time_Count = 0;
  90.                                                 TIME_SET_Second();
  91.                                         }                                                
  92.                                         break;        //按钮B长按,
  93.                                 case 14:        
  94.                                         if( RUN_STATE==1 )
  95.                                         {
  96.                                                 RUN_STATE = 0;
  97.                                                 blink_bit = 0xff;
  98.                                         }                                                
  99.                                         break;        //按钮B长按,                                       
  100.                                 
  101.                                 case 1:        
  102.                                 case 2:
  103.                                 case 3:
  104.                                 case 4:
  105.                                 case 5:
  106.                                 case 6:
  107.                                 case 7:
  108.                                 case 8:
  109.                                 case 9:
  110.                                 case 10:                //如果是0-9的按钮按下
  111.                                         Show_Tab[blink_bit] = (keynum-1);
  112.                                         blink_bit++;                //闪烁的位换到下一个
  113.                                         if(( blink_bit==2 )||( blink_bit==5))
  114.                                                 blink_bit++;
  115.                                         if( blink_bit == 8 )
  116.                                         {
  117.                                                 RUN_STATE = 0;
  118.                                         }
  119.                                         S_HOUR = Show_Tab[0]*10+Show_Tab[1];
  120.                                         S_MINUTE = Show_Tab[3]*10+Show_Tab[4];
  121.                                         S_SECOND = Show_Tab[6]*10+Show_Tab[7];
  122.                                         break;
  123.                                        
  124.                         }
  125.                                 
  126.                 }               
  127.         }
  128. }
  129. void Timer0_Isr(void) interrupt 1
  130. {
  131.         static timcount = 0;
  132.         
  133.         SEG_LED_Show();                        //数码管刷新的
  134.         
  135.         timcount++;                                //1ms+1
  136.         if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
  137.         {
  138.                 timcount = 0;
  139.                 TIM_10MS_Flag = 1;        //10ms时间到了
  140.         }
  141. }
  142. void sys_init()                //函数定义
  143. {
  144.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  145.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  146.     CKCON = 0; //提高访问XRAM速度
  147.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  148.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  149.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  150.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  151.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  152.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  153.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  154.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  155.         
  156.     P3M0 = 0x00;
  157.     P3M1 = 0x00;
  158.    
  159.     P3M0 &= ~0x03;
  160.     P3M1 |= 0x03;
  161.     //设置USB使用的时钟源
  162.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  163.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  164.     USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
  165.     USBCON = 0x90;
  166. }
  167. void delay_ms(u16 ms)        //unsigned int
  168. {
  169.         u16 i;
  170.         do
  171.         {
  172.                 i = MAIN_Fosc/6000;
  173.                 while(--i);
  174.         }while(--ms);
  175. }
复制代码



ADC按键扫描(长按循环触发)
   ADC键方法:每隔10ms左右读取一次ADC值,并且保存最后3次的读数,其变化比较小时再判断键,判断键有效时,允许一定的偏差,比如正负16个字的偏差。
        按键扫描原理图如下:

      反推ADC电压_2.png


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:259
  • 最近打卡:2025-05-09 01:00:04

0

主题

34

回帖

767

积分

高级会员

积分
767
发表于 2024-9-7 01:02:56 | 显示全部楼层
一起学习
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-9-12 09:14:06 | 显示全部楼层
本帖最后由 chun1234 于 2024-9-12 09:16 编辑

学习冲哥的《STC32G单片机视频教程》   第十九课 NTC温度采集   


一、NTC的原理

   1NTC是指随温度上升电阻呈指数关系减小,具有负温度系数的热敏电阻材料和现象。NTC器件的种类常见有贴片型、直插型和金属头型。NTC的用途非常广泛。

用公式表示如下:

    Rt = RT0*EXP(Bn*(1/T-1/T0))
  式中RTRT0分别为温度为TT0时的电阻值,Bn为材料常数,陶瓷晶粒本身由于温度变化而使电阻率发生变化,这是由半导体特性决定的。

   2NTC测温原理图:

       NTC测温原理图.png


二、NTC测温程序的编写
  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/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. #define MAIN_Fosc 24000000UL        //定义主时钟
  11. char *USER_DEVICEDESC = NULL;
  12. char *USER_PRODUCTDESC = NULL;
  13. char *USER_STCISPCMD = "@STCISP#";
  14. bit  TIM_10MS_Flag;                        //10ms的标志位
  15. u16 Tme_CountDown = 0;                //全局变量
  16. bit RUN_STATE = 0;                //0:正常运行  1:参数设置
  17. u8 S_HOUR = 0;
  18. u8 S_MINUTE = 0;
  19. u8 S_SECOND = 0;
  20. void sys_init();        //函数声明
  21. void delay_ms(u16 ms);        //unsigned int
  22. void TIME_SET_Second(void)
  23. {
  24.         S_SECOND ++;
  25.         if( S_SECOND>60 )
  26.         {
  27.                 S_SECOND = 0;
  28.                 S_MINUTE++;
  29.         }        
  30. }
  31. void main()                                        //程序开始运行的入口
  32. {
  33.         int TEMP_VAL;
  34.         int count = 0;
  35.         
  36.         sys_init();                                //USB功能+IO口初始化
  37.         usb_init();                                //usb库初始化
  38.         
  39.         delay_ms(500);
  40.         Timer0_Init();                        //定时器0初始化
  41.         ADC_Init();        
  42.         
  43.         P1M0 = 0x00; P1M1 = 0x08;
  44.         
  45.         EA = 1;                                        //CPU开放中断,打开总中断。
  46.         while(1)                //死循环
  47.         {
  48.                 delay_ms(2);
  49.                 if( DeviceState != DEVSTATE_CONFIGURED )         //
  50.                         continue;
  51.                 if( bUsbOutReady )                                                               
  52.                 {
  53.                         usb_OUT_done();
  54.                         
  55.                         
  56.                         printf("当前温度:%d\r\n",TEMP_VAL);
  57.                 }
  58.                
  59.                 if( TIM_10MS_Flag==1 )                            //如果10ms到了
  60.                 {
  61.                         TIM_10MS_Flag = 0;                         //清空标志位
  62.                         
  63.                         count++;
  64.                         if( count>=30 )
  65.                         {
  66.                                 count = 0;
  67.                                 
  68.                                 TEMP_VAL = Temp_Cal(ADC_Read(3));
  69.                                 
  70.                                 SEG0 = TEMP_VAL/1000%10;
  71.                                 SEG1 = TEMP_VAL/100%10;
  72.                                 SEG2 = TEMP_VAL/10%10 +10;
  73.                                 SEG3 = TEMP_VAL/1%10;
  74.                         }
  75.                                 
  76.                 }               
  77.         }
  78. }
  79. void Timer0_Isr(void) interrupt 1
  80. {
  81.         static timcount = 0;
  82.         
  83.         SEG_LED_Show();                        //数码管刷新的
  84.         
  85.         timcount++;                                //1ms+1
  86.         if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
  87.         {
  88.                 timcount = 0;
  89.                 TIM_10MS_Flag = 1;        //10ms时间到了
  90.         }
  91. }
  92. void sys_init()                //函数定义
  93. {
  94.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  95.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  96.     CKCON = 0; //提高访问XRAM速度
  97.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  98.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  99.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  100.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  101.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  102.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  103.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  104.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  105.         
  106.     P3M0 = 0x00;
  107.     P3M1 = 0x00;
  108.    
  109.     P3M0 &= ~0x03;
  110.     P3M1 |= 0x03;
  111.     //设置USB使用的时钟源
  112.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  113.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  114.     USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
  115.     USBCON = 0x90;
  116. }
  117. void delay_ms(u16 ms)        //unsigned int
  118. {
  119.         u16 i;
  120.         do
  121.         {
  122.                 i = MAIN_Fosc/6000;
  123.                 while(--i);
  124.         }while(--ms);
  125. }
复制代码




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-9-20 17:04:56 | 显示全部楼层
本帖最后由 chun1234 于 2024-9-20 17:08 编辑

  学习冲哥的《STC32G单片机视频教程》   20课 串口通信

一、串口通信的基础知识

1、什么是通信
每次发送一位数据的称为串行通信,多为一起传输的称为并行通信。而串口通信是串行通信中的一种。串口通信,是指外设和计算机间,通过数据信号线、地线、控制线等,安慰进行传输数据的一种通讯方式。这种通讯方式使用的数据线少,在远距离通信中可以节约通信成本,但是其传输速度比并行传输低。
2、同步与异步
     同步:
       ①同步是指以字符为单位传送信息;
       相邻两个字符间的间隔是任意长;
       ③因为一个字符中的比特位长度有限,所以需要的接收时钟和发送时钟只要相近就可以;
       ④同步方式特点简单说就是:字符间异步,字符内部各位同步。

  异步:
  以数据块为单位传输信息;
  在一个数据块(信息帧)内,字符与字符间无间隔;
  因为一次传输的数据块中包含的数据较多,所以接收时钟与发送时钟严格同步,通常要有同步时钟。

  全双工:因为发送方与接收方都有单独的发送器和接收器,所以它们在传输数据时可以做到全双工工作。

   波特率:例如9600的波特率意味着每秒钟可以发9600位的数据。

二、STC32的串口通信实现原理

          1、引脚选择:串口1、串口2的通讯口均可以通过功能管脚切换功能切换到多组端口,从而可以将一个通讯口分时复用为多个通讯口。
          2、模式选择:当PCON寄存器中的SM0D0位为0时,该位和SM1一起指定串口1的通信工作模式。

          图:串口1工作模式
串口1工作模式.png

三、串口通信代码的实现
  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/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. char *USER_DEVICEDESC = NULL;
  12. char *USER_PRODUCTDESC = NULL;
  13. char *USER_STCISPCMD = "@STCISP#";
  14. bit  TIM_10MS_Flag;                        //10ms的标志位
  15. u16 Tme_CountDown = 0;                //全局变量
  16. bit RUN_STATE = 0;                //0:正常运行  1:参数设置
  17. u8 S_HOUR = 0;
  18. u8 S_MINUTE = 0;
  19. u8 S_SECOND = 0;
  20. void sys_init();        //函数声明
  21. void delay_ms(u16 ms);        //unsigned int
  22. void TIME_SET_Second(void)
  23. {
  24.         S_SECOND ++;
  25.         if( S_SECOND>60 )
  26.         {
  27.                 S_SECOND = 0;
  28.                 S_MINUTE++;
  29.         }        
  30. }
  31. void main()                                        //程序开始运行的入口
  32. {
  33.         
  34.         sys_init();                                //USB功能+IO口初始化
  35.         usb_init();                                //usb库初始化
  36.         
  37.         delay_ms(500);
  38.         Timer0_Init();                        //定时器0初始化
  39.         Usart2_Init();
  40.         IE2 = 0X01;
  41.         
  42.         EA = 1;                                        //CPU开放中断,打开总中断。
  43.         Usart2_SendStr("USART2 TEST\r\n");
  44.         
  45.         while(1)                //死循环
  46.         {
  47. //                delay_ms(2);
  48. //                if( DeviceState != DEVSTATE_CONFIGURED )         //
  49. //                        continue;
  50. //                if( bUsbOutReady )                                                               
  51. //                {
  52. //                        usb_OUT_done();
  53. //                }
  54.                
  55.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  56.                 {
  57.                         TIM_10MS_Flag = 0;                                                                        //清空标志位        
  58.                 }
  59.                 if( rptr != wptr )
  60.                 {
  61.                         Usart2_Send(buffer[rptr++]);
  62.                         rptr &= 0x0f;
  63.                 }
  64.         }
  65. }
  66. void Timer0_Isr(void) interrupt 1
  67. {
  68.         static timcount = 0;
  69.         
  70.         SEG_LED_Show();                        //数码管刷新的
  71.         
  72.         timcount++;                                //1ms+1
  73.         if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
  74.         {
  75.                 timcount = 0;
  76.                 TIM_10MS_Flag = 1;        //10ms时间到了
  77.         }
  78. }
  79. void sys_init()                //函数定义
  80. {
  81.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  82.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  83.     CKCON = 0; //提高访问XRAM速度
  84.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  85.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  86.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  87.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  88.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  89.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  90.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  91.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  92.         
  93.     P3M0 = 0x00;
  94.     P3M1 = 0x00;
  95.    
  96.     P3M0 &= ~0x03;
  97.     P3M1 |= 0x03;
  98.     //设置USB使用的时钟源
  99.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  100.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  101.     USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
  102.     USBCON = 0x90;
  103. }
  104. void delay_ms(u16 ms)        //unsigned int
  105. {
  106.         u16 i;
  107.         do
  108.         {
  109.                 i = MAIN_Fosc/6000;
  110.                 while(--i);
  111.         }while(--ms);
  112. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-9-26 10:56:49 | 显示全部楼层
本帖最后由 chun1234 于 2024-9-26 11:00 编辑

  学习冲哥的《STC32G单片机视频教程》   21课 串口应用

    一、串口与PC通信的接线
          TXRX代表一组串口,TXDnRXDn 表示这是第几组串口。
          芯片与芯片之间的通信:如果通信协议和电平都一样,直接把TX和RX连接就可以通信。
          串口与电脑USB通信:可以借助USB转TTL的工具进行连接。
          推荐试用STC公司出品的USB转双串口工具(一箭双雕)进行连接,更方便连接下载与调试。

         使用一箭双雕下载.png
    ISP下载步骤:
      1、按照如图所示的连接方式,将USB转串口工具和目标芯片连接
      2、点击 STC-ISP 下载软件中的“下载/编程” 按钮
      3、开始ISP下载

    二、利用实验箱示例代码移植驱动程序
  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/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. char *USER_DEVICEDESC = NULL;
  12. char *USER_PRODUCTDESC = NULL;
  13. char *USER_STCISPCMD = "@STCISP#";
  14. bit  TIM_10MS_Flag;                        //10ms的标志位
  15. u16 Tme_CountDown = 0;                //全局变量
  16. bit RUN_STATE = 0;                //0:正常运行  1:参数设置
  17. u8 S_HOUR = 0;
  18. u8 S_MINUTE = 0;
  19. u8 S_SECOND = 0;
  20. void sys_init();        //函数声明
  21. void delay_ms(u16 ms);        //unsigned int
  22. void TIME_SET_Second(void)
  23. {
  24.         S_SECOND ++;
  25.         if( S_SECOND>60 )
  26.         {
  27.                 S_SECOND = 0;
  28.                 S_MINUTE++;
  29.         }        
  30. }
  31. void main()                                        //程序开始运行的入口
  32. {
  33.         
  34.         sys_init();                                //USB功能+IO口初始化
  35.         usb_init();                                //usb库初始化
  36.         
  37.         delay_ms(500);
  38.         Timer0_Init();                        //定时器0初始化
  39.         Usart2_Init();
  40.         IE2 = 0X01;
  41.         
  42.         EA = 1;                                        //CPU开放中断,打开总中断。
  43.         Usart2_SendStr("USART2 TEST\r\n");
  44.         
  45.         while(1)                //死循环
  46.         {
  47.                
  48.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  49.                 {
  50.                         TIM_10MS_Flag = 0;                                                                        //清空标志位        
  51.                 }
  52.                 if( rptr != wptr )
  53.                 {
  54.                         Usart2_Send(buffer[rptr++]);
  55.                         rptr &= 0x0f;
  56.                 }
  57.         }
  58. }
  59. void Timer0_Isr(void) interrupt 1
  60. {
  61.         static timcount = 0;
  62.         
  63.         SEG_LED_Show();                        //数码管刷新
  64.         
  65.         timcount++;                                //1ms+1
  66.         if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
  67.         {
  68.                 timcount = 0;
  69.                 TIM_10MS_Flag = 1;        //10ms时间到了
  70.         }
  71. }
  72. void sys_init()                //函数定义
  73. {
  74.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  75.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  76.     CKCON = 0; //提高访问XRAM速度
  77.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  78.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  79.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  80.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  81.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  82.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  83.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  84.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  85.         
  86.     P3M0 = 0x00;
  87.     P3M1 = 0x00;
  88.    
  89.     P3M0 &= ~0x03;
  90.     P3M1 |= 0x03;
  91.     //设置USB使用的时钟源
  92.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  93.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  94.     USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
  95.     USBCON = 0x90;
  96. }
  97. void delay_ms(u16 ms)        //unsigned int
  98. {
  99.         u16 i;
  100.         do
  101.         {
  102.                 i = MAIN_Fosc/6000;
  103.                 while(--i);
  104.         }while(--ms);
  105. }
复制代码



回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-9 09:20 , Processed in 0.120815 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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