51单片机的D/A转换 TLC5615的一个程序问题 51单片机AD转换实验,电路和程序

51\u5355\u7247\u673a\u7a0b\u5e8f\u95ee\u9898 stc12c5a60s2 \u7684a/d\u8f6c\u6362\u95ee\u9898..

\u597d\u5427\uff0c\u5148\u58f0\u660e\u6211\u4e5f\u6b63\u5728\u5b66\u5355\u7247\u673a\uff0c\u56de\u7b54\u53ef\u80fd\u4e0d\u4e13\u4e1a\uff0c\u56e0\u4e3aAD\u95ee\u9898\u6211\u53ea\u63a5\u89e6\u8fc7\u4e00\u6b21\u3002\u4ee5\u4e0b\u7ed3\u8bba\u6765\u7740STC12\u7684\u624b\u518c\u3002
1.\u8f6c\u6362\u7684\u5f15\u811a\u7531ADC_CONTG\u7684\u4f4e3\u4f4dCHS2\u3001CHS1\u548cCHS0\u63a7\u5236\uff0c\u4e09\u4f4d\u4e8c\u8fdb\u5236\u80fd\u8868\u793a0~7\u516b\u4e2a\u6570\uff0c\u4e0eP1\u53e3\u4e00\u4e00\u5bf9\u5e94\u3002ADC\u7684\u7ed3\u6784\u51b3\u5b9a\u4e86\u5b83\u4e00\u6b21\u53ea\u80fd\u8f6c\u6362\u4e00\u4e2a\u53e3\uff0c\u4f46\u662fSTC\u7684\u8f6c\u6362\u901f\u5ea6\u8fbe\u523010\u4e07\u6b21/\u79d2\uff0c\u4f9d\u6b21\u8f6c\u6362P1.0\u548cP1.1\u4e0e\u540c\u65f6\u8f6c\u6362\u5dee\u522b\u4e0d\u5927\u3002\u8bbe\u7f6eP1.0\u65f6\uff0cch=0x00.\u8bbe\u7f6eP1.1\u65f6\uff0cch=0x01.
2.\u662f\u6309\u7167\u4e00\u4e2a\u5b57\u8282\u8bfb\u7684\uff0c\u76f4\u63a5\u8bfbADC_RES\u7684\u8bdd\u53ea\u80fd\u8bfb\u5230\u6570\u636e\u7684\u9ad8\u516b\u4f4d\u3002\u53ea\u75288\u4f4dADC\u8f6c\u6362\u7684\u8bdd\uff0c\u8bfbADC_RES\u5c31\u53ef\u4ee5\u4e86\u3002\u8981\u60f3\u5f97\u523010\u4f4d\u6570\u636e\u5fc5\u987b\u52a0\u4e0aSendData(ADC_LOW2);
3.\u65e2\u7136send\u51fd\u6570\u63d0\u5230\u4e86SBUF\uff0c\u90a3\u4e48\u8bf4\u660e\u8f6c\u6362\u7ed3\u679c\u662f\u901a\u8fc7\u4e32\u53e3\u4f20\u5230\u7535\u8111\u4e0a\uff0c\u7528STC\u4e0b\u8f7d\u5de5\u5177\u7684\u4e32\u53e3\u8c03\u8bd5\u5e94\u8be5\u53ef\u4ee5\u770b\u5230\u8f6c\u6362\u7ed3\u679c\u3002
4.\u8fde\u7eed\u8bfb\u53d6\u53ef\u4ee5\u7528\u51fd\u6570\u5faa\u73af\u6216\u5b9a\u65f6\u5668\u5faa\u73af\u6765\u8c03\u7528\u8f6c\u6362\u51fd\u6570\u3002\u4f8b\u5b50\u561b\uff0c\u5b9a\u65f6\u5668\u6211\u8fd8\u4e0d\u4f1a\u7528\u800c\u4f60\u7ed9\u7684\u503c\u5b9a\u65f6\u5668\u4e2d\u65ad\u6cd5\u3002\u6240\u4ee5\u6211\u8bf4\u4e0b\u51fd\u6570\u7684\u65b9\u6cd5\uff0c\u5927\u6982\u662f\u8fd9\u6837\uff1a
void main{
InitADC();//\u521d\u59cb\u5316ADC
while(1){//\u6b7b\u5faa\u73af
adc_isr();//\u8f6c\u6362\u51fd\u6570
delay(xx);//\u5ef6\u65f6\u4e00\u6bb5\u65f6\u95f4\uff0c\u5426\u5219\u8f6c\u6362\u592a\u5feb\uff0c\u6570\u636e\u91cf\u592a\u5927\u3002
}
}
5.UART\u662f\u4e00\u79cd\u901a\u7528\u4e32\u884c\u6570\u636e\u603b\u7ebf\uff0c\u5728\u8fd9\u91cc\u662f\u7528\u4e8e\u4e0e\u7535\u8111\u8fdb\u884c\u4e32\u53e3\u901a\u4fe1\u7684\u3002

