📄 hanshu.c
字号:
/*_________________________
流水灯——————————*/
#include<reg51.h>
#include<intrns.h>
void delayms(unsigned char ms) //延时程序
{
unsigned char i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
main()
{
unsigned char LED;
LED = 0XFE;
P0 = LED;
while(1)
{
delayms(250);
LED = _crol_(LED,1);
P0 = LED;
}
}
/*__________________________
报警声音—————————*/
#include<reg51.h>
#include<intrins.h>
sbit SPK = P3^7;
unsigned char frq;
void delayms(unsigned char ms);
mian()
{
TMOD = 0X01;
frq = 0x00;
TH0 = 0X00;
TL0 = 0xff;
TR0 = 1;
IE = 0X82;
while(1)
{
frq++;
delayms(1);
}
}
void timer0() interrupt 1 using 1
{
TH0 = 0xfe;
TL0 = frq;
SPK = ~SPK;
}
/*______________________________
消防车报警
_______________________________*/
#include<reg51.h>
#include<intrins.h>
sbit SPK = P3^7;
unsigned char frq;
unsigned int flag;
void delayms(unsigned char ms);
void main()
{
TMOD = 0X01;
frq = 0x00;
TH0 = 0X00;
TL0 = 0XFF;
TR0 = 1;
IE = 0X82;
flag =0;
while(1)
{
switch(flag)
{
case 0: frq++;break; //flag标志置0时,frq递增
case 1: frq--;break; //flag标志置1时,frq递减
}
if (!(frq^0xff)) flag=1; //当frq增加到FFH时,flag置1,准备frq递减
if (!(frq^0x00)) flag=0; //当frq递减到00H时,flag置0,准备frq递增
delayms(15);
}
}
void timer0() interrupt 1 using 1
{
TH0 = 0xfe;
TL0 = frq;
SPK = ~SPK;
}
/*______________________________
2002年的第一场雪
______________________________*/
#include<reg51.h>
sbit SPK = P3^7;
void delayms(unsigned chat ms);
unsigned int data j;
unsigned char code song[636]={
0xFF,0xFF,4,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xfd,0x08,2,//21
0xFD,0x5B,4,0xFD,0x08,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,2,0xff,0xff,2,0xFc,0x0B,2,//21
0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,4,0xFC,0xAB,2,0xFC,0xAB,2,//21
0xFB,0x8F,2,0xFC,0x0B,2,0xFC,0x0B,4,0xff,0xff,8,//12
0xff,0xff,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,4,0xFD,0x08,2,0xFD,0x08,2,//21
0xFD,0x5B,4,0xFD,0x08,2,0xFC,0xAB,4,0xFD,0x08,6,//12
0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2,//24
0xFC,0xAB,4,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,4,//18
0xFF,0xFF,4,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,//21
0xFD,0x5B,4,0xFD,0x08,2,0xFC,0xAB,4,0xFD,0x08,6,//12,183
0xFF,0xFF,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2,//24
0xFC,0xAB,4,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,4,//18
0xFF,0xFF,4,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xfd,0x08,2,//21
0xFD,0x5B,4,0xFD,0x08,2,0xFD,0x5B,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,4,//18
0xFF,0xFF,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFB,0x8F,4,0xFB,0x8F,2,0xFB,0x03,2,//21
0xFC,0x0B,4,0xFB,0x8F,2,0xFC,0x0B,2,0xFB,0x03,2,0xfa,0x14,2,0xfa,0x14,4,//18
0xFF,0xFF,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2,0xFD,0x08,2, //24
0xFD,0x5B,4,0xFD,0x08,2,0xFD,0x5B,2,0xFC,0xAB,2,0xFC,0x0B,2,0xFC,0x0B,4, //18
0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2, //24
0xfc,0xab,4,0xfc,0xab,2,0xfc,0xab,2,0xfb,0x8f,2,0xfc,0x0b,2,0xFC,0x0B,4, //18,204
0xFF,0xFF,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,2,0xFd,0x08,4,0xFd,0x08,2, //21
0xfd,0x5b,4,0xfd,0x08,2,0xfc,0xab,4,0xfc,0x0b,6, //12
0xFF,0xFF,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2, //24
0xFC,0x0B,4,0xFB,0x8F,2,0xFC,0x0B,2,0xFB,0x03,2,0xfa,0x14,2,0xfa,0x14,4, //18
0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2, //24
0xfb,0x03,2,0xfb,0x03,2,0xfb,0x03,2,0xfa,0x14,2,0xfa,0x14,1,0xf9,0x5b,1,0xf8,0x2a,2,0xf8,0x2a,4, //24
0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2, //24
0xfb,0x8f,2,0xfc,0x08,2,0xfc,0x08,2,0xfc,0x08,10, //12
0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2, //24
0xfb,0x03,2,0xfb,0x03,2,0xfb,0x03,2,0xfa,0x14,2,0xfa,0x14,1,0xf9,0x5b,1,0xf8,0x2a,2,0xf8,0x2a,4, //24,207
0xff,0xff,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x8F,2,0xFB,0x03,2,0xFA,0x14,2, //24
0xfc,0xab,2,0xfd,0x08,2,0xfd,0x08,2,0xfd,0x08,2,0xff,0xff,4,0xff,0xff,4 }; //18,42,636
void main()
{
TMOD = 0X01;
IE = 0X82;
while(1)
{
j=0;
while(j<636)
{ TR0 = 1;
if ((song[j]==0xff)&&(song[j+1]==0xff)) TR0=0;
//休止符用0xff,0xff表示,出现休止符时CT0禁止,不发声
delayms(song[j+2]); //每一音符长多长
j=j+3;
}
}
}
void timer0() intrrupt 1 using 1 //每一音符唱多高
{
TH0 = song[j];
TL0 = song[j+1];
SPK = !SPK;
}
void delayms(unsigned char ms) //基本延时子程序 16分之1拍的时间
{
unsigned int i;
while(ms--)
{
for(i =0;i<20300;i++);
}
TR0=0;
}
/*_________________________________________
数码管显示
_________________________________________*/
#include<reg51.h>
#include<intrns.h>
unsigned char data dis_digit;
unsinged char code dis_code[11]={
0xc0,0xf9,0xa4,0xb0, //0,1,2,3
0x99,0x92,0x82,0xf8,0x80,0x90,0xff //4,5,6,7,8,9,off
};
unsigned char data dis_buf[8];
unsigned char data dis_index;
void main()
{
P0 = 0xff;
P2 = 0xff;
TOMD = 0X01;
TH0 = 0XFC;
TL0 = 0X17;
IE = 0X82;
dis_buf[0] = dis_code[0x1];
dis_buf[1] = dis_code[0x2];
dis_buf[2] = dis_code[0x3];
dis_buf[3] = dis_code[0x4];
dis_buf[4] = dis_code[0x5];
dis_buf[5] = dis_code[0x6];
dis_buf[6] = dis_code[0x7];
dis_buf[7] = dis_code[0x8];
dis_digit = 0xfe;
dis_index = 0;
TR0 = 1;
while(1);
}
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码管
// dis_buf --- 显于缓冲区基地址
void timer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0X17;
P2 = 0XFF; // 先关闭所有数码管
P0 = dis_buff[dis_index]; // 显示代码传送到P0口
P2 = dis_digit;
dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++;
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}
/*______________________________________________
按键扫描程序
_______________________________________________*/
#include<teg51.h>
#include <intins.h>
unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);
sbit K1 = P1^4;
sbit K2 = p1^5;
main()
{
unsigned char key_s,key_v;
key_v = 0x03;
P0 = 0xfe;
while(1)
{
key_s = scan_key();
if(key_s != key_v)
{
key_v = key_s;
proc_key(key_v);
}
}
}
unsigned chat scan_key()
{
unsigned char key_s;
key_s = 0x00;
key_s |= K2;
key_s <<=1;
key_s = K1;
return key_s;
}
void proc_key(unsigned char key_v)
{
if((key_v & 0x01) == 0)
{
P0 = _cror_(P0,1);
}
esle if((key_v & 0x02) == 0)
{
P0 = _crol_(P0,1);
}
}
/*______________________________________________________________-
E2PROM AT93C46读写演示程序
______________________________________________________________*/
#include <reg51.h>
#include <intrins.h>
//define OP code
#define OP_EWEN_H 0x00 // 00 写入使能指令的高8位
#define OP_EWEN_L 0x60 // 11X XXXX 写入全能指令的低8位
#define OP_EWDS_H 0x00 // 00 写入禁止指令的高8位
#define OP_EWDS_L 0x00 // 00X XXXX 写入禁止指令的低8位
#define OP_ERAL_H 0x00 // 00 整片擦除指令高8位
#define OP_ERAL_L 0x40 // 10X XXXX 整片探险指令低8位
#define OP_WRAL_H 0x00 // 00 整片写入指令的高8位
#define OP_WRAL_L 0x20 // 01X XXXX 整片写入指令的低8位
#define OP_WRITE_H 0x40 // 01 A6-A0 写入指令的高位
#define OP_READ_H 0x80 // 10 A6-A0 读取指令的高位
#define OP_ERASE_H 0xc0 // 11 A6-A0 删除指令的高位
//define pin
sbit CS = P3^4; //片选
sbit SK = P3^3; //时钟
sbit DI = P3^5; //数据输入
sbit DO = P3^6; //数据输出
unsigned char code dis_code[] = {0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};
//void start(); //
void ewen(); //写入使能函数
void ewds(); //写入禁止函数
void erase(); //整片擦除函数
void write(unsigned char addr, unsigned char indata); //在指定地址写入数据函数
unsigned char read(unsigned char addr); //读取指定地址函数
void inop(unsigned char op_h, unsigned char op_l); //写入指令函数
void shin(unsigned char indata); //写入数据函数
unsigned char shout(); //读出数据函数
void delayms(unsigned char ms); //延时函数
main()
{
unsigned char i;
CS = 0; //初始化端口
SK = 0;
DI = 1;
DO = 1;
ewen(); // 使能写入操作
erase(); // 擦除全部内容
for(i = 0 ; i < 8; i++) //写入显示代码到AT93C46
{
write(i, dis_code[i]);
}
ewds(); // 禁止写入操作
i = 0;
while(1)
{
P0 = read(i); // 循环读取AT93C46内容,并输出到P0口
i++;
i &= 0x07; // 循环读取地址为0x00~0x07
delayms(250);
}
}
void write(unsigned char addr, unsigned char indata) // 写入数据indata到addr
{
inop(OP_WRITE_H, addr); //写入指令和地址
shin(indata); //写入数据
CS = 0;
delayms(10); // Twp
}
unsigned char read(unsigned char addr) // 读取addr处的数据
{
unsigned char out_data;
inop(OP_READ_H, addr); //写入指令和地址
out_data = shout(); //读出数据
CS = 0;
return out_data;
}
void ewen() //写入使能
{
inop(OP_EWEN_H, OP_EWEN_L);
CS= 0;
}
void ewds() //写入禁止
{
inop(OP_EWDS_H, OP_EWDS_L);
CS= 0;
}
void erase() //整片擦除
{
inop(OP_ERAL_H, OP_ERAL_L);
delayms(30);
CS = 0;
}
void inop(unsigned char op_h, unsigned char op_l)
//移入op_h的高两位和op_l的低7位
//op_h为指令码的高两位
//op_l为指令码的低7位或7位地址
{
unsigned char i;
SK = 0; // 开始位
DI = 1;
CS = 1;
_nop_();
_nop_();
SK = 1;
_nop_();
_nop_();
SK = 0; // 开始位结束
DI = (bit)(op_h & 0x80); // 先移入指令码高位
SK = 1;
op_h <<= 1;
SK = 0;
DI = (bit)(op_h & 0x80); // 移入指令码次高位
SK = 1;
_nop_();
_nop_();
SK = 0;
// 移入余下的指令码或地址数据
op_l <<= 1;
for(i = 0; i < 7; i++)
{
DI = (bit)(op_l & 0x80); // 先移入高位
SK = 1;
op_l <<= 1;
SK = 0;
}
DI = 1;
}
void shin(unsigned char indata)
//移入数据
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DI = (bit)(indata & 0x80); // 先移入高位
SK = 1;
indata <<= 1;
SK = 0;
}
DI = 1;
}
unsigned char shout(void)
// 移出数据
{
unsigned char i, out_data;
for(i = 0; i < 8; i++)
{
SK = 1;
out_data <<= 1;
SK = 0;
out_data |= (unsigned char)DO;
}
return(out_data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -