历史上的今天
今天是:2024年09月23日(星期一)
2020年09月23日 | STC15F2K60S2单片机数字电压表制作(不用外围A/D换换)
2020-09-23 来源:51hei
最近做了一个用STC15系列单片机内部A/D转换做的数字电压表,1602显示。就想着实现硬件很少,就做着玩玩。
制作出来的实物图如下:
实物图


#include #include #define uchar unsigned char #define uint unsigned int unsigned char data adc_datah; //定义保存AD转换结果的绝对地址 unsigned char data adc_datal; #define LCD1602_DB P2 sbit LCD1602_RS = P4^1; sbit LCD1602_RW = P4^2; sbit LCD1602_E = P4^4; unsigned long int mn0,mn1,mn3,mn4,mn5,mn6,mn7; void InitLcd1602(); void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str); uchar *tab0[10]={"0","1","2","3","4","5","6","7","8","9"}; /*** 等待液晶准备好***/ void LcdWaitReady() { unsigned char sta; LCD1602_DB = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do { LCD1602_E = 1; sta = LCD1602_DB; //读取状态字 LCD1602_E = 0; }while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重复检测直到其等于 0 为止 } /* 向 LCD1602 液晶写入一字节命令,cmd-待写入命令值 */ void LcdWriteCmd(unsigned char cmd) { LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; LCD1602_E = 0; } /* 向 LCD1602 液晶写入一字节数据,dat-待写入数据值 */ void LcdWriteDat(unsigned char dat) { LcdWaitReady(); LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; LCD1602_E = 0; } /* 设置显示 RAM 起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */ void LcdSetCursor(unsigned char x, unsigned char y) { unsigned char addr; if (y == 0){ //由输入的屏幕坐标计算显示 RAM 的地址 addr = 0x00 + x; //第一行字符地址从 0x00 起始 }else{ addr = 0x40 + x; //第二行字符地址从 0x40 起始 } LcdWriteCmd(addr | 0x80); //设置 RAM 地址 } /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */ void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str) { LcdSetCursor(x, y); //设置起始地址 while (*str !=0) { //连续写入字符串数据,直到检测到结束符 LcdWriteDat(*str++); //先取 str 指向的数据,然后 str 自加 1 } } /* 初始化 1602 液晶 */ void InitLcd1602() { LcdWriteCmd(0x38); //16*2 显示,5*7 点阵,8 位数据接口 LcdWriteCmd(0x0C); //显示器开,光标关闭 LcdWriteCmd(0x06); //文字不动,地址自动+1 LcdWriteCmd(0x01); //清屏 } void UartInit() //9600bps@11.0592MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设定定时器1为16位自动重装方式 TL1 = 0xE0; //设定定时初值 TH1 = 0xFE; //设定定时初值 ET1 = 0; //禁止定时器1中断 ES=1; EA=1; TR1 = 1; //启动定时器1 } void Usart_init() interrupt 4 { uint dataa; dataa=SBUF; mn3=dataa; RI=0; //SBUF=dataa; while(!TI); TI=0; } void main() { uint dataa; UartInit(); InitLcd1602(); LcdShowStr(0, 0,"home:"); while(1) { // mn3=123; LcdShowStr(6, 0,tab0[mn3/100]); LcdShowStr(7, 0,tab0[(mn3%100)/10]); LcdShowStr(8, 0,tab0[mn3%10]); } }
上一篇:单片机多通道AD采集源程序(8路) STC15w系列
下一篇:51单片机堆栈的分析
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 急需!!! 电子技术研发设计开发方案!!! 急需!!! 方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 请注明公司全名或个人的姓,详细准确的 ...… 查看全部问答> |
|
需要加几个硬件功能按钮,因而与用户软件之间有一点点接口。 大家帮忙推荐一下,哪家工控机制造商(最好是北京的,沟通和联调会方便些)会承接这方面的业务? 哪些厂家的产品质量好些?… 查看全部问答> |
|
本人第一次接触VHDL编成,使用的是Xilinx ISE7.1。由于是第一次接触,也没有找到什么合适的参考书,所以对于这个环境的使用方法还十分不熟悉,请高手指点。 我只写了一个多路选择器的小程序,写完之后该怎样调试?仿真的时候还需要建立什么波形文 ...… 查看全部问答> |
|
不知道何时才能见到你 Windows API 程序设计参考大全 你让我找了好久... 也没有一点头绪 真的快崩溃了啊... 朋友们快快帮帮我吧 在哪儿能买到? 二手的也行 在此先谢谢朋友们了... 急需急需!!! … 查看全部问答> |
|
因客户的要求,需将一USB驱动打包成安装程序,如下: 我现有驱动包含两个文件,一个是.ini文件,一个是.sys文件,在插入USB设备时,只要选择该文件目录,系统就可安装该驱动。 现在我该如何将这两个文件打包成可执行文件?… 查看全部问答> |
|
我在做MMA7455测角度,测量出来的数据除去最高的标志位剩下的数据在0到66,但是不清楚得到的这个数据怎么转换成角度??那位给我解释下 或者加我QQ350091724… 查看全部问答> |




