最近做了一个用STC15系列单片机内部A/D转换做的数字电压表,1602显示。就想着实现硬件很少,就做着玩玩。
制作出来的实物图如下:
实物图
把硬件原理图及源程序资料分享一下
- #include <STC15F2K60S2.h>
- #include <intrins.h>
- #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]);
- }
- }
复制代码 设计文档51hei下载:
基于STC15数字电压表设计.doc
(3.37 MB, 下载次数: 91)
|