首页 > 代码库 > 准备用C51做个学生管理系统(1)

准备用C51做个学生管理系统(1)

为了做这个看起来很容易,做起来很麻烦的基于51的学生管理系统,我得准备很多的知识,首先是51单片机的一些IO、定时器差不多就可以了,硬件方面还要有数码管、LCD1602、矩阵键盘等知识,至于代码就需要数据结构双向链表的知识就差不多了,用到的软件无非也就是protues、keil、protel这三剑客了。

1、为什么要用到数码管呢,因为很少做这些硬件的东西,用数码管主要是为了验证我的矩阵键盘功能有没有用罢了,数码管的abcdefg对应那几根“杠杠”的亮否可以直接显示亮的数据,因为矩阵键盘是8X8的,所以用两端数码管,那就还得设计数码管扫描的知识了。

2、IO口的P1和P3连接上8X8矩阵键盘,可能单面PCB板做起来会吃力一点,我考虑到时候学一学双面板的布线。

3、以上都搞清楚后把接数码管的P0口和P2接上LCD屏所需要连端口上,验证代码是否能够正常运行。

4、最后就是关于内存扩展方面了,初步准备用SD卡来扩充。

 

 

简单画了一副4X4的图后就着手写代码,代码如下:

 

 

  1 #include <reg52.h>  2   3 #define uint unsigned int  4 #define uchar unsigned char  5   6 uchar code digitalSeg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};  7 uchar num = 0,cnt = 0;  8 uchar pre_num = 16, now_num = 16;  9  10 /*定时器的初始函数*/ 11 void init() 12 { 13     TMOD = 0x10; 14     TH1 = (65535 - 46080) / 256; 15     TL1 = (65535 - 46080) % 256; 16     EA = 1; 17     ET1 = 1; 18 } 19 /*延时*/ 20 void delay(uint i) 21 { 22     uint j; 23     for(i; i > 0; i--) 24         for(j = 0; j < 120; j++); 25 } 26 /*动态数码增加*/ 27 void display_seg(uint i) 28 { 29     uint shi = i/10; 30     uint ge = i%10; 31     delay(1); 32     P2 = 0X01; 33     P0 = ~digitalSeg[shi]; 34     delay(1); 35     P2 = 0X02; 36     P0 = ~digitalSeg[ge]; 37     delay(1); 38     P0 = 0xff;     39 } 40 /*键盘扫描*/ 41 void keyscan() 42 { 43     uchar tmp; 44     P1 = 0x0f; 45     delay(1); 46     tmp = P1^0x0f; 47  48     switch(tmp){ 49     case 1: 50         now_num = 0; 51         break; 52     case 2: 53         now_num = 1; 54         break; 55     case 4: 56         now_num = 2; 57         break; 58     case 8: 59         now_num = 3; 60         break; 61     default: 62         now_num = 16; 63     } 64  65     P1 = 0xf0; 66     delay(1); 67     tmp = P1>>4^0x0f; 68     switch(tmp){ 69     case 1: 70         now_num += 0; 71         break; 72     case 2: 73         now_num += 4; 74         break; 75     case 4: 76         now_num += 8; 77         break; 78     case 8: 79         now_num += 12; 80     } 81 } 82 /*数码管数字变换*/ 83 void show() 84 { 85     if(pre_num != now_num)     86     { 87         display_seg(now_num); 88         pre_num = now_num; 89     } 90     display_seg(now_num); 91     //delay(100); 92 } 93  94 //主函数 95 void main() 96 { 97     int i = 0; 98     int j = 0; 99 100     P0 = 0xff;101     P2 = 0;102     init();103     TR1 = 1;104 105     cnt = 00;106     while(1)107     {108            //display_seg(cnt);109         P1 = 0xf0;110         if(P1 != 0xf0)keyscan();111         show();112     }    113 }114 /*定时中断*/115 void T1_time() interrupt 3116 {117     TH1 = (65535 - 46080) / 256;118     TL1 = (65535 - 46080) / 256;119     num++;120     if(num == 20)121     {122         num = 0;123         cnt++;124     }125 }

display_seg主要是为了了解一下数码管扫描的原理,然后才可以4X4矩阵控制显示数据的变换,观察是否能控制每个键盘。