void main() { while(1) { if(!kaiguan) { uint m; for(m=800;m>0;m--) //持续时间0.5ms*800 { beep=~beep; delay(); //2000HZ的信号。 } for(m=500;m>0;m--) //持续时间0.5ms*2*500 { beep=~beep; delay(); delay(); //1000HZ的信号。 } } } }
28. 模拟简易门铃;且有关闭门铃功能。 当按下HJ-3G上的S2键后,蜂鸣器会发出十次短暂的“嘟嘟”声作为呼叫。 S3用于关闭或者打开门铃。 当门铃处于关闭时,按下S2不会有呼叫效果。 #include
#define uchar unsigned char
uchar k,ok=1;//默认开机后,门铃开。 unsigned int j; sbit s2=P3^4; sbit s3=P3^5; sbit beep=P2^3;
void delay(unsigned int i) { for(j=i;j>0;j--) for(k=125;k>0;k--); }
void main() { while(1) { if(ok==1)
{ if(s3==0) { while(s3==0); ok=0; } } else { if(s3==0) { while(s3==0); ok=1; } } if((s2==0)&(ok==1)) { uchar i=5; for(i=5;i>0;i--) { beep=0; delay(800); beep=1; delay(800); beep=0; delay(1200); beep=1; delay(1300); } } } }
29. 实验板唱歌实验 #include
#define uchar unsigned char
bit flag; //标志音乐输出脚电平的高低 uchar ptr = 0x00; //取音符 uchar high; //计数器高位 uchar low; //计数器低位
// 本曲谱为 \新年好\前两个十六进制表示发声频率,后一个表示发声时间,0xFF,0xFF 表示休止符 // 0x00 表示结束 // 1 _ 1_ 1 .5
uchar code music[] = {
0xFC,0x44,0x7F, 0xFC,0x44,0x7F, 0xFC,0x44,0xFF, 0xFA,0x68,0xFF, // 3 _ 3_ 3 1
0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF, // 1_ 3_ 5 5
0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFD,0x82,0xFF, 0xFD,0x82,0xFF, // 4_ 3_ 2 -
0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFF,0xFF,0xFF, // 2_ 3_ 4 4
0xFC,0xAC,0x7F, 0xFD,0x23,0x7F, 0xFD,0x34,0xFF, 0xFD,0x34,0xFF, // 3_ 2_ 3 1
0xFD,0x23,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF, // 1_ 3_ 2 .5
0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFA,0x68,0xFF, // .7_ 2_ 1 -
0xFC,0x0C,0x7F, 0xFC,0xAC,0x7F, 0xFC,0x44,0xFF, 0xFF,0xFF,0xFF, 0x00//结束 };
void Init(void); //初始化函数
void DelayMs(unsigned int time); //毫秒级延时函数
void main() { uchar time; Init(); TH0 = high; TL0 = low; while (1) { if (music[ptr] != 0xFF && music[ptr] != 0x00)//判断是否是正常音符 { TR0 = 0; P2_3 = 1; DelayMs(10); //间歇 TR0 = 1; high = music[ptr]; //取设置频率数值的高8 位 low = music[ptr + 1]; //取设置频率数值的低8 位 time = music[ptr + 2]; //取发声时间 DelayMs(time); ptr += 3; }
else if (music[ptr] == 0xFF) //判断是否是休止符 { time = music[ptr + 2]; DelayMs(time); ptr += 3; } else //结束符,停止2 秒后继续 { TR0 = 0; P2_3 = 1; DelayMs(2000); ptr = 0; } } }
/********************************************************************************* * 名称:Count1(void) interrupt 1
* 功能:设置计时器0 溢出中断,每中断一次改变P2_3 引脚电平
*********************************************************************************/ void Count1(void) interrupt 1 { TH0 = high; TL0 = low; if (flag == 0) //改变P2_3 引脚电平 { P2_3 = 0; flag = 1; } else { P2_3 = 1; flag = 0; } }
/********************************************************************************* * 名称:Init() * 功能:设置计数器0 工作方式,16 位计数,溢出中断方式
**********************************************************************************/ void Init()
{ TMOD = 0x01; //定时器0 处于计时方式,16 位 EA = 1; ET0 = 1; //定时器0 溢出中断 }
/********************************************************************************* * 名称:DelayMs(unsigned int time) * 功能:延时time * 1ms 时间
*********************************************************************************/ void DelayMs(unsigned int time) { unsigned int i; unsigned int j; for (j =0; j < time; j++) //每个循环 约 3ms { for (i =0; i < 363; i++) {;} } }
30. LCD1602通过标准程序静态显示字符 #include
sbit RS = P1^0; //定义端口 sbit RW = P1^1; sbit EN = P2^5; sbit DU = P2^0; sbit WE = P2^1;
#define RS_CLR RS=0 #define RS_SET RS=1
#define RW_CLR RW=0 #define RW_SET RW=1
#define EN_CLR EN=0 #define EN_SET EN=1
#define DataPort P0
void cmg88()//关数码管,点阵函数 {
DU=1; P0=0X00; DU=0; }
/*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/ void DelayUs2x(unsigned char t) {
while(--t); }
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/ void DelayMs(unsigned char t) {
while(t--) {
//大致延时1mS DelayUs2x(245); DelayUs2x(245); } }
/*------------------------------------------------ 判忙函数
------------------------------------------------*/ bit LCD_Check_Busy(void) {
DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET;
return (bit)(DataPort & 0x80); }
/*------------------------------------------------ 写入命令函数
------------------------------------------------*/ void LCD_Write_Com(unsigned char com) {
while(LCD_Check_Busy()); //忙则等待 RS_CLR; RW_CLR; EN_SET;
DataPort= com; _nop_(); EN_CLR; }
/*------------------------------------------------ 写入数据函数
------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) {
while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET;
DataPort= Data; _nop_(); EN_CLR; }
/*------------------------------------------------ 清屏函数
------------------------------------------------*/ void LCD_Clear(void) {
LCD_Write_Com(0x01); DelayMs(5); }
/*------------------------------------------------ 写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else
{
LCD_Write_Com(0xC0 + x); //表示第二行
} while (*s) { LCD_Write_Data( *s); s ++; } }
/*------------------------------------------------ 写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) {
LCD_Write_Com(0x80 + x); } else
{
LCD_Write_Com(0xC0 + x); }
LCD_Write_Data( Data); }
/*------------------------------------------------ 初始化函数
------------------------------------------------*/ void LCD_Init(void) {
LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5);
LCD_Write_Com(0x38); DelayMs(5);
LCD_Write_Com(0x38); DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/ }
/*------------------------------------------------ 主函数
------------------------------------------------*/ void main(void) {
cmg88();//关数码管,点阵函数 LCD_Init();
LCD_Clear();//清屏 while (1) {
LCD_Write_Char(7,0,'o'); LCD_Write_Char(8,0,'k');
LCD_Write_String(1,1,\ while(1); } }
31.LCD渐入显示 #include
#define uchar unsigned char #define uint unsigned int sbit rs=P1^0; sbit rw=P1^1; sbit lcden=P2^5; sbit dula=P2^0; sbit wela=P2^1;
uchar table1[]=\
uchar table2[]=\void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=10;b>0;b--); }
void delay1(uint x) { uint a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); }
void write_com(uchar com) { P0=com; rs=0; lcden=0; delay(10); lcden=1; delay(10); lcden=0; }
void write_date(uchar date) { P0=date; rs=1; lcden=0; delay(10); lcden=1; delay(10); lcden=0; }
void init() {
rw=0; dula=0; wela=0; write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口 delay(20); write_com(0x0f); //显示模式设置 delay(20); write_com(0x06); //显示模式设置:光标右移,字符不移 delay(20); write_com(0x01); //清屏幕指令,将以前的显示内容清除 delay(20); }
void main() { uchar a; init(); write_com(0x80+17); //将第一个字符写在向右偏移17个字符处,为后面的由右向左划入做准备。 delay(20); for(a=0;a<13;a++) { write_date(table1[a]); delay(20); } write_com(0xc0+17); delay(50); for(a=0;a<13;a++) {