附录2 源程序
#include
#define uchar unsigned char #define uint unsigned int
sbit lcden=P2^6;//定义1602使能端 sbit lcdrs=P2^4; sbit lcdrw=P2^5;
sbit a=P1^0;//对射传感器的信号输出端 sbit add=P3^4;//按键加一变量 sbit jian=P3^5;//按键减一变量 sbit bj=P2^3;//蜂鸣器端口 char zhuan[16];//设置临时数组 uint num2;//每秒的转速
uint number=7;//设定转速的初值,在其基础上按键加一或按键减一 uint num=0;//转数变量
void Init_Timer0(void);
void delay(uint z)//延迟函数 {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void write_com(uchar com)//1602写命令 {
lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; }
void write_date(uchar date)//1602写数据 {
lcdrs=1; lcden=1; P0=date; delay(5); lcden=0; }
26
void LCD_Write_String(uchar x,uchar y,uchar *s) //向1602写字符串 {
if (y == 0) {
write_com(0x80 + x); //表示第一行 } else
{
write_com(0xC0 + x); //表示第二行 } while (*s) {
write_date( *s); s++; } }
void LCD_Write_Char(uchar x,uchar y,uchar Data) //向1602写字符 {
if (y == 0) {
write_com(0x80 + x); } else {
write_com(0xC0 + x); }
write_date( Data); }
void init() //初始化
{ bj=0; //蜂鸣器初始化 write_com(0x01); //1602初始化 lcdrw=0; lcden=0;
write_com(0x38); write_com(0x0e); write_com(0x06);
LCD_Write_Char(13,0,'n'); LCD_Write_Char(14,0,'/'); LCD_Write_Char(15,0,'s'); LCD_Write_Char(13,1,'n'); LCD_Write_Char(14,1,'/');
27
LCD_Write_Char(15,1,'s'); }
void main() { init(); while(1) {
if(a==1)//对射传感器检测障碍物 {num++;//计转数 while(a);}
sprintf(zhuan,\ LCD_Write_String(0,0,zhuan); Init_Timer0();//定时1s
sprintf(zhuan,\输出一秒的转速 LCD_Write_String(0,0,zhuan);
if(num2>=number)//转速超过设定值报警 bj=1;
if(num2 { //按下相应的按键,1602LCD液晶显示屏显示相应的码值 delay(5); if(!add) { number=number+1; sprintf(zhuan,\打印温度值 LCD_Write_String(0,1,zhuan);//显示第二行 while(!add); } } if(!jian) { //按下相应的按键,1602LCD液晶显示屏显示相应的码值 delay(5); if(!jian) { number--; sprintf(zhuan,\打印温度值 28 LCD_Write_String(0,1,zhuan);//显示第二行 while(!jian); } } } } void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定时器,使用\符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { static unsigned int num1; TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%6; num1++; if(num1==500) //计时1s { num1=0; num2=num; num=0; //读标志位置1 } } 29