在电子与计算机世界中,信息的表示与处理是一个永恒的话题,C8051微控制器芯片就是一个信息处理器,输入信号从他的引脚输入,经过他的内部电路处理后,再从芯片的引脚输出,他的整体就是完成这样一个功能而已。
他和微处理器芯片类似,比如intel芯片,不过他的功能简单的多,但本质是一样的,都是 数据的输入---数据的处理---数据的输出。他们都是以机器指令执行程序,C语言经过汇编后都是转化为机器指令。同处理器相比,他的程序调试要简单很多,我们用KeilC很容易看到C语句对应的汇编与机器指令,还可以看到内部寄存器R1-R8,PSW状态寄存器,PC的值内容,很容易看到PC指向的就是下一条指令的地址。
他的内部还是有些复杂的,有模数转换,USB控制器,内部时钟,内部存储器,SPI总线,Uart串口等等。但万变不离其一,只要把握了本质脉络就很容易掌握它的内容。
一个最基本的单片机电路有电源电路,时钟电路,复位电路。没有电源提供能量,单片机当然无法运行;没有时钟,指令无法按照一定的时序运行;没有复位电路,单片机出错后(外部干扰,指令跑飞)无法恢复。
//内部时钟-24.5M(C8051F330)
void Oscillator_Init()
{
OSCICN = 0x83;
}
//检测到时钟丢失允许复位
void Reset_Sources_Init()
{
RSTSRC = 0x04;
}
当然编写程序还需要初始化IO口,设置为输入方式或输出方式,推挽输出或开漏输出等。
void Port_IO_Init()
{
// P0.0 - Unassigned, Push-Pull, Digital
// P0.1 - Unassigned, Push-Pull, Digital
// P0.2 - Unassigned, Push-Pull, Digital
// P0.3 - Unassigned, Push-Pull, Digital
// P0.4 - TX0 (UART0), Push-Pull, Digital
// P0.5 - RX0 (UART0), Push-Pull, Digital
// P0.6 - Unassigned, Push-Pull, Digital
// P0.7 - Unassigned, Push-Pull, Digital
// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Open-Drain, Digital
// P1.7 - Unassigned, Open-Drain, Digital
P0MDOUT = 0xFF;
XBR0 = 0x01;
XBR1 = 0x40;
}
编完了初始化程序就是main主函数了,主函数中先进行初始化,然后死循环执行相应程序。
void Init_Device(void)
{
Reset_Sources_Init();
Port_IO_Init();
Oscillator_Init();
}
Void Delay(unsigned int time)
{
While(--time);
}
Void main()
{
Init_Device();
While(1){
P1^2 = 1;
Delay(60000);
P1^2 = 0;
Delay(60000);
}
}
单片机型号非常多(51,PIC,Arm等),但是本质都差不多,都是进行时钟,IO口,复位等初始化,然后进行主程序的运行,可能有中断,串口,Flash读写,SPI,IIC通讯等内容。