- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2024-11-19 22:19:37
已绑定手机
注册会员
- 积分
- 80
|
发表于 2024-11-16 16:47:05
|
显示全部楼层
重点是:使用SOP8 或DIP8
使用8脚的就有这种现象 使用16脚的就没有
是不是设置上还要设置什么
试过STC8G1K08A SOP8 DIP8 和AI8h2K12U SOP8 都是一样
现在是P33脚直接接5V电源也是一样 不存在电路板设计或干扰问题
以下下是我的程序,在上面三个型号上都是一上电 几秒钟后得到0值
而用16脚的STC8G1K08A DIP16、DIP20 或STC8H8k64U_SOP16 和以前的15W系都没这个问题,希望在这里能得到解决...
/**************************************************
*实验项目:ADC转换显示
*MCU 配置:STC8G1K08A(DIP8/SOP8) (1T 晶振11MHz)
**************************************************/
#include <REG51.H> //定义头文件 包含端口及各种特殊寄存器
sfr P4=0xC0; //端口4
sfr P5=0xC8; //端口5
#include <INTRINS.H> //包含内部函数 _nop_();空函数需要
//--------------- 定义端口功能 ----------------------
sbit SB0=P3^2; //功能按键
sbit LED=P5^5; //状态灯
sbit KA0=P5^4; //继电器
sbit SDA_1637=P3^1; //数据DIO
sbit SCL_1637=P3^0; //时钟CLK
bit Mzh=0; //转换显示
unsigned int DDadc; //读取模拟量 存放电流量值
unsigned int DDmax=0, DDmin=1000; //用于存放最大和最小值
//---------------- 端口初始化设置 --------------------------
sfr P0M1 = 0x93; //设置P0 端口模式寄存器
sfr P0M0 = 0x94; //
sfr P1M1 = 0x91; //设置P1 端口模式寄存器
sfr P1M0 = 0x92; //
sfr P2M1 = 0x95; //设置P2 端口模式寄存器
sfr P2M0 = 0x96; //
sfr P3M1 = 0xB1; //设置P3 端口模式寄存器
sfr P3M0 = 0xB2; //
sfr P4M1 = 0xB3; //设置P4 端口模式寄存器
sfr P4M0 = 0xB4; //
sfr P5M1 = 0xC9; //设置P5 端口模式寄存器
sfr P5M0 = 0xCA; //
/*===================================
STC8系端口初始化
====================================*/
void Port_Init(void) //端口初始化
{
P0M1 = 0x00; //0000 0000 设置P0全部为准双向模式
P0M0 = 0x00; //0000 0000
P1M1 = 0x00; //0000 0000 设置P1全部为准双向模式
P1M0 = 0x00; //0000 0000
P2M1 = 0x00; //0000 0000 设置P2全部为准双向模式
P2M0 = 0x00; //0000 0000
P3M1 = 0x08; //0000 1000 设置P3.3为高阻输入模式(读取模拟量)
P3M0 = 0x00; //0000 0000
P4M1 = 0x00; //0000 0000 设置P4全部为准双向模式
P4M0 = 0x00; //0000 0000
P5M1 = 0x00; //0000 0000 设置P5全部为准双向模式
P5M0 = 0x00; //0000 0000
}
//--------------------------------- 程序开始 ---------------------------------//
//--------------------------------------------------------------------------------//
/*===================================
1毫秒延时函数(1T 晶振12MHz)
====================================*/
void Delay1ms(unsigned char x)
{
unsigned char a,b;
for(;x>0;x--)
for(b=222;b>0;b--)
for(a=12;a>0;a--);
}//. . . . . . . . . . . . . . . . . .
//--------------------------------- 链接外部模块 ---------------------------------
//#include <EEPROM8.H> //包含IAPReadByte();IAPEraseSector();IAPWriteByte(,);
//#include <IIC_OLED12864.H>//显示模块 包含显示函数; OLED_Init(); //OLED初始化
//#include <MAX7219.H> //显示模块 包含显示函数display(H,L); Initial_MAX7219();//显示初始化
#include <TM1637.H> //包含display(x);Init_TM1637(); //TM1637初始化
//--------------------------------------------------------------------------------
//++++++++++++++++++++++++++++++++ ADC读取程序操作 ++++++++++++++++++++++++++++++++//
#define rAD0 GetADCResult(3) //读取模拟量 设定为P1^3脚 ***修改要把该端口设成高阻模式
/*-------------STC8H系列 与ADC相关地址声明----------*/
sfr ADC_CONTR = 0xBC; //控制寄存器
sfr ADC_RES = 0xBD; //转换结果高位寄存器
sfr ADC_RESL = 0xBE; //转换结果低位寄存器
sfr ADCCFG = 0xDE; //配置寄存器:设置转换结果保存格式和转换速度寄存器
#define ADCTIM (*(unsigned char volatile xdata *)0xFEA8) //ADC时序控制寄存器
/*-------设定ADC_CONTR寄存器的操作常量---------*/
#define ADC_POWER 0x80 //1000 0000 ADC电源控制位
#define ADC_START 0x40 //0100 0000 ADC启动转换控制位
#define ADC_FLAG 0x20 //0010 0000 ADC转换结束标志位
/*-------设定ADCCFG寄存器的操作常量---------*/
#define RESFMT 0x20
#define SPEED16 0x0F
/*----------------------------
Initial ADC sfr 寄存器初始化
----------------------------*/
void InitADC() //ADC初始化
{
ADCTIM = 0x3F; //设置ADC内部时序
ADCCFG = RESFMT | SPEED16; //设置对齐方式为高4位低8位 、时钟为系统时钟/2/16
}//. . . . . . . . . . . . . . . . . .
/*----------------------------
Get ADC result 模数转换
----------------------------*/
unsigned int GetADCResult(unsigned char ch)
{
unsigned int Temp = 0;
ADC_CONTR = ADC_POWER | ADC_START | ch ;
_nop_(); //查询前等待
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //等待FLAG为1即等待转换完成
ADC_CONTR &= ~ADC_FLAG; //清FLAG为0
Temp=ADC_RES*256+ADC_RESL;
return Temp; //返回 ADC结果
}//. . . . . . . . . . . . . . . . . .
//++++++++++++++++++++++++++++++ AD模块操作结束 ++++++++++++++++++++++++++++++//
/*===================================
主函数 --- 程序执行入口=== >>>>>>>>
====================================*/
void main()
{
Port_Init(); //端口初始化
InitADC(); //ADC寄存器初始化
Init_TM1637(); //TM1637初始化
while (1)
{
DDadc=rAD0;
if(DDadc > DDmax) DDmax=DDadc; //获取最大值
if(DDadc < DDmin) DDmin=DDadc; //获取最小值
if(SB0==0){Mzh=~Mzh; DDmin=1000; while(SB0==0); Delay1ms(200);}
if(Mzh==0)display(DDmin);else display(DDadc); //显示ADC结果
}
}//. . . . . . . . . . . . . . . . . .
//------------------------------ END ------------------------------
|
|