(1小时学会C语言51单片机)C语言入门教程

Python011

(1小时学会C语言51单片机)C语言入门教程,第1张

51作为学习入门,确实是最最基础的了,不过至少它可以让一个新手明白控制是怎么回事,反馈是怎么回事,程序是怎么下载进去运行,又是怎么控制到io输入输出的,如何去访问寄存器,掌握一套在嵌入式领悟最最基本的开发方法和学习思路。这部分如果有兴趣,建议学习时间不要超过两个月。

1.c语言,及部分汇编代码

2.用一个月时间看完做完郭天祥的十天学会51单片机

3.买一块开发板

4.学习能够看懂看会原理图

5.掌握搜集资料,datasheet查找阅读英文手册的能力

6.自己动手动手动手做一个简单的功能

最后,我其实不建议51入门,可以直接stm32,虽然他还是单片机。不过十年前我当初也是51入门的,乐此不疲。至于忽悠你什么协议,内核,我觉得让一个大一嵌入式新手学这些,无疑没有基础就想建高楼,所以踏踏实实从基础开始,大学就是注重基础,学习能力!

下列程序已经调好,按键显示电路可见:

http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ef086222268d4f4eac34de59.html

//单片机:使用51系列兼容的即可;

//4×4矩阵键盘:接在P1口;

//两位数码显示器: P0口输出七段码,P2口输出位选码。

/========================================

//C语言程序如下。

/*************************************************************

* 文件名: KEY_LED.c

* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。

**************************************************************/

#include <reg51.h>

#include <intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}

uchar sec, t_50ms

/**************************************************************

* 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x

* 输入 : x (延时一毫秒的个数)

* 输出 : 无

***************************************************************/

void Delay_1ms(uint x)

{

uint i

uchar j

for(i = 0i <xi++) for(j = 0j <= 148j++)

}

/**************************************************************

* 名称: Display(uchar k)

* 功能: 将参数分成十位、个位分别显示

* 输入: k (键盘数值)

* 输出: P0口输出七段码,P2口输出位选码

***************************************************************/

void Display(uchar k)

{

P2 = 0 //消隐

P0 = table[k / 10]

P2 = 0x02Delay_1ms(5) //显示5ms十位

P2 = 0 //消隐

P0 = table[k % 10]

P2 = 0x01Delay_1ms(5) //显示5ms个位

}

/**************************************************************

* 名称: Keyscan()

* 功能: P1外接4×4按键, 按照扫描法读出键值

* 输出: 按键值0~15/如无键按下, 返回16

***************************************************************/

uchar Keyscan(void)

{

uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}

for(j = 0j <4j++) { //循环四次

P1 = Buffer[j]//在P1高四位分别输出一个低电平

temp = 0x01 //计划先判断P1.0位

for(i = 0i <4i++) { //循环四次

if(!(P1 &temp)) //从P1低四位,截取1位

return (i + j * 4)//返回取得的按键值

temp <<= 1 //判断的位,左移一位

} }

return 16 //判断结束,没有键按下,返回16

} //呵呵,实质性的语句不过8行,就是这么简练!

/**************************************************************

* 名称: GetKey()

* 功能: 读出按键、消抖、等待按键释放

* 输出: 按键值0~15/如无键按下, 返回16

***************************************************************/

uchar GetKey(void)

{

uchar Key_Temp1, Key_Temp2//两次读出的键值

P1 = 0xff

Key_Temp1 = Keyscan() //先读入按键

if(Key_Temp1 == 16) return 16//没有键按下,返回16

Display(sec) //用显示代替延时

Key_Temp2 = Keyscan() //再读一次按键

if(Key_Temp1 != Key_Temp2) return 16//不同,返回16

while(Keyscan() <16)//等待按键释放

Display(sec) //等待期间显示

return Key_Temp1

}

/**************************************************************

* 名称 : Main()

* 功能 : 主函数

***************************************************************/

void Main(void)

{

uchar Key_Value //读出的键值

sec = 0

TMOD = 0x01

TH1 = (65536-50000)/256

TL1 = (65536-50000)%256

TR0 = 1

ET0 = 1

EA = 1

while(1) {

Display(sec) //显示

if (GetKey() == 10) {

TR0 = 0

while (TR0 == 0) {

Display(sec) //显示

Key_Value = GetKey()

if (Key_Value <10) {

sec %= 10

sec = sec * 10 + Key_Value

}

if (Key_Value == 10) TR0 = 1

} } }

}

/**************************************************************

* 名称 : T0_INT()

* 功能 : T0中断函数

***************************************************************/

void T0_INT() interrupt 1

{

TH1 = (65536-50000)/256

TL1 = (65536-50000)%256

t_50ms++

if(t_50ms >= 20) {

t_50ms = 0

sec++

sec %= 60

}

}

/*************************************************************/