标题: STC15F204EA单片机简易电压表(顺便实验一下cowboy的2个IO驱动LCD1602方案 [打印本页]
作者: xiaokea 时间: 2013-6-20 23:28
标题: STC15F204EA单片机简易电压表(顺便实验一下cowboy的2个IO驱动LCD1602方案
源代码:
// STC 1T @ 12MHz
// P1.0 测量端
// P1.1 接基准源2.5V(TL431)
//
#include <STC15F204EA.H>
sbit IO_4 = P0^0; //接LCD1602的引脚D4
sbit IO_E = P0^1; //接LCD1602的引脚E
#define Set_xy(x,y) Send(0,(y<<6)|(x&15)|0x80)
uint8c ASC[]={
0x04,0x1F,0x15,0x1F,0x15,0x1F,0x04,0x07, //0:电
0x0F,0x08,0x0A,0x0A,0x0F,0x0A,0x13,0x0F, //1:压
0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //2:
0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00, //3:
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00, //4:
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00, //5:
0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //6:
0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00 //7:
};
void YS14520us(void)
{
uint8 a,b,c;
for(c=2;c>0;c--)
for(b=238;b>0;b--)
for(a=90;a>0;a--);
}
void YS660us(void)
{
uint8 a,b,c;
for(c=2;c>0;c--)
for(b=94;b>0;b--)
for(a=9;a>0;a--);
}
void YS30us(void)
{
uint8 a;
for(a=87;a>0;a--);
}
void YSms(uint8 n)
{
uint8 a,b;
while(n)
{
for(b=222;b>0;b--)
for(a=12;a>0;a--);
n--;
}
}
void Send(uint8 RS, uint8 dat)
{
uint8 i;
for(i=2;i;i--)
{
if(dat & 0x80)IO_4 = 1; else IO_4 = 0;
YS14520us(); //14520us (5V,2.2KΩ,2.2uF,4.751065V)
if(RS)IO_E = 1;
if(dat & 0x40)IO_4 = 1; else IO_4 = 0;
YS660us(); //660us (5V,2.2KΩ,100nF,4.751065V)
if(dat & 0x20)IO_4 = 1; else IO_4 = 0;
YS30us(); //30us (5V,2.2KΩ,4.7nF,4.725256V)
IO_E = 1;
if(dat & 0x10)IO_4 = 1; else IO_4 = 0;
NOP12(); //0.5us < t < 1.36us
IO_E = 0;
dat <<= 4;
}
}
void Send_S(uint8 *p)
{
while(*p) Send(1,*p++);
}
void Init_1602(void)
{
uint8 i = 3;
P0M0 = 0x03; //P0.0、P0.1推挽输出
IO_4 = 0;
IO_E = 0;
YSms(40);
Send(0,0x33); YSms(1);
Send(0,0x32); YSms(1);
Send(0,0x28); YSms(1);
Send(0,0x0C); YSms(1);
Send(0,0x06); YSms(1);
Send(0,0x01); YSms(1);
// 装入CGRAM //
Send(0,0x06); // CGRAM 地址自动加1
Send(0,0x40); // CGRAM 地址设为 00处
for(i=0;i<64;i++)Send(1,ASC); // 按数组写入数据
}
/* ADC操作『ADC_CONTR寄存器』常量定义 */
#define ADC_POWER 0x80 //ADC 电源控制位
#define ADC_FLAG 0x10 //ADC 完成标志
#define ADC_START 0x08 //ADC 启动控制位
#define ADC_speed_LL 0x00 //540 时钟
#define ADC_speed_L 0x20 //360 时钟
#define ADC_speed_H 0x40 //180 时钟
#define ADC_speed_HH 0x60 // 90 时钟
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:A/D转换初始化
初次使用和更换 A/D 转换通道要适当延时(20uS~200uS), 使输入电压稳定。
以后如果不更换 A/D 转换通道的话, 不需要加延时。
如果输入电压信号源的内阻在10K以下,可不加延时。
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void AD_Init()
{
P1M0 |= 0x03; //P1.0、P1.1高阻模式
P1M1 |= 0x03;
ADC_RES = 0;
P1ASF = 0x03; // P1.0、P1.1口作为模拟功能A/D使用
ADC_CONTR = ADC_POWER | ADC_speed_H ; //打开A/D电源 ,转换1次/270时钟,默认P1.0通道
YS14520us(); //开电源后延时
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:A/D转换程序
输入:通道号0~7
返回:8位转换值
说明:更换 A/D 转换通道要适当延时(20uS~200uS)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uint8 ADC(uint8 CHa)
{
s_uint8 CHb;
if(CHa != CHb) //检测是否更换通道号
{
ADC_CONTR &= 0xF8; //清通道
ADC_CONTR |= CHa; //更换通道
YS660us(); //更换 A/D 转换通道要适当延时(20uS~200uS)
}
CHb = CHa; //保存此次通道号
ADC_CONTR |= ADC_START; //ADC_START = 1启动 AD 转换,转换结束ADC_START = 0
NOP12(); //经过4个时钟延时后,才能够正确读到ADC_CONTR控制寄存器的值
while(!(ADC_CONTR & 0x10));
ADC_CONTR &= ~ADC_FLAG; //清0 ADC_FLAG 位, 停止A/D转换
return ADC_RES; //返回转换结果
}
void main(void)
{
uint8 Value,TL431;
uint16 Voltage;
Init_1602();
Send(0,0x01); //清屏
AD_Init();
while(1)
{
Value = ADC(0);
TL431 = ADC(1);
Voltage = 250*Value/TL431;
// 显示 测量电压值
Set_xy(0,0);
Send(1,0);
Send(1,1);
Send(1,':');
Send(1,' ');
Send(1,'0'+ Voltage/100);
Send(1,'.');
Send(1,'0'+ Voltage/10%10);
Send(1,'0'+ Voltage%10);
Send_S("V");
// 显示 测量转换值 : 基准源转换值
Set_xy(9,1);
Send(1,'0'+ Value/100);
Send(1,'0'+ Value/10%10);
Send(1,'0'+ Value%10);
Send(1,':');
Send(1,'0'+ TL431/100);
Send(1,'0'+ TL431/10%10);
Send(1,'0'+ TL431%10);
YSms(10);
}
}
作者: 左左右右 时间: 2013-7-2 15:32
好东西,51Hei(51黑)论坛有你更精彩.
作者: cjhk 时间: 2014-6-3 16:12
比较给力 楼主
作者: huyin 时间: 2014-8-18 18:54
顶一下,很好不错
作者: liaolinhui 时间: 2014-8-18 23:10
为什么两线也能驱动1602
作者: h2o1 时间: 2014-8-22 20:41
收藏备用。。。。。
作者: 周安松 时间: 2014-9-13 06:35
谢谢你的分享!
作者: T29 时间: 2014-9-14 02:11
很好 学习 谢谢
作者: heam 时间: 2014-9-15 11:56
谢谢分享
作者: T29 时间: 2014-9-17 09:11
还没看,应该很好
作者: flzt 时间: 2014-10-12 22:21
值的学习
作者: 热爱DIY 时间: 2014-10-13 10:00
给力 ,,,,,,,,,,
作者: portantal 时间: 2014-11-23 22:05
很准的,这个好呢。
作者: wwwmagic 时间: 2014-12-30 13:24
谢谢楼主
作者: ywd683 时间: 2015-1-2 09:01
顶一下,很好不错!!!
作者: xsynet 时间: 2015-1-4 15:40
顶一个,谢谢
作者: xsynet 时间: 2015-1-4 15:40
好好学习学习
作者: hanyubo 时间: 2015-4-27 18:17
图片不给力
作者: qjy822 时间: 2016-4-21 08:55
学习了!
作者: dragon19790000 时间: 2016-4-21 23:29
被测试电压 连接何处???
作者: 热带雨林 时间: 2017-1-12 16:47
感谢分享
作者: dragon19790000 时间: 2017-1-12 18:47
能不能给个全面的介绍,包括线路图之类的
作者: huanx 时间: 2017-7-13 15:49
下来改一下,可以用!编程还是不行啊
作者: gdx 时间: 2018-8-28 17:30
谢谢分享
作者: wkman 时间: 2025-6-1 10:26
Nubility
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |