2018-12-06 18:20:23 h_5649512 阅读数 311
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4007 人正在学习 去看看 朱有鹏

单片机制作工具大汇总!!

单片机制作工具大汇总!!!这是一个神奇的帖子,我不会放很多的资料出来,我只放一个列表,大家需要哪个资料就回复告诉我,我再上传,然后先上传几个工具给大家玩玩:可以到闯客网技术论坛下载,下面是参与本次分享的选手,如果急需的话,可以到Q群q我:813238832
单片机工具下载:https://bbs.usoftchina.com/thread-206209-1-1.html
LC谐振频率计算器.rar (4.63 KB
LCD图形生成.rar (256.3 KB
LCD防真器.zip (261.05 KB
commix.rar (188.21 KB
comdebug.rar (155.62 KB
ComAssistant.rar (197.66 KB
BMP生成PCB格式软件.rar (489.13 KB
BMPtoPCB.rar (110.1 KB
Bin_Hex.rar (204.8 KB
AvrCalc_eehome.rar (20.49 KB
AT89ISP.rar (1.1 MB
Afilter.rar (215.75 KB
1616汉字取模.rar (208.74 KB
890LC谐振回路计算.rar (4.63 KB
875电流源在线计算器离线网页.rar (4.45 KB
750定时器计算器.rar (4.72 KB
645规约调试助手.rar (395.08 KB
645规约调试助手.rar (395.08 KB
555设计.rar (368.3 KB
51单片机反反汇编器.rar (247.68 KB
51单片机定时器初值计算器.rar (6.79 KB
51单片机串行口初值计算器.rar (10.13 KB
51波特率初值设定.rar (175.71 KB
51波特率初值计算.rar (179.05 KB
51Hex_Bin.rar (213.9 KB
16.16LED点阵字库软件.rar (27.03 KB
8X8点阵取模软件.rar (10.1 KB
8.8LED点阵字库软件.rar (75.94 KB
LCD防真器.zip (261.05 KB
LC谐振频率计算器.rar (4.63 KB
LC谐振频率计算器V1.20.rar (5.45 KB
LED代码提取.rar (3.64 KB
LED段码提取.rar (183.48 KB
LED数码管字形码发生器.rar (10.2 KB
LM317计算.rar (803.42 KB
lm317设计工具.rar (178.81 KB
mcutool.rar (431.93 KB
MuCodeISP-0.18.rar (46.26 KB
p_hcs301enc.rar (174.29 KB
PCB特性阻抗计算工具软件TXLine.rar (411.31 KB
progisp167.rar (1.11 MB
Protel 99 SE 鼠标增强软件 V3[1][1].0.rar (542.53 KB
usbDebug V1[1].rar (106.26 KB
USBISP下载线资料.rar (1.46 MB
变压器计算.rar (1.07 MB
变压器设计软件.rar (1.65 MB
超级单片机工具.rar (433.5 KB
串口助手.rar (392.58 KB
单片机设计助理 V2[1].4 破解版.rar (1.38 MB
单片机小精灵.zip (688.79 KB
单片机延时计算小程序.rar (8.21 KB
单片机正弦波数据生成器.rar (1.14 MB
单片机正弦波数据生成器.rar (1.14 MB
点整取模小工具.rar (658.92 KB
点整取模小工具.zip (772.86 KB
电感量计算.rar (69.87 KB
电容单片转换CCT.rar (96.51 KB
电阻并联计数器.rar (16.34 KB
洞洞板板上画PCB的专业工具.rar (581.04 KB
更好用的1616汉字取模.rar (164.29 KB
工程单位转换.rar (74.34 KB
汉字生成器(软件).rar (254.06 KB
画流程图.rar (686.91 KB
汇编语言程序库.rar (447.97 KB
计算器.rar (173.1 KB
进制转换.rar (6.07 KB
空心线圈电感量的计算.rar (166.58 KB
取字模软件.rar (1.38 MB
熔丝位软件.rar (45.78 KB
软件延迟时间计算分析.rar (63.3 KB
色环电阻识别程序.rar (75.79 KB
声谱分析器–(50K)很精巧的程序.zip (1.27 MB
实用计算器.rar (69.14 KB
示波器.rar (1.16 MB
数制转换小程序.rar (213.32 KB
衰减器计算器.rar (7.56 KB
炜煌串口调试软件.rar (13.83 KB
显示器测试软件NokiaMonitorTest.rar (325.31 KB
小精灵电气计算.rar (84.56 KB
晓刚电阻值计算.rar (687.88 KB
虚拟示波器.rar (60.85 KB
液晶字模生成程序2.0.rar (209.64 KB
液晶字模提取软件.rar (385.89 KB
一种实用线圈参数计算软件.rar (69.92 KB
音乐代码转换.rar (211.06 KB
在protel99se软件PCB里面放汉字的实现.rar (1.31 MB
正弦波数据生成器(正弦波表).rar (37.53 KB
中断延迟时间…rar (18.42 KB
终极串口调试软件.rar (74.23 KB
专业工具.rar (259.09 KB
字模提取.rar (240.75 KB
字模提取V2.2.rar

再给你们附送点资料:

在这里插入图片描述

2017-04-21 15:16:09 zhang_zhonghai 阅读数 223
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4007 人正在学习 去看看 朱有鹏

技术小白在建议下决定在学习技术的工程中写写博客,希望各位大神不吝赐教!

首先就写写最近在做的毕设《基于51单片机的太阳能电加热辅助系统》。

这个系统主要实现的就是①实时监测水位,水温(使用传感器检测)。

                                            ②控制加热时间,加热温度,水位(按键控制)。【范围0-99】

                                            ③显示水位,水温,加热时间,设定水位,水温(LCD1602显示)。

                                            ④报警系统,水温到达预定值报警。

                                            ⑤水位低于最小值,自动加水。

                                            ⑥通过电磁继电器控制加热模块和加水模块(加热加水模块,电压220V)。

系统框图大致如下:



设计到这里大致的思路已经做好了,下一次我们再做元器件的选择和其他工作。















2017-07-25 12:53:30 wangwangpengpeng 阅读数 39743
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4007 人正在学习 去看看 朱有鹏
利用51单片机制作一个秒表的详细过程

前面的话:

和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家一样,百思不得其解,最后头都弄大了才把这个秒表制作出来,为了给以后的朋友们一些思路,一些参考,所以在这里我把自己制作的整个详细过程整理出来供大家参考。我调试出来是没有问题的,各方面都稳定运行,由于我水平有限,中间可能会有不对的地方,欢迎大家指正,我们一起学习,一起进步!

我将分为三个部分来介绍:1.整体思路,2.硬件电路方面,3.软件编程方面。


1.整体思路

利用51单片机制作秒表时,我介绍精确到十分位(即0.1s)的制作,并让其拥有启动,暂停,复位三个功能。
用到的单片机部分:定时器部分,独立按键的检测与应用,数码管的显示,并结合一些简单的程序即可实现。
用5位数码管来进行显示,分别显示秒的十分位,秒的个位,秒的十位,分的个位,分的十位。用定时器定时50ms,2个定时器中断即是0.1s,即秒的十分位,20个定时器中断即是1s,60个1s即是1分钟,通过程序将5位数码管的值分离出来,并进行显示。这就是我在数码管显示方面的思路,如果不是太清楚,结合我下面软件编程方面的程序来看你可能就会明白,我会在那部分做详细介绍,看完了可能你就懂了。
利用独立按键设置启动/暂停键和清零键,利用独立按键的检测,若启动/暂停按键按下,秒表则启动或者暂停,按下复位键,秒表清零复位。我在程序后面全都有注释,不用担心。看完你就会明白了。
这是我制作的的流程图:




“ms100”表示秒的十分位,"s"表示秒的个位,“s1”表示秒的十位,“min”表示分的个位,“min1”表示分的十位。
“cnt”表示秒的计数位,即多少个一秒,定时满一秒加1,“minu”表示分的计数位,即多少个一分钟,一分钟加1,
这个流程图提供了大致思路,要结合下面的程序部分一起看。可能有些简陋,请多多包涵!


看起来是不是好简单?有木有?请继续往下看。

2.硬件电路方面

每个人的硬件可能都不一样,(哪些控制数码管的位选,哪些控制数码管的段选,哪些控制独立按键等等),大家在自己制作过程中都要仔细考虑,我在这里就用我自己的硬件进行介绍。

这是我的数码管的电路图:(将J12用杜邦线接到对应的P0口,将J16用杜邦线接到对应的P1口)


位选端我用P1口控制,段选端我用P0口控制。在图中我已标明秒的个位s,秒的十位s1,分的个位min,分的十位min1所对应的数码管。该数码管是共阴极。
秒的十分位我用的是另一个共阳数码管。我用P3口控制该数码管的段选,其图如下:



而独立按键我用的P2^7控制“启动/暂停键”,P2^6控制复位键:电路图如下:(将JP5通过杜邦线接到P3口)

硬件电路基本上就是这些,由于分和秒之间要用小数点分隔开,所以分的个位对应的数码管的段码要用带小数点的段码,其余的数码管则不用。

硬件方面是为看懂软件程序做准备,下面我们就开始我们的软件程序方面吧!  

3.软件程序方面


#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int

#define PIN0 P0  //数码管段选端
#define PIN1 P1  //数码管位选端
#define PIN3 P3	 //十分位数码管的段码端
sbit start=P2^7;  //启动/暂停按钮
sbit reset=P2^6;  //复位按钮
uint cnt=0;   //1s的次数的计数值
uint num=0;     //进入中断次数的计数值(一次50ms)
uint num1=0;		//0.1s的次数的计数值
uchar code table[]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
//不带小数点的共阴极数码管段码0-9
uchar code table1[]={0xbf,0x86,
0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//带小数点的共阴极数码管段码0-9

char code table2[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//不带小数点的共阳极数码管段码0-9

void Display(uint w,uint a,uint b,uint c,uint d);  //声明显示函数
void InitTimer0();  //声明定时器初始化函数
void Delayms(uint x);  //声明延时函数

void main()
{
	uint ms100=0;	//秒的十分位
	uint s,s1,min,min1,minu=0; 
	//依次是秒的个位,秒的十位,分的个位,分的十位
	InitTimer0();	  //初始化定时器
	while(1)			//进入死循环
{	
	if(start==0)   //检测启动/暂停键是否按下
			Delayms(20); //延时消抖
	{
		if(start==0)  //消抖之后再次检测
		{
			TR0=!TR0;		//定时器的控制位取反
			while(!start);  //等待按键释放
		}
	}
	
if(reset==0)  //检测复位键是否按下
{
	Delayms(20);	//延时消抖
	if(reset==0)  	//消抖之后再次检测
	{
		num=0;		
		num1=0;		//进入中断次数值清0
		ms100=0;	//十分位的计数值清0
		cnt=0;		//秒的计数值清0
		minu=0;		//分的计数值清0
		while(!reset);		 //等待按键释放
	}
}
	if(num1>=2)		//检测是否达到0.1s,(两个50ms)
	{
		num1=0;  		//进入中断次数值清零
		ms100++;		//秒的十分位的计数值加1
		if(ms100>=10)  //若秒的十分位计数值达到10
		{
			ms100=0;  //清零秒的十分位的计数值
			num1=0;	//进入中断次数值置0
		}
	}
	
	if(num>=20)  //判断计时时间是否达到1s(20个50ms)
	{
		num=0;     //进入中断次数值置0
		cnt++;		 //秒的计数值加1
		if(cnt>=60) //判断是否达到60s
	{
		cnt=0;		//若达到60s,将秒的计数值置零
		minu++;			//分的计数值加1
		if(minu>=60)  //判断是否达到60分钟,一般秒表是用不到60分的,这是为了程序的严谨性

		{
			TR0=!TR0;			//达到60分钟则关闭定时器并清零所有的计数值
			num1=0;				
			num=0;
			ms100=0;
			cnt=0;		
			minu=0;
			
		}
	}
	}	
	s=cnt%10;  	//从秒的计数值里面分离秒的个位
	s1=cnt/10; 	//从秒的计数值里面分离秒的十位
	min=minu%10;	//从分的计数值里面分离分的个位
	min1=minu/10;	//从分的计数值里面分离分的十位
	
	Display(ms100,s,s1,min,min1);  //显示这5个数
}	
}

void InitTimer0() //定时器初始化函数
{
	
	TMOD=0x01; //选择定时器0的工作方式1
	TH0=(65536-45872)/256;  //装初值(定时50ms),晶振11.0592MHz
	TL0=(65536-45872)%256;
	EA=1;		//打开总中断
	ET0=1;	//打开定时器中断
	TR0=0;	//先不要启动定时器
	
}

void TIMER0()  interrupt 1  //定时器中断服务函数
{
	TH0=(65536-45872)/256;  //重装初值
	TL0=(65536-45872)%256;
	num++;		//让进入中断次数值加1,用于判断是否达到1s
	num1++;		//让进入中断次数值加1,用于判断是否达到0.1s
}

void Delayms(uint x)   //延时xms
{
	uint i,j;
	for(i=x;i>0;i--)
		for(j=110;j>0;j--);
}

void Display(uint w,uint a,uint b,uint c,uint d) //定义显示函数
{
	PIN3=table2[w];		//秒的十分位的段选
	Delayms(5);
	
	PIN0=table[a]; //秒的个位的段选
	PIN1=0x7f;		 //秒的个位的位选
	Delayms(5);			
	
	PIN0=table[b];  //秒的十位的段选
	PIN1=0xbf;			//秒的十位的位选
	Delayms(5);
	
	PIN0=table1[c];  //分的个位的段选(带小数点)
	PIN1=0xdf;			 //分的个位的位选
	Delayms(5);
		
	PIN0=table[d];		//分的十位的段选
	PIN1=0xef;				//分的十位的位选
	Delayms(5);		
		
}

由于在打字时可能不小心会弄错一丁点程序,我都是一个字母一个字母手打的,所以请大家理解思路即可,根据这个思路自己去写,这样得到的知识才是属于自己的。毕竟 “读别人的故事,悟自己的人生”。
下面来几张实物图给大家看一下我这个秒表的实际效果。

编译结果:





烧写进单片机的效果:(没有按启动按钮之前)






按了启动按钮之后,秒表将会自动开始计时,由于无法演示动态过程,只能在中间按下暂停键给大家看看效果:











按下复位键后:



由于我用的是一个比较完整的51开发板,所以里面有很多部分,大家只需要注意观察数码管部分就好。
下面再来一个完整的图:





结束语

至此,利用51单片机制作的秒表就已经完成了!若是文章中有什么不懂的地方或者是自己在制作过程中遇到什么问题都可以联系我,或者给我留言,我一定竭尽全力帮助大家!我们一起学习,一起进步!希望大家都能在看完这篇文章后自己动手成功制作出一个秒表,祝愿大家学好单片机!当然,由于自身水平有限,文章中肯定会存在错误或者是考虑不周的的地方,恳请不吝赐教!谢谢大家!

(PS:我写了一整天了,反复的看,反复的改,现在头昏眼花,但是只要能对大家有所帮助,一切都是值得的。)




2017-12-02 20:40:42 non_mainstream 阅读数 615
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4007 人正在学习 去看看 朱有鹏

        51单片机制作计算机,我利用的是矩阵键盘和1602.  

在这个过程中难度较大的是PCB的制作。遇到了许多问题,布线规则,先款,孔径大小等等

在写程序的过程中难度较大的还是如何将键盘扫描与运算程序连接起来。。。。

在这个过程中还是学到了很多,对键盘扫描函数更加的熟练,对51单片机如何实现部分c语言

功能有一定的了解。


2019-11-10 16:14:01 qq_44868609 阅读数 67
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    4007 人正在学习 去看看 朱有鹏

此温控系统是基于stc89c52单片机制作,实现在1602上显示温度,并且可通过按键输入温度设定值,最后由PID调节温度。
由于本人初学者,水平有限,如有错误,欢迎大家留言纠正。以下是全部代码。。


#include <reg52.H>
#include <intrins.H>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
sbit ds = P0^0;
sbit RS = P0^2;    
sbit LCDEN = P0^1;   //1602使能端
sbit control=P0^4;   //PWM输出引脚
sbit led=P0^3;
uint time,PID_T;
uchar flag,lshi=3,lge=0;
/**//*****************************函数初始化*******************************/
void diaplayPID_En(int date);
/*************按键函数***********/
void adjust();  
void inc();    
void dec();
void keyscan();  
//延时函数
void delayUs();
void delayMs(uint a);
void writeComm(uchar comm);
void writeData(uchar dat);
void writeString(uchar * str, uchar length);
void init();
void dsInit();
void dsWait();
bit readBit();
unsigned char readByte();
void writeByte(unsigned char dat);
void sendChangeCmd();
void sendReadCmd();
int getTmpValue(); 
void diaplaypout(uint date);
void display(int v);
typedef struct PID_value   //结构体存放PID参数
{
		float Kp;
		float T;
		float Ti;
		float Td;
		uint setv;    //设定温度值
		float En;
		float En_1;
		float En_2;
		int PWMv_cur;  //当前应输出的PWM
		int pv;      //当前温度值
	
}PID_valuestr;
PID_valuestr PID;

void PID_config()  //具体PID参数根据自己的实际情况设定
{
	PID.Kp=40;
	PID.T=500;
	PID.Ti=3560;
	PID.Td=3000;
	PID.setv=300;
	PID.En_1=0;
	PID.En_2=0;
	PID.En=0;
	PID.PWMv_cur=40;	  //pwm周期为100ms
}
void PIDdeal()
{
	float tp,pwmout,p,PID_ti,ti,PID_td,td;
	if(PID_T>500)
  {	
  	writeComm(0x80+10);
	writeData(0x20);
	PID.En=PID.setv-PID.pv;	   //计算En	
	p=PID.En-PID.En_1;
	writeComm(0x80+11);
	diaplayPID_En(PID.En);
	tp=p*PID.Kp;
	PID_ti=PID.T/PID.Ti;
	ti=PID_ti*PID.Kp*PID.En;
	PID_td=PID.Td/PID.T;
	td=PID.Kp*PID_td*(PID.En-2*PID.En_1+PID.En_2);
	pwmout=tp+ti+td;
	PID.PWMv_cur+=pwmout;

	if(PID.PWMv_cur>100)
	{
		PID.PWMv_cur=100;
	}
	if(PID.PWMv_cur<0)
	{
		PID.PWMv_cur=0;
	}
	PID.En_2=PID.En_1;
	PID.En_1=PID.En;
	writeComm(0x80+0x40+11);
	diaplaypout(PID.PWMv_cur);
	PID_T=0;
  }

}
void delay(uchar z)
{
	uchar x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

 
void main()
{

    uchar table[] = "sv:30";
	uchar i;
    sendChangeCmd();
    init();
    writeComm(0x80);
	for(i=0;i<5;i++)
	writeData(table[i])	;
	PID_config();
    while(1)
    {
		PIDdeal();
        
		if(time>200)	  //500ms检测一次温度
		{
		
        	display(getTmpValue());
        	sendChangeCmd();
			time=0;
		}
		keyscan();
		led=0;
    }
}
void timer0() interrupt 1
{	
	uchar pwm ;

	TH0=(65535-1000)/256;
	TL0=(65535-1000)%256;
	pwm++;
	PID_T++;
	time++;
	if(pwm<=PID.PWMv_cur)
	{
		control=0; 
	} 
	else
	{
		control=1;
	}
	if(pwm==100)
	 pwm=0;
}
//PID


void display(int v) 
{
    unsigned char count;
    unsigned char datas[] = {0, 0, 0, 0, 0};
    unsigned int tmp = abs(v);
    datas[0] = tmp / 10000;
    datas[1] = tmp % 10000 / 1000;
    datas[2] = tmp % 1000 / 100;
    datas[3] = tmp % 100 / 10;
//    datas[4] = tmp % 10;
    writeComm(0xc0);
    if(v < 0)
    {
        writeString("- ", 1);
   }
    else
    {
       writeString("+ ", 1);
    }
    if(datas[0] != 0)
    {
        writeData('0'+datas[0]);
    }
    for(count = 1; count != 4; count++)
    {
        writeData('0'+datas[count]);
        if(count == 2)
        {
            writeData('.');
        }
    }
}
int getTmpValue()
{
    unsigned int tmpvalue;
    int value; 
    float t;
    unsigned char low, high;

    sendReadCmd();
 	ET0=0;
    low = readByte(); 
    high = readByte();
   	ET0=1;
    tmpvalue = high;
    tmpvalue <<= 8;
    tmpvalue |= low;
//	ET0=1;
    value = tmpvalue;
  \
    t = value * 0.0625;
    \
    value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
	PID.pv=value/10;
    return value;
	
}
void sendReadCmd()
{
	ET0=0;
    dsInit();
    dsWait();
	ET0=1;
    delayMs(1);
	ET0=0;
    writeByte(0xcc); 
    writeByte(0xbe); 
	ET0=1;
}
void sendChangeCmd()
{
	ET0=0;
    dsInit();    
    dsWait();
	ET0=1;   
    delayMs(1);
	EX0=0;    
    writeByte(0xcc);
    writeByte(0x44);
	ET0=1;
}
void writeByte(unsigned char dat)
{	
    unsigned int i;
    unsigned char j;
    bit b;
//	ET0=0;
    for(j = 0; j < 8; j++)
    {
        b = dat & 0x01;
        dat >>= 1;
    
        if(b)   
        {
           ds = 0;          i++; i++;  
            ds = 1;    
            i = 8; while(i>0) i--;  
        }
        else  
        {
            ds = 0;
          i = 8; while(i>0) i--;  
            ds = 1;
           i++; i++;
        }
	//	ET0=1;
   }
}
unsigned char readByte()
{
    unsigned int i;
    unsigned char j, dat;
   dat = 0;
    for(i=0; i<8; i++)
    {
        j = readBit();
      
        dat = (j << 7) | (dat >> 1);
    }
    return dat;
}

bit readBit()
{
    unsigned int i;
    bit b;
	ET0=0;
    ds = 0;
    i++;   
    ds = 1; 
   i++; i++;  
    b = ds;
    i = 8; 
    while(i>0) i--;
	ET0=1;
    return b;
}
void dsWait()
 {
      unsigned int i;
	  ET0=0;
      while(ds);  
      while(~ds);
      i = 4;
      while(i > 0) i--;
	  ET0=1;
}
void dsInit()
 {
    
    unsigned int i;  
	ET0=0;
    ds = 0;
    i = 100;  
    while(i>0) i--;
    ds = 1;   
    i = 4;
    while(i>0) i--;
	ET0=1;
 }
 void writeString(uchar * str, uchar length)
{
     uchar i;
    for(i = 0; i < length; i++)
    {
         writeData(str[i]);
     }
 }
  void init()
 {
	TMOD=0x01;   
	TH0=(65535-1000)/256;
	TL0=(65535-1000)%256;
	EA=1;
	ET0=1;
	TR0=1;
    writeComm(0x38);
    writeComm(0x0c); 
    writeComm(0x06);
    writeComm(0x01);
	led=0; 

}
//写数据:RS=1, RW=0;
void writeData(uchar dat)
{
     RS = 1;
     P2 = dat;
     LCDEN = 1;
    delayUs();
    LCDEN = 0;
    delayMs(1);
 }
void writeComm(uchar comm)
{
     RS = 0;    
    P2 = comm;
    LCDEN = 1;
     delayUs();
    LCDEN = 0;
    delayMs(1);
}
 void delayMs(uint a)
{
    uint i, j;
    for(i = a; i > 0; i--)
        for(j = 100; j > 0; j--);
 }
 void delayUs()
{
    _nop_();
}
void diaplaypout(int date)
{
	char bai,shi,ge;
	if(date<0)
	{
		writeComm(0x80+10);
		writeData('-');
		date=abs(date);
	}
	bai=date/100;
	shi=date%100/10;
	ge=date%10;

	writeData(0x30+bai);
	writeData(0x30+shi);
	writeData(0x30+ge);

}
void diaplayPID_En(int date)
{
	char bai,shi,ge;
	if(date<0)
	{
		writeComm(0x80+10);
		writeData('-');
		date=abs(date);
	}
	bai=date/100;
	shi=date%100/10;
	ge=date%10;

	writeData(0x30+bai);
	writeData(0x30+shi);
	writeData('.');
	writeData(0x30+ge);

}
void keyscan()
{
	uchar test,K;
	test=P1;
	if(test==0xfb)		   //1011
	{
	delay(4);
	led=1;
	test=P1;
	if(test==0xfb)	   //k1按下
	
	{
		while(P1!=0xff);
		led=0;
		K++;	   //k1=1
		while(1)
		{
			test=P1;
			if(test!=0xff)
		 {
			delay(5);
			led=1;
			test=P1;
			if(test!=0xff)
			{
				if(test==0xfb)
					K++;		  //k1=2

				switch(test)
				{
					case 0xfb:adjust();		//1011	 移动光标
							break;
					case 0xfd:inc();	   //1101
							break;
					case 0xfe:dec();		//1110
							break;
				}
						
						
				while(P1!=0xff);
				led=0;
		 	}
		 }
			if(K>3)
	        {	
				K=0;
				writeComm(0x0c);
				break;
	        }
			PID.setv=lshi*100+lge*10;
		}
		}
	}
}
void inc()
{
	delay(100);
	switch(flag)
	{
		case 1:lshi++; if(lshi>=10)
						lshi=0;
						writeData('0'+lshi);
						writeComm(0x10);
						break;
		case 2:lge++; if(lge>=10)lge=0;
						writeData('0'+lge);
						writeComm(0x10);
						break;
	}
}
void dec()
{
	delay(100);
	switch(flag)
	{
		case 1:lshi--; if(lshi<=-1)lshi=9;
						writeData('0'+lshi);
						writeComm(0x10);
						break;
		case 2:lge--; if(lge<=-1)lge=9;
						writeData('0'+lge);
						writeComm(0x10);
						break;
	}
}
void adjust()				 //0xfe	   k1
{


	delay(100);
	flag++;
	if(flag==3)
	flag=1;
	if(flag==1)
	{
	writeComm(0x80+3);
	writeComm(0x0f);			//光标闪烁
	 }
	 if(flag==2)
	{
		writeComm(0x80+4);
		writeComm(0x0f);	
	 }
}
没有更多推荐了,返回首页