⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.c

📁 adc0832模数转换_51单片机汇编和C程序
💻 C
字号:
/*******************************************************************************
*  标题:  AD0832测试程序                                                       *
*  日期:  2007-1-1                                                             *
*  版本:  1.0                                                                  *
*  作者:  微控电子 - Caai                                                      *
*  邮箱:  microcontroller@163.com                                              *
*  QQ  : 676371312                                                            *
********************************************************************************
*  描述:                                                                       *
*         双通道ADC转换,按S1键切换                                            *
*         										                               *
********************************************************************************
*  跳线设置:J56 从左向右数第3.4.5短接    	J1从左向右数第5.6.7短接            *
*            J11为第二通道的AD输入端 可自行接入5V以内的电压进行测量实现        *
*                                                                              *
*                                                                              *
********************************************************************************
* 【版权】 Copyright(C)微控电子    All Rights Reserved                         *
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
*******************************************************************************/
#include <reg52.h>			    	// 引用标
#include <intrins.h>

#define uchar unsigned char 
#define uint unsigned int 

#define NoOp   0x00         		// 空操作寄存器
#define Digit0 0x01         		// 数码管1寄存器
#define Digit1 0x02         		// 数码管2寄存器
#define Digit2 0x03         		// 数码管3寄存器
#define Digit3 0x04         		// 数码管4寄存器
#define Digit4 0x05         		// 数码管5寄存器
#define Digit5 0x06         		// 数码管6寄存器
#define Digit6 0x07         		// 数码管7寄存器
#define Digit7 0x08         		// 数码管8寄存器
#define DecodeMode 0x09     		// 译码模式寄存器
#define Intensity 0x0a     			// 亮度寄

#define ScanLimit 0x0b      		// 扫描位数寄存器
#define ShutDown 0x0c       		// 低功耗模式寄存
#define DisplayTest 0x0f    		// 显示测试寄存器
#define ShutdownMode 0x00      		// 低功耗方式
#define NormalOperation 0x01   		// 正常操作方式
#define ScanDigit 0x02        		// 扫描位数设置,
#define DecodeDigit 0xff       		// 译码设置,8位均
#define IntensityGrade 0x0a		// 亮度级别设置

#define TestMode 0x01          		// 显示测试模式
#define TextEnd 0x00           		// 显示测试结束,

sbit DIN = P2^4;					// 串行数据输入
sbit CLK = P2^5;					// 串行时钟
sbit LOAD = P2^3;					// 显示数据锁存控制

#define _TH0_TL0_ 	(65536 - 50000)  
#define HI 			(_TH0_TL0_ / 256) //给高8位赋值
#define LO 			(_TH0_TL0_ % 256) //给低8位赋值
#define M 			20                //(1000/50)1秒要50个中断的累计

sbit P2_0 = P2 ^ 0;
sbit P2_1 = P2 ^ 1;
sbit P2_2 = P2 ^ 2;

sbit P3_2 = P3 ^ 2;
sbit P1_5 = P1 ^ 5;
sbit P1_6 = P1 ^ 6;
sbit P1_7 = P1 ^ 7;

#define _rrca_()          CY   = ACC & 0x01           //产生RRC A指令
#define _rlca_()          CY   = ACC & 0x80           //产生RLC A指令
#define bADcs P1_5
#define bADcl P1_6
#define bADda P1_7
#define key P1^0


