我用74HC595,串转并输出到数码管,但是不能正常输出,麻烦大佬们帮我看下程序,也给我点用这个单片机检测电压并输出到数码管的建议,蟹蟹不知道哪里出了问题,请大神们帮下忙
- #include "reg51.h"
- #include "intrins.h"
- #define FOSC 18432000L
- #define BAUD 9600
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- BYTE code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- sbit SRCLK=P1^2;
- sbit RCLK=P1^3;
- sbit SER=P1^4;
- sfr AUXR = 0x8e; //辅助寄存器
-
- sfr ADC_CONTR = 0xBC; //ADC控制寄存器
- sfr ADC_RES = 0xBD; //ADC高8位结果
- sfr ADC_LOW2 = 0xBE; //ADC低2位结果
- sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
- #define ADC_POWER 0x80 //ADC电源控制位
- #define ADC_FLAG 0x10 //ADC完成标志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540个时钟
- #define ADC_SPEEDL 0x20 //360个时钟
- #define ADC_SPEEDH 0x40 //180个时钟
- #define ADC_SPEEDHH 0x60 //90个时钟
- void InitADC();
- void Hc595SendByte(BYTE dat);
- BYTE GetADCResult(BYTE ch);
- void Delay(WORD n);
- BYTE ch=0 ;
- void main()
- {
- InitADC(); //初始化ADC
- IE=0xa0; //打开ADC转换中断
- while(1)
- {
- }
- }
- /*---------------------------------------------
- ADC 中断服务程序
- ---------------------------------------------*/
- void adc_isr() interrupt 5 using 1
- {
- double x;
- WORD a,b;
- int i;
- BYTE outData[3];
- ADC_CONTR&=!ADC_FLAG; // 清除ADC中断标志
- a=ADC_RES;
- b=ADC_LOW2;
- a=a*4+b;
- x=5.0*a/1023.0;
-
- x=x/1.0;
- for(i = 0;i<3;i++)
- {
- outData[i] = (unsigned char)x;
- x = x - outData[i];
- x = x*10;
- }
-
- Hc595SendByte(smgduan[outData[0]]); //此处先让其输出第一位,以测试
- Delay(500);
-
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
- }
- /*---------------------------------------------
- 读取ADC结果
- ---------------------------------------------*/
- /*BYTE GetADCResult(BYTE ch)
- {
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
- _nop_(); //等待4个NOP
- _nop_(); //CLOSE ADC
- _nop_();
- _nop_();
- while(!(ADC_CONTR&ADC_FLAG));
- ADC_CONTR&=~ADC_FLAG;
- return ADC_RES; //返回ADC结果
- } */
- /*---------------------------------------------
- 初始化ADC
- ---------------------------------------------*/
- void InitADC()
- {
- P1ASF=0x01; //设置P1口为AD口
- ADC_RES=0; //清除结果寄存器
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
- Delay(20); //ADC上电并延时
- }
- /*******************************************************************************
- * 函 数 名 : Hc595SendByte(u8 dat)
- * 函数功能 : 向74H595发送一个字节的数据
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Hc595SendByte(BYTE dat)
- {
- BYTE a;
- SRCLK =1;
- RCLK = 1;
- for(a=0;a<8;a++) //发送8位数
- {
- SER = dat >> 7; //从最高位开始发送
- dat <<= 1;
- SRCLK = 0; //发送时序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- RCLK = 0;
- _nop_();
- _nop_();
- RCLK = 1;
- }
-
- /*---------------------------------------------
- 软件延时
- ---------------------------------------------*/
- void Delay(WORD n)
- {
- WORD x;
- while(n--)
- {
- x=5000;
- while(x--);
- }
- }
复制代码
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我觉得你的方法不太可行。Hc595SendByte(smgduan[outData]);是用来显示处理得到的最终数据的个位数值的啊。x的数值为4.23,则我就是要用数组将各位分开的啊。
一周热门 更多>