#include
#include
#include

// define P1.0 to check STATUS.
sbit STATUS = P1^0;

unsigned char xdata CTRL _at_ 0x2FFF;
unsigned char xdata ADSEL _at_ 0x4FFF;
unsigned char hByte;
unsigned char lByte;

void adc_Convert (void)
{ // Start a conversion with A0 and A/$C$ low.
// The convesion takes place on rising CE edge.
CTRL = 0x00;
ADSEL = 0x00;
// Wait until we have completed a conversion .
while(STATUS==1);
// Set R/$C$ with A0 low and read the low byte.
CTRL = 0x02;
hByte = ADSEL;
// Set R/$C$ with A0 high and read the high.
CTRL = 0x03;
lByte = ADSEL;
}


void main(void)
{ unsigned int delay, MSB , LSB, adc_Res;
// Initialize serial interface
SCON = 0xDA; // SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xFD; // TH1: reload value for 1200 baud @ 12MHz */
TR1 = 1; // TR1: timer 1 run */
TI = 1; // TI: set TI to send first char of UART */

while(1)
{ adc_Convert();
MSB=(unsigned int)(hByte << 4);
LSB=(unsigned int)(lByte >> 4);
// adc_Res now has the converted data with 12-bit resolution.
adc_Res = MSB + LSB;
// Send adc results to the serial interface
printf("ADC READINGS: %03Xh\n", adc_Res);
// simple delay - it is mcu clock dependent !
for (delay=0; delay<10000; delay++)
;
}
}

