void lcd_string(unsigned char row,unsigned char col,char *data1) //row为写入数据所在的行数,col为写入数据所在的列数,*data1为写入的数据 {
for(;row<4&&(*data1)!=0;row++) {
for(;col<8&&(*data1)!=0;col++) {
write_command(adress_table[row*8+col]); delay20us(4); //延时80us
write_Data(*data1++);
delay20us(4); //延时80us write_Data(*data1++);
delay20us(4); //延时80us }
col=0; } }
五、实验流程图
六、总结
1、学习LCD点阵字符原理,LCD集成化,能带字库为编程大大简化,利
于在电脑编程,对字符显示分块在读懂后进行修改设计,对行列循环进行交换,实现三字经的显示,对于按键中断和翻页功能,继承其功能并对于三字经的简化特点,利用计数变量实现对字符翻动的实现避免了大段的枚举。
2、从实验中感悟到查芯片资料,解决问题的思想方法,面对不同问题,
改动程序反复观察结果,反推思考代码。
实验四 电子节气门半实物仿真
一、 实验目的
以节气门为例,学习并掌握利用单片机进行半实物仿真的原理与方法。
二、 实验内容
3、主板的P0/P1接驱动板IN1/IN2 4、上层板的VR M0接主板的AD2 5、节气门的4接主板的AD3 6、节气门的2接主板VCC 7、节气门的6接主板GND
8、节气门的电机线3/5接驱动板OUT1/2
三、 实验原理图
控制框图
四、 实验所用源程序
#include
//晶振频率
#define LEDCPU PORTK_PK4 #define LEDCPU_dir DDRK_DDRK4 #define DEGREE_MAX 225 #define DEGREE_MIN 16 unsigned char AD_in2,AD_in3;
char AD2Disp[20],AD3Disp[20],Degreestr[20]; //xiebin add #define LED PORTB #define LED_dir DDRB
/*************************************************************/ /* 初始化锁相环 */ /*************************************************************/ /************************************************************/ /* 初始化ECT模块 */ /************************************************************/ /*************************************************************/ /* 延时函数1 */ /*************************************************************/ /*************************************************************/ /* 初始化AD模块 */ /*************************************************************/ /*************************************************************/ /* 起动AD转换 */ /*************************************************************/ /************************************************************/
/* 在液晶上显示AD转换计算量 /************************************************************/ void ADtoDegree(unsigned char ADd, char *dispAD) {
float ttt; //ttt=100 ;
ttt=(100-((ADd-18)*100/207));//yi改正 sprintf(dispAD,\实际开度%%.1f\}
*/ /*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) { DisableInterrupts; INIT_PLL(); initialize_ect(); INIT_PORT(); INIT_AD(); LEDCPU_dir=1; //xiebin add
LED_dir=0xff; //设置为输出 LED=0xff; //灭8个灯 EnableInterrupts; delay1ms(1000); for(;;) {
AD_in2= AD_capture(2); AD_in3= AD_capture(3); //
sprintf(AD2Disp,\目标AD为%d\ sprintf(AD3Disp,\节气门AD为%d\ ADtoDegree(AD_in3,Degreestr) if(fabs(AD_in3 - AD_in2)>3){ lcd_clear();
lcd_string(0,0,AD2Disp); lcd_string(1,0,AD3Disp); lcd_string(2,0,Degreestr); LEDCPU = 0; } else
LEDCPU = 1; } }
void main(void) {
unsigned char iflag,iDegree; unsigned char temp1,diffNew,diffOld; unsigned char KD,KP;
AD_in3_old=0; iDegree=1; KP=5;
KD=4; diffOld=0;
CLK_Init(); IO_Init();
initialize_ect(); INIT_PORT(); INIT_AD();
//P0--PWM0--IN1 //P1--PWM1--IN2 PWM_01Init(); for(;;) {
AD_in2= AD_capture(2);//目标
AD_in3= AD_capture(3);//节气门,原始230左右 iflag=0;
if((AD_in3 - AD_in2)>2){ //正转, diffNew=AD_in3 - AD_in2;
temp1 = diffNew/KP + (diffNew-diffOld)/KD; if(temp1>20) temp1=20; PWMDTY0=25+temp1; PWMDTY1=0; //mydelay(50); iflag=1; }
else if((AD_in2 - AD_in3)>2){ //反转,关闭节气门 diffNew=AD_in2 - AD_in3;
temp1 = diffNew/KP + (diffNew-diffOld)/KD; if(temp1>20) temp1=20;
PWMDTY0=0;PWMDTY1=33; mydelay(50); PWMDTY0=25+temp1; PWMDTY1=0; //mydelay(50); iflag=2; }