编写单片机
目录
在科技快速发展的时代,单片机作为自动化设备和智能电子产品的重要组成部分,得到了广泛应用。本文将探讨编写单片机的关键因素和策略,帮助读者更好地理解和应用单片机技术。
单片机是一种集成电路芯片,集成了中央处理器、随机存取存储器、只读存储器、输入/输出接口等必要电子元件,广泛应用于各个领域。在单片机中,程序控制着整个系统的运行,因此编写高质量的程序对于单片机的应用至关重要。
在编写单片机程序之前,需要明确任务和需求,包括实现的功能、输入/输出接口、通信协议等。只有明确了任务和需求,才能有针对性地编写程序。
选择合适的开发工具可以提高编程效率和代码质量。常用的单片机开发工具有Keil、IAR Embedded Workbench等。这些开发工具提供了丰富的库函数和调试工具,方便开发者进行程序编写和调试。
单片机的指令集和架构是编写程序的基础。开发者需要熟悉单片机的指令集,了解各种指令的功能和使用方法。同时,还需要了解单片机的架构,包括中央处理器、存储器、输入/输出接口等,以便更好地进行程序设计和优化。
程序结构和算法设计是编写高质量程序的关键。开发者需要合理设计程序结构,采用高效算法,以提高程序的执行效率和稳定性。在程序设计中,还应遵循模块化、可读性、可维护性等原则。
测试和调试是保证程序正确性和稳定性的重要环节。开发者需要充分测试程序的各个部分,及时发现和解决问题。在调试过程中,应充分利用调试工具,逐步排查问题,确保程序的正确性。
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08,0x10,0xc0,0x62,0x84,0x60,0x70
_crol_字符循环左移
_cror_字符循环右移
_irol_整数循环左移
_iror_整数循环右移
_lror_长整数循环左移
_lror_长整数循环右移
_nop_空操作8051 NOP 指令
_testbit_测试并清零位8051 JBC 指令
interrupt 0 外部中断0
interrupt 1 定时器0中断
interrupt 2 外部中断1
interrupt 3 定时器1中断
interrupt 4 串口中断
interrupt 5 定时器2中断(52里面,51没有)
开始信号:
void IICstart()
{
scl=1;
delay();
sda=1;
delay();
sda=0;
delay();
scl=0;
}
结束信号
void IICstop()
{
scl=1;
delay();
sda=0;
delay();
sda=1;
delay();
}
应答信号
void IICyingda()
{
uchar j;
scl=1;
delay();
while((sda==1)&&j<250)j++;
//sda=0;
//delay();
scl=0;
delay();
}
写信号(写入一8位数据)
void write_byte(uchar w)
{
uchar i,temp;
temp=w;
for(i=0;i<8;i++)
{
scl=0;
delay();
temp=temp<<1;
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=0;
delay();
}
读信号(读出一个8位数据)
uchar read_byte(void)
{
uchar i,j,k;
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
j=sda;
k=(k<<1)|j;
scl=0;
delay();
}
scl=0;
delay();
return k;
}
void keyscan()
{
if(k1==0)
{
delay(5);
if(k1==0)
{
while(!k1); //
k1num++;
}
if(k1num==1)
{
TR0=0;
write_zhiling(0x80+0x40+11);
write_zhiling(0x0f);
}
if(k1num==2)
{
TR0=0;
write_zhiling(0x80+0x40+8);
}
if(k1num==3)
{
TR0=0;
write_zhiling(0x80+0x40+5);
}
if(k1num==4)
{
k1num=0;
write_zhiling(0x0c);
TR0=1;//
}
}
if(k1num!=0)
{
if(k2==0)
{
delay(5);
if(k2==0)
{
while(!k2);
if(k1num==1)
{
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
write_jingwei(7,fen);
}
write_jingwei(10,miao);
write_jingwei(7,fen);
write_zhiling(0x80+0x40+11);
}
write_jingwei(10,miao);
write_zhiling(0x80+0x40+11);
}
if(k1num==2)
{
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
write_jingwei(4,shi);
}
write_jingwei(7,fen);
write_jingwei(4,shi);
write_zhiling(0x80+0x40+8);
}
write_jingwei(7,fen);
write_zhiling(0x80+0x40+8);
}
if(k1num==3)
{
shi++;
if(shi==24)
{
shi=0;
write_jingwei(4,shi);
write_zhiling(0x80+0x40+5);
}
write_jingwei(4,shi);
write_zhiling(0x80+0x40+5);
}
}
}
}
if(k1num!=0)
{
if(k3==0)
{
delay(5);
if(k3==0)
{
while(!k3);
if(k1num==1)
{
miao--;
if(miao==-1)
{
miao=59;
fen--;
if(fen==-1)
{
fen=59;
write_jingwei(7,fen);
}
write_jingwei(10,miao);
write_jingwei(7,fen);
write_zhiling(0x80+0x40+11);
}
write_jingwei(10,miao);
write_zhiling(0x80+0x40+11);
}
if(k1num==2)
{
fen--;
if(fen==-1)
{
fen=59;
shi--;
if(shi==-1)
{
shi=23;
write_jingwei(4,shi);
}
write_jingwei(7,fen);
write_jingwei(4,shi);
write_zhiling(0x80+0x40+8);
}
write_jingwei(7,fen);
write_zhiling(0x80+0x40+8);
}
if(k1num==3)
{
shi--;
if(shi==-1)