这里的逻辑好像有问题
for(j=0;j<12;j++)
{
if(dat&0x8000)
din=1;
else
{ din=0;
clk=1;
dat<<=1; //左移一位,并且使其有时间读入数据
clk=0;}
你的ELSE 后面的第一条语句算其条件语句,后面2条每次循环都执行了,要在ELSE后面条件满足的几条语句加个大括号。

void input(uint dat)
{
uchar j;

clk=0;
cs=0;
dat<<=6;
for(j=0;j<12;j++)
{
if(dat&0x0800)//是不是这里啊。
din=1;
else
din=0;
clk=1;
dat<<=1; //左移一位,并且使其有时间读入数据
clk=0;

}

cs=1;
}
应该这样吧,你的for循环转换的是12位的啊,如果12位,那你输入256的结果应该是5*256/4096啊,你仔细检查一下你的位数,包括for循环、还有if(dat&0x0800)里面的常数。

  • 楂樻墜璇疯繘!51鍗曠墖鏈鎬庢牱鐢↖/O妫娴嬬數鑴戠殑USB鍙鐨凞+鎴栬匘-
    绛旓細鑳屾櫙锛氱數鑴戠殑USB鍙鐨凞+鍜孌-涓婂垎鍒笅鎷15k娆х數闃伙紝鐢ㄤ簬妫娴嬪苟璇嗗埆USB楂橀熻澶囧拰浣庨熻澶囥傛垜鎯崇敤鍗曠墖鏈虹殑IO鍙f潵妫娴嬭繖涓や釜鑴氾紝浠ユ鏉ュ垽鏂垜鐨勭數璺槸鍚︽帴鍏ュ埌鐢佃剳鐨刄SB鍙c備絾鏄疘/O鏈変笂鎷夌數闃伙紝瀹冧細琚數鑴戣瘑鍒垚涓涓猆SB璁惧锛岃繖涓嶆槸鎴戞兂瑕佺殑銆傛垜甯屾湜鍦ㄤ笉琚數鑴戣瘑鍒垚USB璁惧鐨勫墠鎻愪笅锛屾娴嬪埌鐢佃剳USB鐨凞...
  • 51鍗曠墖鏈轰腑cbyte瀛樺偍鍖,xbyte,dbyte,pbyte瀛樺偍鍖烘湁浠涔堜笉鍚
    绛旓細CBYTE鐢ㄦ潵璁块棶rom锛岀敤鍒癿ovc鎸囦护銆俋BYTE鐢ㄦ潵璁块棶鎵╁睍ram鐨勶紝浣跨敤movx鎸囦护锛宒ptr褰撴寚閽堛侱BYTE鐢ㄦ潵缁濆璁块棶鐗囧唴ram涓殑鏁版嵁鐨勩侾BYTE涔熺敤鏉ヨ闂墿灞時am锛屼絾鍙兘璁块棶寮濮嬬殑256瀛楄妭锛屽嵆movx鎸囦护锛孯0鎴朢1褰撴寚閽堛傝繖鍑犱釜瀹忕敤浜51鍗曠墖鏈虹殑缁濆鍦板潃璁块棶銆備笂闈4涓槸鍗曞瓧鑺傝闂紝瀵瑰簲鍙屽瓧鑺傝闂敤涓嬮潰4涓侰WORD銆乆...
  • 51鍗曠墖鏈p0鍙f帴鏁扮爜绠bcdefg鍙互鐩存帴杩炴帴鍚椼 閭e彟澶栦竴杈1234鏄帴浠...
    绛旓細浣犺繖鍙兘鏄竴涓洓浣嶇殑鏁扮爜鏄剧ず[鎸囧彲鏄剧ず鍥涗釜(浣)鏁板瓧鐨刔,濡傛灉鏄偅瀛楁瘝灏辨槸鐢辨渶涓婁竴妯紑濮嬮『鏃堕挓鏂瑰悜杞渶鍚庝腑闂寸殑姣忔(鍏变竷娈靛啀鍔犲皬鏁扮偣,55555555浣犺繖濂借薄娌℃湁,瑕佷笉灏辨槸浣犳墦浜嗘紡浜"Dp")寮曞嚭鑴,1234鍒嗗埆鏄瘡涓涓綅鐨勫叕鍏卞紩鍑鸿剼,鍗曠墖鏈涓婃渶濂介夌敤杩欏叕鍏辫剼鏄帴姝f瀬鐢垫簮涓婄殑,杩欏彨鍏遍槼,鍙嶅垯鍙嶄箣....
  • 51鍗曠墖鏈鎺у埗DAC0832浜х敓姝e鸡娉,濡備綍鐢ㄥ畾鏃跺櫒鏀瑰彉棰戠巼,姹備唬鐮!_鐧惧害...
    绛旓細鍙互鐢ㄤ竴涓畾鏃跺櫒涓柇锛屽湪涓柇鏈嶅姟绋嬪簭閲岄潰锛岀洿鎺ユ妸瀵瑰簲鐨勬寮﹂噰鏍锋暟鎹疆鍏1鍙o紝閫氳繃淇敼瀹氭椂鍣ㄧ殑涓柇闂撮殧锛岃揪鍒拌皟鏁磋緭鍑洪鐜囩殑鐩殑锛涘亣璁句綘鐨勯噰鏍锋暟鎹殑鍘熷閲囨牱鐜囦负1KHz, 琚噰鏍锋寮︽尝棰戠巼涓100Hz,褰揟imer涓柇闂撮殧涓1ms鏃讹紝DAC閭i噷杈撳嚭澶勭悊鍚庤緭鍑哄嵆涓100Hz, 濡傛灉涓柇闂撮殧涓500us,杈撳嚭灏辨槸200Hz static ...
  • 51鍗曠墖鏈椹卞姩鏁扮爜绠,P0鍙g洿鎺ユ帴娈甸塧,b,c,d鈥︹﹀彲浠ュ悧?闇瑕佹帴椹卞姩?杩 ...
    绛旓細濡傛灉鏄叡闃崇殑鏁扮爜绠★紝鏄彲浠ョ殑锛屽鏋滄槸鍏遍槾鐨勫氨瑕佸姞涓婃媺鐢甸樆锛屼竴鑸數闃诲兼槸10K銆傚笇鏈涘彲浠ュ府鍒颁綘锛屽彟鎴戣繖鏈8鑴 14鑴鍗曠墖鏈銆傘傚路 锟 闇%瑕侊紝鐧惧害HI鎴戝惂銆
  • 51鍗曠墖鏈虹殑鍔犳硶鎸囦护,D7,D6浣嶅彧鏈変竴涓湁杩涗綅鏃,(ov)=1?
    绛旓細OV鏄孩鍑轰綅锛屽湪鏈夌鍙锋暟鍔犳硶杩愮畻鏃讹紝濡傛灉2涓鏁扮浉鍔狅紝搴旇杩樹负姝f暟锛屽61H+1AH=7BH锛涗絾锛屽鏋2涓鏁扮浉鍔狅紝缁撴灉涓鸿礋鏁颁簡锛岄偅灏辫偗瀹氶敊浜嗭紒濡61H+2AH=8BH锛屽氨鏄敊璇殑浜嗐傚悓鐞嗭紝2涓礋鏁扮浉鍔狅紝搴旇杩樹负璐熸暟锛屽92H+8AH=9CH 鍦ㄦ湁绗﹀彿鏁板姞娉曡繍绠楁椂锛屽彲浠ヤ笉鑰冭檻CY浣 鍦ㄦ棤绗﹀彿鏁板姞娉曡繍绠楁椂锛屽彲浠...
  • 51鍗曠墖鏈姹囩紪璇█缂栫▼闂
    绛旓細SETB 01H锛屽氨鏄妸20H鍗曞厓閲岄潰鐨凞1浣嶇疆涓銆傝鍗曞厓鐨勫唴瀹硅涓猴細D7D6D5...D1D0锛 D1=1锛岃瀛楄妭鐨勬暟鍊煎氨鏄0000 0010锛屽氨鏄02H銆
  • 51鍗曠墖鏈虹殑鍦板潃闂(浣嶅湴鍧鍜屽瓧鑺傚湴鍧)
    绛旓細1. 8051鐨勫唴閮≧AM鑳戒綔涓虹敤鎴稲AM鍖虹殑鍙湁00~7FH锛屽彲浠ョ敤鐩存帴瀵诲潃鎴栧瘎瀛樺櫒闂存帴瀵诲潃锛80H~FFH鏄疭FR锛屾斁浜嗕簺鐗规畩鍔熻兘瀵勫瓨鍣紝鍙兘鐢ㄧ洿鎺ュ鍧锛2. 浣嶅湴鍧00~7FH鍜岀墖鍐匯AM瀛楄妭鍦板潃00~7FH鍙槸鍦板潃鐨勭О鍛间竴鏍凤紝浠h〃鐨勫惈涔変笉鍚岋紝浣嶅湴鍧鍙兘鐢ㄤ綅瀵诲潃锛3. 鍏蜂綋鐨勫湴鍧鏄彧鑳介氳繃鎸囦护鏉ュ尯鍒嗐傚叾瀹炴ゼ涓荤殑鐞嗚В杩樻槸...
  • 鍏充簬51鍗曠墖鏈AD杞崲鍒濈骇闂
    绛旓細sbit rd=P1^1; //璇绘暟鎹帶鍒,浣庣數骞虫湁鏁 sbit wr=P1^2; //AD杞崲璧峰姩鎺у埗,涓婂崌娌挎湁鏁 sbit intr=P1^3; //AD杞崲缁撴潫杈撳嚭浣庣數骞 void start_ad(void){ cs=0; //鍏佽杩涜A/D杞崲 wr=0;_nop_();wr=1; //WR鐢变綆鍙橀珮鏃,AD寮濮嬭浆鎹 while(intr); //鏌...
  • 鐢ㄦ寚浠ゅ疄鐜51鍗曠墖鏈瀵圭疮鍔犲櫒A,D6D2D1鐨勬竻闆,缃竴,鍙栧弽
    绛旓細浣犵殑鎰忔濇槸锛鍗曠墖鏈虹殑i/o鍙f帴鏈夊彂鍏変簩鏋佺D1銆丏2銆丏6锛屾槸鍚э紵D1 BIT P0.1 ;璁綝1鎺0.1 D2 BIT P0.2 D6 BIT P0.6 CLR A ;绱姞鍣ˋ娓呴浂 SETB A ;绱姞鍣ㄧ疆1 CLR D1 ;D1娓呴浂锛岀偣浜 SETB D2 ;D2缃1锛岀唲鐏 CPL D6 ;D6鍙栧弽锛岃鍘熸潵浜潃...
  • 扩展阅读:51job ... 51仿真器 ... 51单片机入门自学 ... 51单片机入门代码 ... 51单片机常见型号 ... 51cto ... 宏程序#代码 ... 51单片机编程全集 ... 基于51单片机的简单项目 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网