![]() |
發布時間: 2017-12-6 08:55
正文摘要:我用74HC595,串專并輸出到數碼管,但是不能正常輸出,麻煩大佬們幫我看下程序,也給我點用這個單片機檢測電壓并輸出到數碼管的建議,蟹蟹#include "reg51.h" #include "intrins.h" #define FOSC 18432000L ... |
采樣到的數據應該要進行冒泡法處理過后比較好吧 |
聽說中斷函數不能太長,我就把AD數據處理函數移動到了while里,如下:
![]() 最后附上最新修改的全程序:
|
17771904441 發表于 2017-12-6 21:48 還是不行的 我的改進如下 |
菁華如風 發表于 2017-12-6 21:11 ADC_CONTR&=!ADC_FLAG; // 清除ADC中斷標志 應改為ADC_CONTR&=~ADC_FLAG; |
HC6800-ES-V2.0 發表于 2017-12-6 10:31 現在可以正常顯示了,但是無法及時更新AD檢測的值,要重新上電,并且先給595供電才能正常地顯示新的數值 ![]() |
wulin 發表于 2017-12-6 12:45 不是的啊,我在main函數里進行了ADC的初始化,在ADC初始化函數里是打開了AD轉換的
謝謝你認真看了我的代碼。我又檢查了下,是我昨天把數碼管的高低位連接亂了(尷尬……),但是,現在的問題是,AD轉換的數值不會及時更新,要斷電后重新上電才能檢測到新的待測電壓。由于手頭沒有74HC595的芯片,所以借用單片機上的,因此595和STC15W408AS單片機是分別供電的。這又出現了個問題,要先打開595的電源,再給單片機供電才能正常顯示………… |
你屏蔽了BYTE GetADCResult(BYTE ch)就不會發生ADC轉換中斷,所有程序都在中斷里運行,這怎么跑得起來? |
程序太長,沒時間仔細看。只看清楚了你的ADC設置。 你的595沒有初始化,應該是問題所在吧。 主函數里,加一句:Hc595SendByte(0x00); 我有一個例子程序,是用ADC讀搖桿的,用串口發送數據。 #include <STC15F2K60S2.H> #include <intrins.h> unsigned int ADCdate; unsigned char ADC_XS[4]; void Delay500ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 22; j = 3; k = 227; do { do { while (--k); } while (--j); } while (--i); } void UartInit(void) //9600bps@11.0592MHz { SCON = 0x50; AUXR = 0x40; TMOD &= 0x00; TL1 = 0xE0; TH1 = 0xFE; ET1 = 0; TR1 = 1; } void ADCInit (void)//ADC設置 { P1ASF=0x03;//P10、P11為ADC輸入口。 CLK_DIV=0x20;//ADC轉換結果存放方式 } void ADCXX(void) { ADC_XS[3]=(ADCdate/1000)+0x30; ADC_XS[2]=((ADCdate%1000)/100)+0x30; ADC_XS[1]=((ADCdate%100)/10)+0x30; ADC_XS[0]=((ADCdate%10)/1)+0x30; } void ADC0 (void) { ADC_CONTR=0xe8; while (!(ADC_CONTR&0x10)); ADC_CONTR=0x00; ADCdate=ADC_RES; ADCdate=(ADCdate<<8); ADCdate=(ADCdate|ADC_RESL); ADCXX(); } void ADC1 (void) { ADC_CONTR=0xe9; while (!(ADC_CONTR&0x10)); ADC_CONTR=0x00; ADCdate=ADC_RES; ADCdate=(ADCdate<<8); ADCdate=(ADCdate|ADC_RESL); ADCXX(); } void UART (void) { SBUF=ADC_XS[3]; while (!TI); TI=0; SBUF=ADC_XS[2]; while (!TI); TI=0; SBUF=ADC_XS[1]; while (!TI); TI=0; SBUF=ADC_XS[0]; while (!TI); TI=0; } void main(void) { P0M1 = 0; P0M0 = 0; P1M1 = 0; P1M0 = 0; P2M1 = 0; P2M0 = 0; P3M1 = 0; P3M0 = 0; P4M1 = 0; P4M0 = 0; P5M1 = 0; P5M0 = 0; UartInit(); ADCInit(); while(1) { if (P12==0) { P55=~P55;//此法只是為了驗證搖桿的按鍵功能,掃描不到就不行。 } ADC0(); UART(); SBUF=' '; while (!TI); TI=0; SBUF=' '; while (!TI); TI=0; ADC1(); UART(); SBUF='\r'; while (!TI); TI=0; SBUF='\n'; while (!TI); TI=0; Delay500ms(); } } 頭文件STC15F2K60S2.H #ifndef __STC15F2K60S2_H_ #define __STC15F2K60S2_H_ ///////////////////////////////////////////////// //注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關的IO口均為 // 高阻態,需將這些口設置為準雙向口或強推挽模式方可正常使用 //相關IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 // P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 ///////////////////////////////////////////////// ///////////////////////////////////////////////// //包含本頭文件后,不用另外再包含"REG51.H" //內核特殊功能寄存器 // 復位值 描述 sfr ACC = 0xE0; //0000,0000 累加器Accumulator sfr B = 0xF0; //0000,0000 B寄存器 sfr PSW = 0xD0; //0000,0000 程序狀態字 sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; sfr SP = 0x81; //0000,0111 堆棧指針 sfr DPL = 0x82; //0000,0000 數據指針低字節 sfr DPH = 0x83; //0000,0000 數據指針高字節 //I/O 口特殊功能寄存器 sfr P0 = 0x80; //1111,1111 端口0 sbit P00 = P0^0; sbit P01 = P0^1; sbit P02 = P0^2; sbit P03 = P0^3; sbit P04 = P0^4; sbit P05 = P0^5; sbit P06 = P0^6; sbit P07 = P0^7; sfr P1 = 0x90; //1111,1111 端口1 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; sfr P2 = 0xA0; //1111,1111 端口2 sbit P20 = P2^0; sbit P21 = P2^1; sbit P22 = P2^2; sbit P23 = P2^3; sbit P24 = P2^4; sbit P25 = P2^5; sbit P26 = P2^6; sbit P27 = P2^7; sfr P3 = 0xB0; //1111,1111 端口3 sbit P30 = P3^0; sbit P31 = P3^1; sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4; sbit P35 = P3^5; sbit P36 = P3^6; sbit P37 = P3^7; sfr P4 = 0xC0; //1111,1111 端口4 sbit P40 = P4^0; sbit P41 = P4^1; sbit P42 = P4^2; sbit P43 = P4^3; sbit P44 = P4^4; sbit P45 = P4^5; sbit P46 = P4^6; sbit P47 = P4^7; sfr P5 = 0xC8; //xxxx,1111 端口5 sbit P50 = P5^0; sbit P51 = P5^1; sbit P52 = P5^2; sbit P53 = P5^3; sbit P54 = P5^4; sbit P55 = P5^5; sbit P56 = P5^6; sbit P57 = P5^7; sfr P6 = 0xE8; //0000,0000 端口6 sbit P60 = P6^0; sbit P61 = P6^1; sbit P62 = P6^2; sbit P63 = P6^3; sbit P64 = P6^4; sbit P65 = P6^5; sbit P66 = P6^6; sbit P67 = P6^7; sfr P7 = 0xF8; //0000,0000 端口7 sbit P70 = P7^0; sbit P71 = P7^1; sbit P72 = P7^2; sbit P73 = P7^3; sbit P74 = P7^4; sbit P75 = P7^5; sbit P76 = P7^6; sbit P77 = P7^7; sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 //系統管理特殊功能寄存器 sfr PCON = 0x87; //0001,0000 電源控制寄存器 sfr AUXR = 0x8E; //0000,0000 輔助寄存器 sfr AUXR1 = 0xA2; //0000,0000 輔助寄存器1 sfr P_SW1 = 0xA2; //0000,0000 外設端口切換寄存器1 sfr CLK_DIV = 0x97; //0000,0000 時鐘分頻控制寄存器 sfr BUS_SPEED = 0xA1; //xx10,x011 總線速度控制寄存器 sfr P1ASF = 0x9D; //0000,0000 端口1模擬功能配置寄存器 sfr P_SW2 = 0xBA; //0xxx,x000 外設端口切換寄存器 //中斷特殊功能寄存器 sfr IE = 0xA8; //0000,0000 中斷控制寄存器 sbit EA = IE^7; sbit ELVD = IE^6; sbit EADC = IE^5; sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; sfr IP = 0xB8; //0000,0000 中斷優先級寄存器 sbit PPCA = IP^7; sbit PLVD = IP^6; sbit PADC = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; sfr IE2 = 0xAF; //0000,0000 中斷控制寄存器2 sfr IP2 = 0xB5; //xxxx,xx00 中斷優先級寄存器2 sfr INT_CLKO = 0x8F; //0000,0000 外部中斷與時鐘輸出控制寄存器 //定時器特殊功能寄存器 sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0; sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 sfr TL0 = 0x8A; //0000,0000 T0低字節 sfr TL1 = 0x8B; //0000,0000 T1低字節 sfr TH0 = 0x8C; //0000,0000 T0高字節 sfr TH1 = 0x8D; //0000,0000 T1高字節 sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 sfr T4H = 0xD2; //0000,0000 T4高字節 sfr T4L = 0xD3; //0000,0000 T4低字節 sfr T3H = 0xD4; //0000,0000 T3高字節 sfr T3L = 0xD5; //0000,0000 T3低字節 sfr T2H = 0xD6; //0000,0000 T2高字節 sfr T2L = 0xD7; //0000,0000 T2低字節 sfr WKTCL = 0xAA; //0000,0000 掉電喚醒定時器低字節 sfr WKTCH = 0xAB; //0000,0000 掉電喚醒定時器高字節 sfr WDT_CONTR = 0xC1; //0000,0000 看門狗控制寄存器 //串行口特殊功能寄存器 sfr SCON = 0x98; //0000,0000 串口1控制寄存器 sbit SM0 = SCON^7; sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0; sfr SBUF = 0x99; //xxxx,xxxx 串口1數據寄存器 sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 sfr S2BUF = 0x9B; //xxxx,xxxx 串口2數據寄存器 sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 sfr S3BUF = 0xAD; //xxxx,xxxx 串口3數據寄存器 sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 sfr S4BUF = 0x85; //xxxx,xxxx 串口4數據寄存器 sfr SADDR = 0xA9; //0000,0000 從機地址寄存器 sfr SADEN = 0xB9; //0000,0000 從機地址屏蔽寄存器 //ADC 特殊功能寄存器 sfr ADC_CONTR = 0xBC; //0000,0000 A/D轉換控制寄存器 sfr ADC_RES = 0xBD; //0000,0000 A/D轉換結果高8位 sfr ADC_RESL = 0xBE; //0000,0000 A/D轉換結果低2位 //SPI 特殊功能寄存器 sfr SPSTAT = 0xCD; //00xx,xxxx SPI狀態寄存器 sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 sfr SPDAT = 0xCF; //0000,0000 SPI數據寄存器 //IAP/ISP 特殊功能寄存器 sfr IAP_DATA = 0xC2; //0000,0000 EEPROM數據寄存器 sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字節 sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字節 sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令觸發寄存器 sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 //PCA/PWM 特殊功能寄存器 sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 sbit CF = CCON^7; sbit CR = CCON^6; sbit CCF2 = CCON^2; sbit CCF1 = CCON^1; sbit CCF0 = CCON^0; sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 sfr CL = 0xE9; //0000,0000 PCA計數器低字節 sfr CH = 0xF9; //0000,0000 PCA計數器高字節 sfr CCAPM0 = 0xDA; //0000,0000 PCA模塊0的PWM寄存器 sfr CCAPM1 = 0xDB; //0000,0000 PCA模塊1的PWM寄存器 sfr CCAPM2 = 0xDC; //0000,0000 PCA模塊2的PWM 寄存器 sfr CCAP0L = 0xEA; //0000,0000 PCA模塊0的捕捉/比較寄存器低字節 sfr CCAP1L = 0xEB; //0000,0000 PCA模塊1的捕捉/比較寄存器低字節 sfr CCAP2L = 0xEC; //0000,0000 PCA模塊2的捕捉/比較寄存器低字節 sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模塊0的PWM寄存器 sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模塊1的PWM寄存器 sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模塊1的PWM寄存器 sfr CCAP0H = 0xFA; //0000,0000 PCA模塊0的捕捉/比較寄存器高字節 sfr CCAP1H = 0xFB; //0000,0000 PCA模塊1的捕捉/比較寄存器高字節 sfr CCAP2H = 0xFC; //0000,0000 PCA模塊2的捕捉/比較寄存器高字節 //比較器特殊功能寄存器 sfr CMPCR1 = 0xE6; //0000,0000 比較器控制寄存器1 sfr CMPCR2 = 0xE7; //0000,0000 比較器控制寄存器2 //增強型PWM波形發生器特殊功能寄存器 sfr PWMCFG = 0xf1; //x000,0000 PWM配置寄存器 sfr PWMCR = 0xf5; //0000,0000 PWM控制寄存器 sfr PWMIF = 0xf6; //x000,0000 PWM中斷標志寄存器 sfr PWMFDCR = 0xf7; //xx00,0000 PWM外部異常檢測控制寄存器 //如下特殊功能寄存器位于擴展RAM區域 //訪問這些寄存器,需先將P_SW2的BIT7設置為1,才可正常讀寫 #define PWMC (*(unsigned int volatile xdata *)0xfff0) #define PWMCH (*(unsigned char volatile xdata *)0xfff0) #define PWMCL (*(unsigned char volatile xdata *)0xfff1) #define PWMCKS (*(unsigned char volatile xdata *)0xfff2) #define PWM2T1 (*(unsigned int volatile xdata *)0xff00) #define PWM2T1H (*(unsigned char volatile xdata *)0xff00) #define PWM2T1L (*(unsigned char volatile xdata *)0xff01) #define PWM2T2 (*(unsigned int volatile xdata *)0xff02) #define PWM2T2H (*(unsigned char volatile xdata *)0xff02) #define PWM2T2L (*(unsigned char volatile xdata *)0xff03) #define PWM2CR (*(unsigned char volatile xdata *)0xff04) #define PWM3T1 (*(unsigned int volatile xdata *)0xff10) #define PWM3T1H (*(unsigned char volatile xdata *)0xff10) #define PWM3T1L (*(unsigned char volatile xdata *)0xff11) #define PWM3T2 (*(unsigned int volatile xdata *)0xff12) #define PWM3T2H (*(unsigned char volatile xdata *)0xff12) #define PWM3T2L (*(unsigned char volatile xdata *)0xff13) #define PWM3CR (*(unsigned char volatile xdata *)0xff14) #define PWM4T1 (*(unsigned int volatile xdata *)0xff20) #define PWM4T1H (*(unsigned char volatile xdata *)0xff20) #define PWM4T1L (*(unsigned char volatile xdata *)0xff21) #define PWM4T2 (*(unsigned int volatile xdata *)0xff22) #define PWM4T2H (*(unsigned char volatile xdata *)0xff22) #define PWM4T2L (*(unsigned char volatile xdata *)0xff23) #define PWM4CR (*(unsigned char volatile xdata *)0xff24) #define PWM5T1 (*(unsigned int volatile xdata *)0xff30) #define PWM5T1H (*(unsigned char volatile xdata *)0xff30) #define PWM5T1L (*(unsigned char volatile xdata *)0xff31) #define PWM5T2 (*(unsigned int volatile xdata *)0xff32) #define PWM5T2H (*(unsigned char volatile xdata *)0xff32) #define PWM5T2L (*(unsigned char volatile xdata *)0xff33) #define PWM5CR (*(unsigned char volatile xdata *)0xff34) #define PWM6T1 (*(unsigned int volatile xdata *)0xff40) #define PWM6T1H (*(unsigned char volatile xdata *)0xff40) #define PWM6T1L (*(unsigned char volatile xdata *)0xff41) #define PWM6T2 (*(unsigned int volatile xdata *)0xff42) #define PWM6T2H (*(unsigned char volatile xdata *)0xff42) #define PWM6T2L (*(unsigned char volatile xdata *)0xff43) #define PWM6CR (*(unsigned char volatile xdata *)0xff44) #define PWM7T1 (*(unsigned int volatile xdata *)0xff50) #define PWM7T1H (*(unsigned char volatile xdata *)0xff50) #define PWM7T1L (*(unsigned char volatile xdata *)0xff51) #define PWM7T2 (*(unsigned int volatile xdata *)0xff52) #define PWM7T2H (*(unsigned char volatile xdata *)0xff52) #define PWM7T2L (*(unsigned char volatile xdata *)0xff53) #define PWM7CR (*(unsigned char volatile xdata *)0xff54) ///////////////////////////////////////////////// #endif |