unsigned char ucCH0;
bit bAD_ok;  //AD转换完成
unsigned char code dx58[3] _at_ 0x3b;//保留0x3b开始的3个字节
unsigned char cycle,g;
bit choose = 0,flag_key = 1;
float x;
unsigned int a = 0, b = 0, c = 0,t = 0;
unsigned char i = 0x00;
unsigned char hour,min;
unsigned char  LEDData1[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字
unsigned char code LEDData2 [] = {0x40, 0x79, 0x24, 
									0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //0.-9.LED数值

/* 延时t毫秒 */
void delay_ms(uint t)
{
	uint i;
	while(t--)
	{
		/* 对于12M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
}

/* 向MAX7219写入字节(8位)*/
void SendChar (uchar ch)
{
	uchar i,temp;
    _nop_();
    for (i=0;i<8;i++)
    {
		temp=ch&0x80;
    	ch=ch<<1;
        if(temp)
        {
        	DIN=1;
           	CLK=0;
        	CLK=1;
        }
        else
        {
        	DIN=0;
        	CLK=0;
        	CLK=1;
        }
    }
}

/* 向MAX7219写入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
    LOAD=0;
    _nop_();
    SendChar(addr);
    _nop_();
    SendChar(num);
    _nop_();
    LOAD=1;				// 锁存进相应寄存器
}

/* MAX7219初始化 */
void InitDisplay (void)
{
    WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
    WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式
    WriteWord (Intensity,IntensityGrade);    // 设置亮度
    WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式
}

/*********************************************************************************************/
void Delay(unsigned char a)//延时程序
{
	unsigned char j; 
	while(--a != 0)
	{
		for (j = 0; j < 125; j++);
	}
}

/*********************************************************************************************/
void Disp(void)//数码管显示
{
        WriteWord (Digit0,c);
        WriteWord (Digit1,b);
        WriteWord (Digit2,(0xf0+a));
}
/********************************************************************************************/
void IsrTimer0(void) interrupt 1 using 1    //定时器0中断服务程序
{
	static unsigned char count = 0;	//定义静态变量count	
//	g = (~P3)&0x01; 
	TR0 = 0;               //以下调整出栈入栈的时间误差
   	TL0 += (_TH0_TL0_ + 9) % 256;
   	TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
  	TR0 = 1;

	count++;
	if(count == 8)
	{
	count = 0;
	bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
	bADcl = 0;
	bADda = 1;//在第1 个时钟脉冲的下沉之前DI端必须是高电平.
	bADcl = 1; 
	bADcl = 0;//pulse 1 down
   // bADda = 1;

	bADcl = 1; bADcl = 0;//pulse 2 down
	if(choose == 0)
		bADda = 0;
	else
		bADda = 1;		
	bADcl = 1; bADcl = 0;//pulse 3 down

	for(cycle = 8; cycle > 0; cycle-- )
	    {
		bADda = 1;
	        bADcl = 1; bADcl = 0;//pulse 
		CY = bADda;
		_rlca_();  //RRC A
	    }
	B = ACC;
	for(cycle = 8; cycle > 0; cycle-- )
	    {
		bADda = 1;
		bADcl = 1; bADcl = 0;//pulse 
		CY = bADda;
		_rrca_();  //RLC A
            }
	if( ACC == B )
	    {
		ucCH0 = B;
		//P1_5 = 0;  //指示灯亮
		bAD_ok = 1;
	     }
	bADcs = 1;//当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束

	x = B/51.0;
	a = x;
	b = x*10 - a*10;
	c = (x*100 - a*100 -b*10);  	
	}

	if(flag_key == 1)
	{
	if(P3_2 == 0)
	  {
	  	Delay(8);
		if(P3_2 == 0)
		  {
		  	choose = ~choose;
		  }
	   }
	 }
	 if(P3_2 == 0)
	 	flag_key = 0;
	 else
	 	flag_key = 1;
		  	
}

/******************************************************************************************/
void Timer0Init(void)  //初始化定时器0程序
{
	TMOD = 0x01; //设置模式1 定时器0 工作方式0

	TH0 = HI; //给TH0,TL0赋初始值
	TL0 = LO;

	TR0 = 1;  //启动定时器0
	ET0 = 1;  //定时器中断开
	EA = 1;	//总中断开
}

/******************************************************************************************/
void main(void)//主函数
{
	Timer0Init();//初始化定时器0
   	InitDisplay ();							// MAX7219初始化 

	WriteWord(DisplayTest,TestMode);		// 开始显示测试,点亮所有LED
 	delay_ms(1000);       						// 延时约3s
	WriteWord (DisplayTest,TextEnd);		// 退出显示测试模式
    WriteWord (Digit3,0xff);
    WriteWord (Digit4,0xff);
    WriteWord (Digit5,0xff);
    WriteWord (Digit6,0xff);
    WriteWord (Digit7,0xff);
	while(1)
	{
		Disp();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -