网站首页 > 资源文章 正文
一、AD转换
1、电位器AD值
XPT2046.h
#ifndef __XPT2046_H_ #define __XPT2046_H_ //---包含头文件---// #include<reg52.h> #include<intrins.h> //---重定义关键词---// #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); #endif
XPT2046.c
#include"XPT2046.h" /**************************************************************************** *函数名: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位显示电位器检测的AD值,范围是0-4095,一般达不到最大,这个受 你供电电压的影响. 注意事项:如果不想让点阵模块显示,可以将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(0x94); // AIN0 电位器 } 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();//数码管显示函数 } }
2、光敏电阻AD值
XPT2046.h
#ifndef __XPT2046_H_ #define __XPT2046_H_ //---包含头文件---// #include<reg52.h> #include<intrins.h> //---重定义关键词---// #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); #endif
XPT2046.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位显示光敏电阻检测的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(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;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();//数码管显示函数 } }
注明:本实验均采用HC6800-ES V2.0开发板。
3、热敏电阻AD值
XPT2046.h
#ifndef __XPT2046_H_ #define __XPT2046_H_ //---包含头文件---// #include<reg52.h> #include<intrins.h> //---重定义关键词---// #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); #endif
XPT2046.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位显示热敏电阻检测的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<reg52.h> #include<intrins.h> //---重定义关键词---// #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); #endif
XPT2046.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 <value) { PWM=1; } else { PWM=0; } } } /******************************************************************************* * 函 数 名 : Time1 * 函数功能 : 定时器1的中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断 { TH1 = 0xFF; TL1 = 0xff; //1us timer1++; count++; }
本实验输出PWM波,编译生成hex文件后,下载到CPU中,DA模块的指示灯会呈现呼吸灯效果。
注明:本文所以程序均可在HC6800-ES V2.0开发板运行。开发板原理图以及有关芯片资料均可私戳小编获取!欢迎转发和收藏!
猜你喜欢
- 2024-09-16 手机“满血复活”时间从数小时到几分钟 技术进步让大众告别充电焦虑
- 2024-09-16 51单片机AD模数转换,使用SPI通信方式
- 2024-09-16 正点原子STM32F4/F7水星开发板资料连载第三十五章 触摸屏实验
- 2024-09-16 正点原子开拓者 Nios II资料连载第十二章MCU TFT-LCD画板实验
- 2024-09-16 正点原子开拓者NiosII资料连载第二十七章GUI综合实验
- 2024-09-16 「正点原子STM32Mini板资料连载」第二十六章 触摸屏实验
- 2024-09-16 串行交互程序设计基于STM32103VET6
- 2024-09-16 Labview实验二十:触摸屏实验(labview自动触发按键)
- 2024-09-16 探索者 STM32F407 开发板资料连载第三十三章 触摸屏实验
- 2024-09-16 基于STM32设计的数码相册(stm32电子相册毕业设计论文)
你 发表评论:
欢迎- 05-21外贸人必备8个效率外贸工具合集
- 05-21Dify实战:解除Dify知识库上传文件15MB限制的
- 05-21腾讯云国际站:怎样优化TCP传输效率?
- 05-21电脑文件怎么压缩
- 05-21手机扩容新方案,搭配腾隐P2000移动固态硬盘,还可以在再战几年
- 05-21如何安全的传输文件(2)
- 05-21前端大文件秒传黑科技!程序员集体沸腾
- 05-21128GB内存8060S最强核显!极摩客EVO-X2 Max+ 395开箱
- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)