首页 > 代码库 > 准备用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矩阵控制显示数据的变换,观察是否能控制每个键盘。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。