单片机adc0809模数转换实验c语言,单片机数字取模
chanong
|1.AD转换1.电位器AD值
XPT2046.h
#ifndef __XPT2046_H_#define __XPT2046_H_//---包含头文件---//#include#include//---重新定义关键字---//#ifndef uchar#define uchar unsigned char #endif#ifndef uint #define uint unsigned int#endif#ifndef ulong#define ulong unsigned long#endif//---定义要使用的IO端口---//sbit DOUT=P3^7; //输出sbit CLK=P3^6; //时钟sbit DIN=P3^4; //输入sbit CS=P3^5; //片选uint Read_AD_Data(uchar cmd);uint SPI_Read(void);void SPI_Write(uchar dat) ;#endifXPT2046.c
#include\'XPT2046.h\'/******************************************** ********** * ******************************************函数名称:SPI_Write*输入:dat:数据写入*输出:无*功能:使用SPI 写入数据****************************** ****** ** * ******************************************/void SPI_Write(uchar dat){uchar i;CLK=0;for(i=0; i8; i++){DIN=dat 7; //放置最高有效位dat=1;CLK=0;//将数据放置在上升沿边沿CLK=1;} }/* ********************************************* ***************** ** ****** *********************函数名称:SPI_Read *输入:无*输出:dat:读取数据*功能:SPI 使用******************************** 读取数据********************************************************** **********************/uint SPI_Read(void){uint i, dat=0;CLK=0; for(i=0; i12; i++ ) //接收12位数据{dat=1;CLK=1;CLK=0;dat |=DOUT;}返回dat;}/********* *** ******** ********************************************************* ******** ********函数名称:Read_AD_Data*输入:cmd:X或Y读取*输出:endValue:最终信号处理后返回的值*功能:读取触摸数据***** *** ****************************************** *** ****** **** ******************/uint Read_AD_Data(uchar cmd){uchar i;uint AD_Value;CLK=0;CS=0;SPI_Write(cmd);for (i=6 ; i0; i--); //延时等待转换结果CLK=1; //发送1个时钟周期清零BUSY_nop_();_nop_ ();CLK=0;_nop_ ();_nop_() ;AD_Value=SPI_Read();CS=1;返回AD_Value;}main.c
/**************************************************** * **** ************************************************** **电位器AD实验*实现现象:下载程序后,数码管后4位会显示电位器检测到的AD值。范围是0 到4095,但通常不会达到最大值。这受电源电压的影响。注意:如果您不想看到点阵模块,请修改74HC595模块上的JP595并移除短接链接。 ****************************************************** * *************************************/#include \'reg52.h\' //微控制器的一些特殊功能寄存器定义在文件#include\' ;sbit LSC=P2^4;u8 disp[4];u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d 中一直是。0x7d,0x07,0x7f,0x6f};/***** ********************************* **************************************************函数名称: Delay* 函数功能: 延时函数,i=1 时延时约10us***** ************************* ******** ****************************************/空白晚了(u16 i){while( i --);}/************************************ ****** * ****************** **********************函数名称:datapros()* 函数功能: 数据处理函数* 输入: 无* 输出: 无************ ****************** ****** * ****************************************** **************/void datapros (){u16 temp;static u8 i;if(i==50){i=0;temp=Read_AD_Data(0x94 );//AIN0电位器}i++;disp[0]=smgduan[temp/1000];//千位disp[1]=smgduan[temp%1000/100];//百位disp[2]=smgduan[temp%1000%100/10] ;//单位显示[3]=smgduan[temp %1000% 100%10];}/******************** ********** ********** ** ****************************************** ******** 函数名称:DigDisplay()* 函数功能: 数码管显示功能* 输入: 无* 输出: 无************************ ***** ************** ** ************************** ****** ************/void DigDisplay( ){u8 i;for(i=0;i4;i++){switch(i) //位选择,选择点亮的数字tube, {case (0):LSA=0;LSB=0;LSC=0; Break; //显示第0个case(1):LSA=1;LSB=0;LSC=0; Break;//显示第1个case (2 ):LSA=0;LSB=1;LSC=0; Break;//第2位情况(3) :LSA=1;LSB=1;LSC=0; Break;//显示第3位}P0=disp[ 3 -i];//传输数据延时(100);//扫描P0=0x00间隔;//消隐}}/************************ ***************************************************** ********** ****** ***** 函数名称: main* 函数函数: 主函数* 输入: 无* 输出: 无********** ********************************************************** ********************** ***** ***/void main(){while( 1){datapros(); //数据处理function DigDisplay();//数码管显示函数}} 2.光敏电阻AD值
XPT2046.h
#ifndef __XPT2046_H_#define __XPT2046_H_//---包含头文件---//#include#include//---重新定义关键字---//#ifndef uchar#define uchar unsigned char #endif#ifndef uint #define uint unsigned int#endif#ifndef ulong#define ulong unsigned long#endif//---定义要使用的IO端口---//sbit DOUT=P3^7; //输出sbit CLK=P3^6; //时钟sbit DIN=P3^4; //输入sbit CS=P3^5; //片选uint Read_AD_Data(uchar cmd);uint SPI_Read(void);void SPI_Write(uchar dat) ;#endifXPT2046.c
#include\'XPT2046.h\'/******************************************** ********** * ****************************************** *********函数名称:TSPI_Start*输入:无*输出:无*功能:触摸SPI 初始化************************ ****************************** * ****************** *****************/void SPI_Start(void){CLK=0;CS=1;DIN=1;CLK=1;CS=0;}/**** ****************************** * ***** ************* ************************函数名称:SPI_Write*输入:dat:写入数据*输出:无*功能:使用SPI写入数据** ****************************************************** *************************************/void SPI_Write (uchar dat) {uchar i;CLK=0;for(i=0; i8; i++){DIN=dat 7; //放置最高有效位dat=1;CLK=0;//上升沿数据放置CLK=1 ;}}/**** ** ************************************** *** ********* ** **********************函数名称:SPI_Read*输入:无*输出:dat:数据读取*功能:使用SPI 读取数据*** * ****************************************************** ** *************************/uint SPI_Read(void){uint i, dat=0;CLK=0;for(i=0 ; i12; i++ )//接收12位数据{dat=1;CLK=1;CLK=0;dat |=DOUT;}返回dat;} /******** ******** ****************************************************** ********** ********函数名称:Read_AD_Data*输入:cmd:X或Y读取*输出:endValue:最终信号处理后返回的值*功能:读取触摸数据* ****************************************************** ********* ******************/uint Read_AD_Data(uchar cmd){ uchar i;uint AD_Value;CLK=0 ;CS=0;SPI_Write (cmd);for(i=6 ; i0; i--); //延迟等待转换结果CLK=1; //1 个时钟周期发送并BUSY_nop_();_nop_(); CLK=0;_nop_( );_nop_();AD_Value=SPI_Read ();CS=1;返回AD_Value;}main.c
/**************************************************** * **** ************************************************** ***光敏电阻AD实验*实现现象:下载程序后,数码管后4位会显示光敏电阻检测到的AD值。注:如果不想显示点阵模块,可以将74HC595模块的JP595短片拆掉。 ****************************************************** * *************************************/#include \'reg52.h\' //微控制器的一些特殊功能寄存器定义在文件#include\' ;sbit LSC=P2^4;u8 disp[4];u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d 中一直是。0x7d,0x07,0x7f,0x6f};/***** ********************************* **************************************************函数名称: Delay* 函数功能: 延时函数,i=1 时延时约10us***** ************************* ******** ****************************************/空白晚了(u16 i){while( i --);}/************************************ ****** * ****************** **********************函数名称:datapros()* 函数功能: 数据处理函数* 输入: 无* 输出: 无************ ****************** ****** * ****************************************** **************/void datapros (){u16 temp;static u8 i;if(i==50){i=0;temp=Read_AD_Data(0xA4 );//AIN2光敏电阻}i++;disp[0]=smgduan[temp/1000]; //千位disp[1]=smgduan[temp%1000/100];//百位disp[2]=smgduan[temp%1000%100/10] ;//单位disp[3]=smgduan[ temp%1000% 100%10];}/******************** ********** ************** ************************************** ** 函数名称:DigDisplay()* 函数功能: 数码管显示功能* 输入: 无* 输出: 无************************ *** ************** ************************************** ** **********/void DigDisplay( ){u8 i;for(i=0;i4;i++){switch(i) //位选择,选择点亮数码管,{case (0):LSA=0;LSB=0; LSC=0; Break; //显示第0种情况(1):LSA=1;LSB=0;LSC=0; Break;//显示第1种情况(2 ):LSA=0;LSB=1; LSC=0; Break;//第2位情况(3) :LSA=1;LSB=1;LSC=0; Break;//显示第3位}P0=disp[ 3-i];//发送数据Delay(100); //扫描P0=0x00间隔;//消隐}}/******************************** ***************************************************** *** ***** ****** 函数名称: main* 函数函数: 主函数* 输入: 无* 输出: 无****************** ** ****** ********************************************** **** **** ****/void main(){while( 1){datapros(); //数据处理函数DigDisplay();//数码管显示函数}} 注:本实验使用的是HC6800-ES V2.0开发板.使用.
3.热敏电阻AD值
XPT2046.h
#ifndef __XPT2046_H_#define __XPT2046_H_//---包含头文件---//#include#include//---重新定义关键字---//#ifndef uchar#define uchar unsigned char #endif#ifndef uint #define uint unsigned int#endif#ifndef ulong#define ulong unsigned long#endif//---定义要使用的IO端口---//sbit DOUT=P3^7; //输出sbit CLK=P3^6; //时钟sbit DIN=P3^4; //输入sbit CS=P3^5; //片选uint Read_AD_Data(uchar cmd);uint SPI_Read(void);void SPI_Write(uchar dat) ;#endifXPT2046.c
#include\'XPT2046.h\'/******************************************** ********** * ****************************************** *********函数名称:TSPI_Start*输入:无*输出:无*功能:触摸SPI 初始化************************ ****************************** * ****************** *****************/void SPI_Start(void){CLK=0;CS=1;DIN=1;CLK=1;CS=0;}/**** ****************************** * ***** ************* ************************函数名称:SPI_Write*输入:dat:写入数据*输出:无*功能:使用SPI写入数据** ****************************************************** *************************************/void SPI_Write (uchar dat) {uchar i;CLK=0;for(i=0; i8; i++){DIN=dat 7; //放置最高有效位dat=1;CLK=0;//上升沿数据放置CLK=1 ;}}/**** ** ************************************** *** ********* ** **********************函数名称:SPI_Read*输入:无*输出:dat:数据读取*功能:使用SPI 读取数据*** * ****************************************************** ** *************************/uint SPI_Read(void){uint i, dat=0;CLK=0;for(i=0 ; i12; i++ )//接收12位数据{dat=1;CLK=1;CLK=0;dat |=DOUT;}返回dat;} /******** ******** ****************************************************** ********** ********函数名称:Read_AD_Data*输入:cmd:X或Y读取*输出:endValue:最终信号处理后返回的值*功能:读取触摸数据* ****************************************************** ********* ******************/uint Read_AD_Data(uchar cmd){ uchar i;uint AD_Value;CLK=0 ;CS=0;SPI_Write (cmd);for(i=6 ; i0; i--); //延迟等待转换结果CLK=1; //1 个时钟周期发送并BUSY_nop_();_nop_(); CLK=0;_nop_( );_nop_();AD_Value=SPI_Read ();CS=1;返回AD_Value;}main.c
/**************************************************** * **** ******************************************** 热敏电阻AD实验* 实现现象:下载程序后数码管后4位显示热敏电阻检测到的AD值注意:如果不想显示点阵模块,请将74HC595模块的JP595短片去掉。 ****************************************************** * *************************************/#include \'reg52.h\' //这个该文件定义了微控制器的一些特殊功能。
存器#include\"XPT2046.h\" typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 disp[4];u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/******************************************************************************** 函 数 名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*******************************************************************************/void delay(u16 i){ while(i--); }/******************************************************************************** 函数名 :datapros()* 函数功能 :数据处理函数* 输入 : 无* 输出 : 无*******************************************************************************/void datapros(){ u16 temp; static u8 i; if(i==50) { i=0; temp = Read_AD_Data(0xD4); // AIN1 热敏电阻 } i++; disp[0]=smgduan[temp/1000];//千位 disp[1]=smgduan[temp%1000/100];//百位 disp[2]=smgduan[temp%1000%100/10];//个位 disp[3]=smgduan[temp%1000%100%10]; }/******************************************************************************** 函数名 :DigDisplay()* 函数功能 :数码管显示函数* 输入 : 无* 输出 : 无*******************************************************************************/void DigDisplay(){ u8 i; for(i=0;i<4;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 } P0=disp[3-i];//发送数据 delay(100); //间隔一段时间扫描 P0=0x00;//消隐 } }/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){ while(1) { datapros(); //数据处理函数 DigDisplay();//数码管显示函数 } }4、外部输入AD值 XPT2046.h #ifndef __XPT2046_H_#define __XPT2046_H_//---包含头文件---//#include#include//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif#ifndef ulong#define ulong unsigned long#endif//---定义使用的IO口---//sbit DOUT = P3^7; //输出sbit CLK = P3^6; //时钟sbit DIN = P3^4; //输入sbit CS = P3^5; //片选uint Read_AD_Data(uchar cmd);uint SPI_Read(void);void SPI_Write(uchar dat);#endifXPT2046.c #include\"XPT2046.h\"/*****************************************************************************函数名:TSPI_Start*输 入:无*输 出:无*功 能:初始化触摸SPI****************************************************************************/void SPI_Start(void){ CLK = 0; CS = 1; DIN = 1; CLK = 1; CS = 0; }/*****************************************************************************函数名:SPI_Write*输 入:dat:写入数据*输 出:无*功 能:使用SPI写入数据****************************************************************************/void SPI_Write(uchar dat){ uchar i; CLK = 0; for(i=0; i<8; i++) { DIN = dat >> 7; //放置最高位 dat <<= 1; CLK = 0; //上升沿放置数据 CLK = 1; }}/*****************************************************************************函数名:SPI_Read*输 入:无*输 出:dat:读取 到的数据*功 能:使用SPI读取数据****************************************************************************/uint SPI_Read(void){ uint i, dat=0; CLK = 0; for(i=0; i<12; i++) //接收12位数据 { dat <<= 1; CLK = 1; CLK = 0; dat |= DOUT; } return dat; }/*****************************************************************************函数名:Read_AD_Data*输 入:cmd:读取的X或者Y*输 出:endValue:最终信号处理后返回的值*功 能:读取触摸数据****************************************************************************/uint Read_AD_Data(uchar cmd){ uchar i; uint AD_Value; CLK = 0; CS = 0; SPI_Write(cmd); for(i=6; i>0; i--); //延时等待转换结果 CLK = 1; //发送一个时钟周期,清除BUSY _nop_(); _nop_(); CLK = 0; _nop_(); _nop_(); AD_Value=SPI_Read(); CS = 1; return AD_Value; }main.c /*************************************************************************************** 外部输入AD实验 *实现现象:下载程序后数码管后4位显示外部输入IN3通道检测的AD值,模拟信号电压范围在0-5V注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。 ***************************************************************************************/#include \"reg52.h\" //此文件中定义了单片机的一些特殊功能寄存器#include\"XPT2046.h\" typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 disp[4];u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/******************************************************************************** 函 数 名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*******************************************************************************/void delay(u16 i){ while(i--); }/******************************************************************************** 函数名 :datapros()* 函数功能 :数据处理函数* 输入 : 无* 输出 : 无*******************************************************************************/void datapros(){ u16 temp; static u8 i; if(i==50) { i=0; temp = Read_AD_Data(0xE4); // AIN3 外部输入 } i++; disp[0]=smgduan[temp/1000];//千位 disp[1]=smgduan[temp%1000/100];//百位 disp[2]=smgduan[temp%1000%100/10];//个位 disp[3]=smgduan[temp%1000%100%10]; }/******************************************************************************** 函数名 :DigDisplay()* 函数功能 :数码管显示函数* 输入 : 无* 输出 : 无*******************************************************************************/void DigDisplay(){ u8 i; for(i=0;i<4;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 } P0=disp[3-i];//发送数据 delay(100); //间隔一段时间扫描 P0=0x00;//消隐 } }/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){ while(1) { datapros(); //数据处理函数 DigDisplay();//数码管显示函数 } }二、DA转换/*************************************************************************************** DA-PWM输出实验 *实现现象:下载程序后DA模块上的指示灯呈呼吸灯效果,由暗变亮再由亮变暗注意事项:要将AD/DA模块上的短接片将OUT和LED短接,板子丝印上有。 如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。 ***************************************************************************************/#include \"reg52.h\" //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;//--定义使用的IO口--//sbit PWM=P2^1;bit DIR;//--定义一个全局变量--// u16 count,value,timer1;/******************************************************************************** 函 数 名 : Timer1Init* 函数功能 : 定时器1初始化* 输 入 : 无* 输 出 : 无*******************************************************************************/void Timer1Init(){ TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。 TH1 = 0xFF; TL1 = 0xff; //1us ET1=1;//打开定时器1中断允许 EA=1;//打开总中断 TR1=1;//打开定时器 }/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){ Timer1Init(); //定时器1初始化 while(1) { if(count>100) { count=0; if(DIR==1) //DIR控制增加或减小 { value++; } if(DIR==0) { value--; } } if(value==1000) { DIR=0; } if(value==0) { DIR=1; } if(timer1>1000) //PWM周期为1000*1us { timer1=0; } if(timer1 本实验输出PWM波,编译生成hex文件后,下载到CPU中,DA模块的指示灯会呈现呼吸灯效果。 注明:本文所以程序均可在HC6800-ES V2.0开发板运行。开发板原理图以及有关芯片资料均可私戳小编获取!欢迎转发和收藏!







