#include "STC8G.h" //6路10位高速ADC(8路PWM可当8路D/A使用) 00 0000 0000
#include "intrins.h"
unsigned int dy;unsigned char tempData[9];/*MCU发送到串行口的数据*/unsigned char shuzi[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/*数组串行口显示数值用*/
void UartInit() //9600bps@11.0592MHz
{
SCON=0x50;/*8位数据,可变波特率*/AUXR|=0x40;/*定时器时钟1T模式*/AUXR& = 0xFE;/*串口1选择定时器1为波特率发生器*/TMOD&=0x0F;/*设置定时器模式*/
TL1=0xE0;/*设置定时初始值*/TH1=0xFE;/*设置定时初始值*/ET1= 0;/*禁止定时器%d中断*/TR1 = 1;/*定时器1开始计时*/
}
void LED1()
{
P5M1=0;P5M0=0x20;//推挽输出
}
void SendData(unsigned char dat)/* 串口发送字节数据函数 参数是你要发送的字节 */
{
SBUF = dat;/*把要发送的数据给了SBUF寄存器*/while(!TI);/*等待数据发送完成*/TI = 0;/*清除发送完成标志位*/
}
void SendString(unsigned char *puf) //发送一个字符串
{
while(*puf!='\0')/*遇到空格跳出循环*/{SendData(*puf);puf++;}SendData('\r');/*回车*/SendData('\n');/*换行*/
}
void adccx() //?只有8位数据 255
{
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR& 0x20));//查询ADC完成标志
ADC_CONTR& = ~0x20; //清完成标志
//dy = ADC_RES+ADC_RESL; //只读取8位ADC结果
ADC_RESL=ADC_RESL&0XC0; //读取10位的低字节2位
dy = (ADC_RES<< 2)|ADC_RESL>>6;//读取10位ADC结果
}
void adczh()
{
adccx();tempData[0]=shuzi[dy/1000]; tempData[1]=shuzi[dy%1000/100];tempData[2]=shuzi[dy%100/10]; tempData[3]=shuzi[dy%10];
SendString(tempData);//由0-9发送串口数值
}
void main()
{
unsigned char x =0; /* 定义一个8位变量 用于接收串口接收的字节 */
P5M0 = 0x00;P5M1 = 0x10; /*设置ADC4(P5.4)为ADC口*/LED1(); /* IO设置*/ UartInit(); // 串口初始化
P_SW2 |= 0x80;ADCTIM = 0x3f;/*设置ADC内部时序*/P_SW2& = 0x7f;ADCCFG = 0x0f;/*设置ADC时钟为系统时钟/2/16*/ADC_CONTR = 0x80;/*使能ADC模块*/
while (1)
{
adczh();
if (RI)// 如果串口接收到数据
{
RI = 0; //清中断标志
x =SBUF;
SendData(SBUF); // 把接收的数据再发送出去
if (x == 0x02)
{
P55 = !P55; //翻转led状态
}
}
}
}
void Uart() interrupt 4
{
if (RI)/*接收中断标志位*/{RI = 0;/*清除RI位*/}if (TI)/*发送中断标志位*/{TI = 0;/*清除TI位*/}
}
#include "intrins.h"
unsigned int dy;unsigned char tempData[9];/*MCU发送到串行口的数据*/unsigned char shuzi[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/*数组串行口显示数值用*/
void UartInit() //9600bps@11.0592MHz
{
SCON=0x50;/*8位数据,可变波特率*/AUXR|=0x40;/*定时器时钟1T模式*/AUXR& = 0xFE;/*串口1选择定时器1为波特率发生器*/TMOD&=0x0F;/*设置定时器模式*/
TL1=0xE0;/*设置定时初始值*/TH1=0xFE;/*设置定时初始值*/ET1= 0;/*禁止定时器%d中断*/TR1 = 1;/*定时器1开始计时*/
}
void LED1()
{
P5M1=0;P5M0=0x20;//推挽输出
}
void SendData(unsigned char dat)/* 串口发送字节数据函数 参数是你要发送的字节 */
{
SBUF = dat;/*把要发送的数据给了SBUF寄存器*/while(!TI);/*等待数据发送完成*/TI = 0;/*清除发送完成标志位*/
}
void SendString(unsigned char *puf) //发送一个字符串
{
while(*puf!='\0')/*遇到空格跳出循环*/{SendData(*puf);puf++;}SendData('\r');/*回车*/SendData('\n');/*换行*/
}
void adccx() //?只有8位数据 255
{
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR& 0x20));//查询ADC完成标志
ADC_CONTR& = ~0x20; //清完成标志
//dy = ADC_RES+ADC_RESL; //只读取8位ADC结果
ADC_RESL=ADC_RESL&0XC0; //读取10位的低字节2位
dy = (ADC_RES<< 2)|ADC_RESL>>6;//读取10位ADC结果
}
void adczh()
{
adccx();tempData[0]=shuzi[dy/1000]; tempData[1]=shuzi[dy%1000/100];tempData[2]=shuzi[dy%100/10]; tempData[3]=shuzi[dy%10];
SendString(tempData);//由0-9发送串口数值
}
void main()
{
unsigned char x =0; /* 定义一个8位变量 用于接收串口接收的字节 */
P5M0 = 0x00;P5M1 = 0x10; /*设置ADC4(P5.4)为ADC口*/LED1(); /* IO设置*/ UartInit(); // 串口初始化
P_SW2 |= 0x80;ADCTIM = 0x3f;/*设置ADC内部时序*/P_SW2& = 0x7f;ADCCFG = 0x0f;/*设置ADC时钟为系统时钟/2/16*/ADC_CONTR = 0x80;/*使能ADC模块*/
while (1)
{
adczh();
if (RI)// 如果串口接收到数据
{
RI = 0; //清中断标志
x =SBUF;
SendData(SBUF); // 把接收的数据再发送出去
if (x == 0x02)
{
P55 = !P55; //翻转led状态
}
}
}
}
void Uart() interrupt 4
{
if (RI)/*接收中断标志位*/{RI = 0;/*清除RI位*/}if (TI)/*发送中断标志位*/{TI = 0;/*清除TI位*/}
}
评分
把主函数那ADC_ADC_CONTR = 0x80;/*使能ADC模块*/ 修改成 = 0x84;/*使能ADC模块 打开ADC模块 将ADC引脚设置到P5.4*/
以下是ADC5-0通道选择:0x85 0x84 0x83 0x82 0x81 0x80
/*低位权值:8421。 P3.0/ADC0:0000 P3.1/ADC1:0001 P3.2/ADC2:0010 P3.3/ADC3:0011 P5.4/ADC4:0100 P5.5/ADC5:0101*/
以下是ADC5-0通道选择:0x85 0x84 0x83 0x82 0x81 0x80
/*低位权值:8421。 P3.0/ADC0:0000 P3.1/ADC1:0001 P3.2/ADC2:0010 P3.3/ADC3:0011 P5.4/ADC4:0100 P5.5/ADC5:0101*/
“dy = (ADC_RES<< 2)|ADC_RESL>>6;//读取10位ADC结果”
这句确定可以正常运行吗?ADC_RES是8位的值,左移两位就会把高两位结果丢掉
应该先把ADC_RES的值赋值给一个16位变量后再左移
这句确定可以正常运行吗?ADC_RES是8位的值,左移两位就会把高两位结果丢掉
应该先把ADC_RES的值赋值给一个16位变量后再左移
感谢楼主精彩分享! 如有需要也可参考STC-ISP 6.91J一体化软件范例程序:下载STC8G系列ADC-基本操作(查询方式)范例代码
#include "reg51.h"
#include "intrins.h"
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
sfr ADCCFG = 0xde;
sfr P_SW2 = 0xba;
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P1M0 = 0x00; //设置P1.0为ADC口
P1M1 = 0x01;
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2& = 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x80; //使能ADC模块
while (1)
{
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR& 0x20)); //查询ADC完成标志
ADC_CONTR& = ~0x20; //清完成标志
P2 = ADC_RES; //读取ADC结果
}
}
#include "reg51.h"
#include "intrins.h"
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
sfr ADCCFG = 0xde;
sfr P_SW2 = 0xba;
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P1M0 = 0x00; //设置P1.0为ADC口
P1M1 = 0x01;
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2& = 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x80; //使能ADC模块
while (1)
{
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR& 0x20)); //查询ADC完成标志
ADC_CONTR& = ~0x20; //清完成标志
P2 = ADC_RES; //读取ADC结果
}
}