在论坛里面下载了前辈的ADC代码,https://bbs.elecfans.com/jishu_363299_1_1.html
其他地方没改,只是改成了1602显示,结果ADC值一直读不出来,即num一直为1.00,ADC_value一直是0XFF00
不知道哪里有问题
- #include
- #include
- #include
- #include
- #include
- #define ADC_POWER 0x80 //ADC电源控制位
- #define ADC_FLAG 0x10 //ADC完成标志
- #define ADC_START 0x08 //ADC开始标志位
- #define ADC_SPEEDLL 0x00 //540 clocks
- #define ADC_SPEEDL 0x20 //360 clocks
- #define ADC_SPEEDH 0x40 //180 clocks
- #define ADC_SPEEDHH 0x60 //90 clocks
- bit g_sys5msflag; //5ms标志位
- sfr ADC_CONTR = 0xBC; //ADC 控制寄存器
- sfr ADC_RES = 0xBD; //ADC 高 8-bit result
- sfr ADC_LOW2 = 0xBE; //ADC 低 2-bit result
- sfr P1ASF = 0x9D; //P1 定义功能
- sbit RS = P1^0; //定义端口
- sbit RW = P1^1;
- sbit EN = P2^5;
- #define RS_CLR RS=0
- #define RS_SET RS=1
- #define RW_CLR RW=0
- #define RW_SET RW=1
- #define EN_CLR EN=0
- #define EN_SET EN=1
- #define DataPort P0
- unsigned char ADC_value;
- float num;
- int k=0;
- void delay(int ms)
- {
- while(ms--)
- {
- unsigned char i;
- for(i=0;i<250;i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /*------------------------------------------------
- 判忙函数
- ------------------------------------------------*/
- bit LCD_Check_Busy(void)
- {
- DataPort= 0xFF;
- RS_CLR;
- RW_SET;
- EN_CLR;
- _nop_();
- EN_SET;
- return (bit)(DataPort & 0x80);
- }
- /*------------------------------------------------
- 写入命令函数
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- while(LCD_Check_Busy()); //忙则等待
- delay(5);
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 写入数据函数
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- while(LCD_Check_Busy()); //忙则等待
- delay(5);
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- _nop_();
- EN_CLR;
- }
- /*------------------------------------------------
- 清屏函数
- ------------------------------------------------*/
- void LCD_Clear(void)
- {
- LCD_Write_Com(0x01);
- delay(5);
- }
- /*------------------------------------------------
- 写入字符串函数
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xC0 + x); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s ++;
- }
- }
- /*------------------------------------------------
- 初始化函数
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38); /*显示模式设置*/
- delay(5);
- LCD_Write_Com(0x38);
- delay(5);
- LCD_Write_Com(0x38);
- delay(5);
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*显示关闭*/
- LCD_Write_Com(0x01); /*显示清屏*/
- LCD_Write_Com(0x06); /*显示光标移动设置*/
- delay(5);
- LCD_Write_Com(0x0C); /*显示开及光标设置*/
- }
-
- void timer0Iint()
- {
- g_sys5msflag = 0;
- TMOD = 0x01; //选择定时器工作方式(分成两个定时器用)
- TH0 = 0xee; //赋初值
- TL0 = 0x00; //赋初值
- EA = 1; //开总中断
- ET0 = 1; //允许T0定时器中断请求
- TR0 = 1; //控制定时器T0工作
- }
- void Time0_interrupt(void) interrupt 1
- {
- TH0 = 0xee;
- TL0 = 0x00;
- g_sys5msflag = 1;
- }
- void ADC_init() //ADC初始化
- {
- P1ASF = 0x80; //仅P1^0作为模拟输入
- ADC_RES = 0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDH;
- delay(1);
- }
- unsigned char GetADCResult(unsigned char ch) //获取ADC转换结果
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDH | ch | ADC_START;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- while(!(ADC_CONTR&ADC_FLAG));
- ADC_CONTR &= ~ADC_FLAG;
- return ADC_RES;
- }
- void process_init()
- {
- ADC_value = 128;
- num = 0;
- }
- void process() //数据处理
- {
- ADC_value = GetADCResult(0);
- num = ADC_value*5/1024;
- }
- void main() //主函数
- {
- unsigned char tw[15]={0};
- unsigned char bf[15]={0};
- timer0Iint();
- ADC_init();
- process_init();
- LCD_Init(); //初始化液晶
- delay(5); //延时有助于稳定
- LCD_Clear(); //清屏
- delay(100);
- LCD_Write_String(0,0,"hello");
- while(1)
- {
- if(g_sys5msflag == 1) //时间片为5ms,及每5ms循环一次
- {
- g_sys5msflag = 0;
- process();
- sprintf(tw,"%3.2f %x",num,ADC_value);
- sprintf(bf,"%d",k);
- LCD_Write_String(7,0,bf);
- LCD_Write_String(1,1,tw);
- k++;
- }
- }
- }
上官方下载实例然后仿真观察一下就知道哪里数据错误可
一步一步自制NE555等离子体扬声器详解 4月08日 第三届·无线通信技术研讨会 立即报名 12月04日 2015•第二届中国IoT大会 精彩回顾 10月30日ETF•智能硬件开发技术培训会 精彩回顾 10月23日ETF•第三届 消费
|