今天继续学习冲哥的视频:第二十二集:CDC串口通信
之前的故障,我也没有搞清楚,到达是软件兼容还是硬件故障
其实我在没有退休的时候就偶尔遇到这种现象,在这台机上的故障,无法在其他PC上复现
所以就算现在退休在家,也组装了8台PC,所以这次ADC读取超过9就出错,也是因为手头的
PC多,操作系统的版本不同,硬件配置不同的原因吧
先看程序:
- #include "COMM/stc32g.h" //调用头文件
- #include "COMM/stc32_stc8_usb.h"
- #include "seg_led.h"
- #include "key.h"
- #include "beep.h"
- #include "tim0.h"
- #include "exit.h"
- #include "adc.h"
- #include "ntc.h"
- #include "usart2.h"
- #include "stdio.h"
- #include "math.h"
-
- /*
- 项目名称:简易串口控制器。
-
- 1.串口发送字符 Ax\r\n,(x表示0-7)板子点亮对应LED
- Axxxxxxxx(x表示0或者1)板子点亮(熄灭)对应LED
- 2.串口发送 Bxxxxxxxx\r\n,xxxxxxxx表示一个八位数,八位数码管显示这8位数
- 2.串口发送 Z\r\n,板子给电脑发送“Hello STC”;
- 3.串口发送字符 Cx\r\n,(x表示0-1)板子打开/关闭蜂鸣
- 4.串口发送字符 D\r\n,板子通过串口发送当前温度给电脑。
-
- */
-
-
-
- bit TIM_10MS_Flag; //10ms的标志位
- u16 Tme_CountDown = 0; //全局变量
-
-
- void sys_init(); //函数声明
- void delay_ms(u16 ms); //unsigned int
-
-
- void main() //程序开始运行的入口
- {
- // char str[30];
- int temp=0;
- float Temp_xs=0;
- sys_init(); //USB功能+IO口初始化
-
-
- usb_init(); //调用USB_CDC初始化库函数
- delay_ms(500);
- Timer0_Init(); //定时器0初始化
-
- ADC_Init();
-
- P1M0 = 0x00; P1M1 = 0x08;
-
-
- EUSB = 1 ; //使能USB中断
-
- EA = 1; //CPU开放中断,打开总中断。
-
-
- // while( DeviceState != DEVSTATE_CONFIGURED ) //等待USB完成配置
-
- while(1) //死循环
- {
- //delay_ms(2);
-
- if( bUsbOutReady ) //当硬件接收完成上位机通过串口助手发送数据后会自动将bUsbOutReady置1,
- //接收的数据字节数保存在 OutNumber 变量中,接收的数据保存在 UsbOutBuffer 缓冲区
- {
-
- switch( UsbOutBuffer[0] )
- {
- case 'A': //点亮某个LED的命令
- if(( UsbOutBuffer[1]>=48 ) && ( UsbOutBuffer[1]<=55 ))
- {
- //LED = ~(1<<(UsbOutBuffer[1]-48));
- LED0 = ~(UsbOutBuffer[1]-48);LED1 = ~(UsbOutBuffer[2]-48);LED2 = ~(UsbOutBuffer[3]-48);LED3 = ~(UsbOutBuffer[4]-48);
- LED4 = ~(UsbOutBuffer[5]-48);LED5 = ~(UsbOutBuffer[6]-48);LED6 = ~(UsbOutBuffer[7]-48);LED7 = ~(UsbOutBuffer[8]-48);
- }
- break;
- case 'B':
- SEG0= UsbOutBuffer[1]-48;SEG1= UsbOutBuffer[2]-48;SEG2= UsbOutBuffer[3]-48;SEG3= UsbOutBuffer[4]-48;
- SEG4= UsbOutBuffer[5]-48;SEG5= UsbOutBuffer[6]-48;SEG6= UsbOutBuffer[7]-48;SEG7= UsbOutBuffer[8]-48;
-
- break;
- case 'C':
- if(UsbOutBuffer[1]==48)
- BEEP = 0;
- else
- BEEP = 1;
- break;
- case 'D':
- temp = Temp_Cal( ADC_Read(3) );
- Temp_xs = temp;
- // sprintf(str,"温度:%d\r\n",(int)temp);
- // sprintf(str,"温度:%f\r\n",(float)Temp_xs/10);
-
- printf("温度:%.2f\r\n",(float)Temp_xs/10);
-
-
- break;
- case 'Z':
- printf("HELLO STC!\r\n");
-
- //PrintString2("HELLO STC!\r\n");
- break;
- default:
- break;
- }
- Rec_Flag = 0;
-
-
-
-
-
- // USB_SendData(UsbOutBuffer,OutNumber); //使用USB_SendData库函数可向上位机发送数据,这里的测试代码为将接收数据原样返回
- //
- // printf_usb("1. Read Num:%d\n", OutNumber);
- // printf_usb("2. Read Num:%d\n", OutNumber);
- // printf_usb("3. Read Num:%d\n", OutNumber);
- // printf_usb("4. Read Num:%d\n", OutNumber);
-
-
- usb_OUT_done(); //处理完成接收的数据后,调用usb_OUT_done 准备接收下一笔数据
-
-
-
- }
-
- if( TIM_10MS_Flag==1 ) //如果10ms到了
- {
- TIM_10MS_Flag = 0; //清空标志位
- }
-
-
- }
- }
-
- void Timer0_Isr(void) interrupt 1
- {
- static timcount = 0;
-
- SEG_LED_Show(); //数码管刷新的
-
- timcount++; //1ms+1
- if( timcount>=10 ) //如果这个变量大于等于10,10ms计数到达
- {
- timcount = 0;
- TIM_10MS_Flag = 1; //10ms时间到了
- }
- }
-
-
- 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;
-
-
- }
-
-
- void delay_ms(u16 ms) //unsigned int
- {
- u16 i;
- do
- {
- i = MAIN_Fosc/6000;
- while(--i);
- }while(--ms);
- }
复制代码
由于现在的STC-USB CDC 的库文件和头文件,已经和冲哥讲座中的有所不同,所以有些地方有改动
实际的STC把有些设置封装到库函数去了,总之CDC串口确实好用!
|