单片机/MCU论坛
登录
直播中
roov
7年用户
7经验值
擅长:测量仪表
私信
关注
[问答]
stc12c5a60s2单片机内部ADC读不到数值
开启该帖子的消息推送
adc
在
论坛
里面下载了前辈的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 定义功能
***it RS = P1^0; //定义端口
***it RW = P1^1;
***it 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
ti
mer0Iint()
{
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++;
}
}
}
回帖
(1)
曲海洋
2017-7-10 16:56:24
上官方下载实例然后仿真观察一下就知道哪里数据错误可
上官方下载实例然后仿真观察一下就知道哪里数据错误可
举报
更多回帖
rotate(-90deg);
回复
相关问答
adc
为什么
STC
-isp检测
不到
我的
单片机
(
STC12C5A60S2
)
2015-06-02
23047
kile 怎样添加
stc12c5a60s2
的头文件?使得可以编程
stc12c5a60s2
2014-03-28
6212
如何利用
stc12c5a60s2
单片机
去控制12864播放视频
2021-08-19
2068
AT89
C
51
单片机
和
STC12C5A60S2
可以同时使用吗
2023-04-09
327
自己焊接的
STC12C5A60S2
单片机
最小系统,用
STC
-ISP检测
不到
单片机
,
单片机
型号与串口号都对,最小系统原理图如下
2021-06-04
3906
stc12c5a60s2
芯片烧录不了
2019-09-09
3394
stc12c5a60s2
与
STC89C
51在延时上面的区别?
2013-07-29
21130
谁用过
STC12C5A60S2
的?
2014-07-05
4552
如何使用
STC12C5A60S2
单片机
将接收的数据作为占空比生成PWM
2013-05-30
2314
STC12C5A60S2
单片机
可以使用捕获模式测量占空比吗?
2015-08-15
4166
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分