历史上的今天
今天是:2024年11月08日(星期五)
2019年11月08日 | stc12c5a60s2 0-30电压测量 有注释
2019-11-08 来源:51hei
#include #include "intrins.h" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long /*Define ADC operation const for ADC_CONTR*/ #define ADC_POWER 0x80 //ADC 电源控制位 10000000 0X80 / #define ADC_FLAG 0x10 //ADC 完成标志 00010000 0x10 #define ADC_START 0x08 //ADC 启动ADC开关 00001000 0x08 / #define ADC_SPEEDLL 0x00 //420 转换速度 00000000 0x00 / #define ADC_SPEEDL 0x20 //280 转换速度 00100000 0x20 #define ADC_SPEEDH 0x40 //140 转换速度 01000000 0x40 #define ADC_SPEEDHH 0x60 //70 转换速度 01100000 0x60 /*---------------------------------------------------------------------------------------------- meidangzuidivoltage:表示AD最高电压5V对应10bit_AD转换的最小电压是多少 5/1024= 0.00488V 也就是AD在 //10bit下测量的最小电压, //那么在计算AD电压值的时候将公式 “GetADCResult(ch)*5/1024”分两步进行 方便后面对数据分离显示到 //1602上面 先计算ADC_jiancedaozuidivoltage=5*10000000/1024 先将这个数放大100万倍 //最后在算AD_jie_guo=(ADC_jiancedaozuidivoltage*GetADCResult(ch); ----------------------------------------------------------------------------------------------*/ ulong ADC_jiancedaozuidivoltage,temp,AD_jie_guo; //长整形数据 16bit float OVP; //定义一个浮点数 以保留小数点 提高进度 uint num,i,vlue;//ADC_mV,ADC_RESX,VCC_V=5.2; sbit lcden = P2^7; sbit rs = P2^6; sbit rw = P2^5; sbit LED = P3^0; void Delay(uint n); //延时函数 uint GetADCResult(uchar ch); // ad转换函数 void InitADC(); //ad初始化函数 void OCP_1(); //过压 欠压 提醒函数声明 float count(uchar ch); //AD值100次平均值函数 //ulong count(uchar ch); //ad计算函数测量0-5V时候用的 uchar code table[20]= {" Shu Kong QuDong"}; // 开机画面的布置 uchar code table2[20]={" CQDZ Alan V1.01"}; /*----------------- 延时函数 -----------------*/ void delayms(uint xms) //延时函数 { uint i,j; for(i=xms;i>0;i--) for (j=960;j>0;j--); } /*-------------------- 写命令 ---------------------*/ void lcd_write_com(uchar com) { rw=0; rs=0; //写命令状态 P0=com; lcden=1; delayms(5); lcden=0; } /**----------------- 写数据 --------------- ***/ void write_date_(uchar date) { rw=0; //写数据 rs=1; //写数据状态 P0=date; delayms(5); lcden=1; //使能 delayms(5); lcden=0; } /*--------------- 初始化显示屏 ---------------*/ void lcd_init(void) { lcden=0; lcd_write_com(0x38); //设置8位格式,2行,5*7 lcd_write_com(0x0c); //整体显示,关光标,不显示 lcd_write_com(0x06); // 设定输入方式,增量不移位 lcd_write_com(0x01);//清屏幕 delayms(5); //延? } /*----------------------- 函数名称 格式定义 函数的介绍 在某个屏幕位置上显示一个字符,X(0-16),y(1-2) X:表示字的格式 一共16个 Y:表示行 一共2行 -------------------------*/ //格式定义 void lcd_disp_char(uchar y,uchar x, uint dat) { uint address; if(y==1) //y为1 在第一行 address=0x80+0x10+4+x; //整屏左移动以后 从新定义新的起始位置 但是要加上之前移动后的地址 else address=0xc0+0x10+x; //y为2 在第二行 X显示字的位置 0XC0是 0x80+0x40的结果 lcd_write_com(address); //写入要写的位置 write_date_( dat); //写入你要写的数据 } /*------------------ 显示函数2 -------------------*/ void disp() { AD_jie_guo = count(0); //经过上面的计算求出来100次的平均值存放在AD_jie_guo里面 /*------------------------------------------------------------------------------- //扩大电压 我的量程是0-30V 分压电阻是 10k 2k 电阻比的6 反推 当测试电压为5v //的时候 最高电压为30V 测量后调试OK 因电阻误差 调整了数据为6.02 //同时这里也可以用(temp/0.167)/100 这个是电压比也就是30V分压为5V //然后5/30=0.167的结果也是一样的 ---------------------------------------------------------------------------------*/ temp=((ADC_jiancedaozuidivoltage*AD_jie_guo)*6.02)/100; // temp=(temp*6.02)/100; //备用算法 这样太占用位置 我把这步合并到上面了 //0x30是显示数字 0-9 30表示第一个数0 lcd_disp_char(1,0, temp%10000000/1000000+0x30 ); //十位 lcd_disp_char(1,1, temp%1000000/100000+0x30); //个位 lcd_disp_char(1,2,'.' ); // 小数点 lcd_disp_char(1,3, temp%100000/10000+0x30 ); //个分位 lcd_disp_char(1,4, temp%10000/10000+0x30 ); //百分位 lcd_disp_char(1,5,'V' ); } //count(0) /*----------------------------------- 名称 开机画面 功能 开机的时候显示一下铭牌 for来完成 屏幕左移动 ----------------------------------*/ void init() { // lcd_write_com(0x80+0x10); //定义显示的位置 起始地址 lcd_write_com(0x80); //定义显示的位置 起始地址 for(num=0;num<20;num++) { write_date_(table[num]); //初始化屏幕的初始数字“0000” delayms(5); } // lcd_write_com(0x80+0x40+0x10); //定义第二排,显示的地址 0x80是显示屏寄存器第一排起始地址 lcd_write_com(0xc0); //定义显示的位置 起始地址 for(num=0;num<20;num++) //0x40是第二排起始地址 { write_date_(table2[num]); delayms(5); } for(num=0;num<20;num++) //整屏左移动 这里的21就是指可以移动多少格 { //可以是100可以是1000 相当于是电子屏幕一样
史海拾趣
|
介绍了不需零线的三相交流电源相序检测保护集成电路TH221A的内部结构,引脚功能,设计特点和参数限制.给出了由两只TH221A组成的三相二重逆变桥输出的缺相和错相保护电路. … 查看全部问答> |
|
作者:邓宏杰先生 在MCU开发方面,以架构而言,可分为两大主流;RISC(Reduced Instruction Set Computer)与CISC(Complex Instruction Set Computer), RISC代表MCU的所有指令都是利用一些简单的指令组成的,简单的指令代表 MCU 的线路可以尽量做到最佳 ...… 查看全部问答> |
|
笔记本没串口,要向板子写程序,买了根USB转串口的线。 烧51程序时,直接接在板子的9针串口没问题。但一块板子是用PS/2的,于是多接一根,USB-232 232-PS/2,烧写就失败了。 还有,用超级终端和一块ARM板通信时,返回的都是乱码,到 ...… 查看全部问答> |
|
我是做APS.Net的,用的是C#,但是我对嵌入式系统的开发产生了浓厚的兴趣,想转投这个行业,看了看有C、C++、WinCE、嵌入式Linux、VxWorks等,请问这些哪个比较容易上手?在大连搞嵌入式开发的公司里面用哪个的比较多一些?… 查看全部问答> |
|
WINCE下SHFileOperation支持多文件复制吗? 如题,要做个类似资源管理器的程序 实现一些文件操作 当多选文件进行复制时,SHFileOperation还支持吗 有做过的指点下. 顺便问下 复制时好像阻塞在那,不能进行其他操作 怎么回事呢… 查看全部问答> |
|
我现在烧写2812 CE 的FLASH时,MC/MP置1,SCITXDA=1, 烧写FLASH 时,但烧写界面的右半面灰掉,无法选中进行烧些,左面的加密,部分界面却可以进行操作 ,只有UNLOCK键灰掉无法使用,但按UNLOCK键,总提示UNLOCK 失败,请问是什么原因?是否需要在插 ...… 查看全部问答> |




