实际上,冲哥的ADC应用:判断A键(SW11)按键按长下,就没有执行:
switch(ADC_KeyRead( ADC_Read(0)))
                        {
                                case1:                     break;
                                case11+0x80:RUN_STATE =1; blink_bit=0; break;//A按键SW11长按,时钟由运行状态进入设置状态
                                
                        
                        }        把 case 11+0x80: 中的11换成0--9,都是可以执行的,问题还是在ADC测量的时候,A----F没能正确识别!
				
			
		折腾到今天,发现暂时只能认输:
原因估计在USB模拟串口的 USB_CDC和ADC的兼容问题:
我们退后一步:先把USB模拟串口的功能去掉,专心学习ADC以及ADC应用:
先把时钟实验搞好:
				
			
		冲哥好久没有更新了,我现在正打算把3.0\3.1单独弄出来用于下载。				
			
		冲哥视频不仅讲得好,声音也好听,				
			
		今天继续学习冲哥的视频:第二十二集: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,板子通过串口发送当前温度给电脑。
*/
bitTIM_10MS_Flag;                        //10ms的标志位 
u16 Tme_CountDown = 0;                //全局变量
void sys_init();        //函数声明
void delay_ms(u16 ms);        //unsigned int 
void main()                                        //程序开始运行的入口
{
//        char str;
        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 )
                        {
                                case 'A':                        //点亮某个LED的命令
                                        if(( UsbOutBuffer>=48 ) && ( UsbOutBuffer<=55 ))
                                        {
                                                //LED = ~(1<<(UsbOutBuffer-48));
                                                LED0 = ~(UsbOutBuffer-48);LED1 = ~(UsbOutBuffer-48);LED2 = ~(UsbOutBuffer-48);LED3 = ~(UsbOutBuffer-48);
                                                LED4 = ~(UsbOutBuffer-48);LED5 = ~(UsbOutBuffer-48);LED6 = ~(UsbOutBuffer-48);LED7 = ~(UsbOutBuffer-48);
                                        }
                                        break;
                                case 'B':
                                                SEG0= UsbOutBuffer-48;SEG1= UsbOutBuffer-48;SEG2= UsbOutBuffer-48;SEG3= UsbOutBuffer-48;
                                                SEG4= UsbOutBuffer-48;SEG5= UsbOutBuffer-48;SEG6= UsbOutBuffer-48;SEG7= UsbOutBuffer-48;
                                        
                                                break;
                                case 'C':
                                                if(UsbOutBuffer==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串口确实好用!
				
			
		现在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);
的使用条件,就真没有搞清楚,只能跟着冲哥,不敢胡乱发挥,嘻嘻