欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
用STC12C5616AD單片機的AD模塊碰到了一些問題
[打印本頁]
作者:
loveDNF四
時間:
2019-7-2 21:33
標題:
用STC12C5616AD單片機的AD模塊碰到了一些問題
大家好,最近有個項目可能會用到標題中的12C5616AD單片機,在用它的AD模塊時遇到了一些障礙代碼如下,基本就是檢測一個IO口的電壓,然后通過這個電壓來控制另一個IO口的高低,但是燒進去之后并沒有反應,仿真之后發現,
ADC_CONTR這個寄存器雖然被賦值了,但是AD根本沒有啟動轉換,ADC_FLAG這一位始終沒有變1。
特來請教,有沒有同樣遇到這個問題的。
頭文件什么的還用過STC12C5630AD.H,KEIL中device也選的STC對應型號,但是仿真發現,ADC_CONTR寄存器根本不能賦值。
單片機源程序如下:
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
//-----------------------------------------------
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000) //1T模式
sfr AUXR = 0x8e;
sfr ADC_CONTR = 0xC5; //ADC control register
sfr ADC_DATA = 0xC6; //ADC high 8-bit result register
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
sfr P1M0 = 0x91; //P1 mode control register0
sfr P1M1 = 0x92;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
#define ADC_POWER 0x80 //ADC電源控制位10000000
#define ADC_FLAG 0x10 //ADC完成標志00010000
#define ADC_START 0x08 //ADC起始控制位00001000
#define ADC_SPEED 0x60 //90個時鐘
void Delay(u16 n);
void InitADC();
u16 ADC();
u8 ch = 7; //ADC通道號
u16 i;
void main()
{
InitADC(); //初始化ADC
while (1)
{
i=ADC();
if(i>512)
{
P10 = 1;
}
else P10 = 0;
}
}
void InitADC()
{
P1M0 = P1M1 = 0x80;
ADC_DATA = 0; //Clear previous result
ADC_CONTR |= 0x80;
Delay(256); //ADC上電并延時
}
u16 ADC()
{
ADC_DATA=0;
ADC_CONTR=0x60;
ADC_CONTR=0xE0;
ADC_CONTR=0xE7;
Delay(256);
ADC_CONTR=0xEF;
while(1)
{
if(ADC_CONTR & 0x10) //1110 1111 & 0001 0000
{
break;
}
}
ADC_CONTR=0xE7;//1110 0111
return ((ADC_DATA<<8)|ADC_LOW2);
}
void Delay(u16 n)
{
u16 x;
while (n--)
{
x = 5000;
while (x--);
}
}
復制代碼
作者:
angmall
時間:
2019-7-3 21:57
12C5616AD單片機 KEIL不能仿真AD轉換
給你改了,對比一下就知道哪里錯了。
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
//-----------------------------------------------
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000) //1T模式
sfr AUXR = 0x8e;
sfr ADC_CONTR = 0xC5; //ADC control register //ADC控制寄存器
sfr ADC_DATA = 0xC6; //ADC high 8-bit result register //ADC轉換結果高位寄存器
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register //ADC轉換結果低位寄存器
sfr P1M0 = 0x91; //P1 mode control register0
sfr P1M1 = 0x92;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
#define ADC_POWER 0x80 //ADC電源控制位10000000
#define ADC_FLAG 0x10 //ADC完成標志00010000
#define ADC_START 0x08 //ADC起始控制位00001000
#define ADC_SPEED 0x60 //90個時鐘
void Delay(u16 n);
void InitADC();
u16 ADC();
u8 ch = 7; //ADC通道號 //設置 P1.7 為ADC 采樣通道
u16 i;
void main()
{
InitADC(); //初始化ADC
while (1)
{
i=ADC();
if(i>512)
{
P10 = 1;
}
else P10 = 0;
}
}
void InitADC()
{
P1M0 = P1M1 = 0x80;
ADC_DATA = 0; //Clear previous result
ADC_CONTR = 0x80; //ADC_POWER 80 | ADC_SPEEDLL 00
Delay(256); //ADC上電并延時
}
u16 ADC()
{
u16 ADCResult=0;
//ADC_DATA=0;
//ADC_CONTR=0x60;
//ADC_CONTR=0xE0;
//ADC_CONTR=0xE7;
//Delay(256);
ADC_CONTR=0x8F; // ADC_POWER 80 | ADC_SPEEDLL 00 | ch 07 | ADC_START 08
_nop_(); //Must wait before inquiry
_nop_(); //等待4個NOP
_nop_();
_nop_();
while(1) //等待ADC轉換完成
{
if(ADC_CONTR & 0x10) //1110 1111 & 0001 0000
{
break;
}
}
//ADC_CONTR=0xE7;//1110 0111
ADC_CONTR &= ~0x10; //Close ADC
ADCResult= ADC_DATA; //ADC轉換高位結果
ADCResult= ((ADCResult<<8)| ADC_LOW2); //ADC轉換結果
return (ADCResult); //Return ADC result
}
void Delay(u16 n)
{
u16 x;
while (n--)
{
x = 5000;
while (x--);
}
}
復制代碼
作者:
buzm
時間:
2019-7-4 21:01
借用了adc初始化函數和ADC轉換函數,但不知道怎么改引腳(ADC轉換通道),能幫一下忙嗎?謝謝。
作者:
老來所學
時間:
2023-4-20 21:28
angmall 發表于 2019-7-3 21:57
12C5616AD單片機 KEIL不能仿真AD轉換
給你改了,對比一下就知道哪里錯了。
AD程序沒反應
作者:
coody_sz
時間:
2023-4-21 13:31
到STC官網下一個例子試試吧,很老的IC了。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1