文档介绍:ADC #include <> #include <> //51 基本运算(包括_nop_ 空函数) #include "" #include "" unsigned char code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f}; void AD_Configurate (uchar ChannelNum) { uchar AD_ FLAG =0; //存储 A/D 转换标志 ChannelNum &= 0x0f; //选择 ADC 的个接口中的一个( 0111 清高位) ADC_CONTR = 0x40; //ADC 转换的速度( XX0 0000 其中 XX 控制速度,请根据数据手册设置) _nop_(); ADC_CONTR |= ChannelNum; //选择 A/D 当前通道_nop_(); ADC_CONTR |= 0x80; //启动 A/D 电源 delay(1); //使输入电压达到稳定( ms 即可) } unsigned int ReadADValue ( void ){ unsigned char AD_ FLAG =0; //存储 A/D 转换标志 ADC_CONTR |= 0x08; //启动 A/D 转换( 1000 令 ADCS =1) _nop_(); _nop_(); _nop_(); _nop_(); while (AD_ FLAG ==0) //等待 A/D 转换结束{ AD_ FLAG = (ADC_CONTR & 0x10); //0001 0000 测试 A/D 转换结束否} ADC_CONTR &= 0xE7; //1111 0111 清 ADC_FLAG 位,关闭 A/D 转换, return (ADC_RES*4+ADC_RESL); // 返回 A/D 转换结果(位 ADC 数据高位在 ADC_RES 中,低位在 ADC_RESL 中) } void DigitalTube( unsigned long number) { P2=0xef; //1110 1111 P0=dispcode[number%10]; //显示 number 的个位 delay(7); P2=0xdf; //1101 1111 P0=(dispcode[number/10%10]); //显示 number 的十位 delay(7); P2=0xbf; //1011 1111 P0=(dispcode[number/100%10]); //显示 number 的百位 delay(7); P2=0x7f; //1011 1111 P0=(dispcode[number/1000]); //显示 number 的千位 delay(7); } void delay ( unsigned inta){ unsigned int i; while (--a != 0) { for (i= 0;i< 600; i++) ;}} void GPIO_init ( void ){ P2M0 = 0x0F; //0000 1111 //I/O 接口的设置 P2M1 = 0x00; //0000 0000 //I/O 接口的设置 P1M1 = 0x01; // 作为 ad功能} PWM #include <> #include "" #include "" unsigned int xdata FirstData=0; //上升沿捕捉数据 unsigned int xdata SeconedData=0; //下降沿捕捉数据高电平时间=SeconedData-FirstData unsigned int xdata HighLevel=0; //保存被测波形高电平时间对于测方波即使半个周期//采用半个周期的测法主要是提高可被测波形的频率范围 unsigned int xdata Frequency=0; //保存频率的变量 bit Capture_over = 0; //捕获完成标志位 void pwm_init( void ){ CMOD=0x80; //0000 0010 PCA 工作模式寄存器系统时钟/12 计数器溢出中断 AP0H =(CCAP0L = 254); //PCA 捕捉/比较寄存器 127 APM0=0x42; //0100 0010 // CCAP1H =(CCAP1L = 0x7f); // CCAPM1=0x42; CCAPM1 = 0x21; //16 位捕获模式,AP