技术要求: (1)用独立按键控制传送带的启动或停止; (2)用光电传感器检测通过其的产品数量; (3)用LED显示传送带通过产品的数量; (4)用矩阵键盘预置终值,当计数达到终值时,传送带停止;
传动采用步进电机模拟,资料很多,本程序未附该部分源码。
单片机源程序如下:
- /*16进制数码管显示对应按键键值,单一数码管显示,无需扫描*/
- #include < reg52.h >
- sbit IR_INPUT = P3^2; //P3.3引脚设定
- //sbit led = P0^0;
- sbit ADDR0 = P1^0;
- sbit ADDR1 = P1^1;
- sbit ADDR2 = P1^2;
- sbit ADDR3 = P1^3;
- sbit ENLED = P1^4;
- sbit KEY_IN_1 = P2^4;
- sbit KEY_IN_2 = P2^5;
- sbit KEY_IN_3 = P2^6;
- sbit KEY_IN_4 = P2^7;
- sbit KEY_OUT_1 = P2^3;
- sbit KEY_OUT_2 = P2^2;
- sbit KEY_OUT_3 = P2^1;
- sbit KEY_OUT_4 = P2^0;
- unsigned char code LedChar[] = {
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
- };
- unsigned char KeySta[4][4] = {
- {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
- };
- unsigned char OptCnt = 0; //产品数量
- void intinit(){
- EA= 1;
- EX0 = 1; //使能INT0中断
- IT0 = 1; //设置INT0为正边沿触发
- PX0 = 1; //外部中断0优先
- }
- void main(){
- unsigned char i,j;
- unsigned char backup[4][4] = {
- {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
- };
- EA = 1;
- ENLED = 0;
- ADDR3 = 1;
- ADDR2 = 1;
- ADDR1 =1 ;
- ADDR0 = 1;
- TMOD = 0x01;
- TH0 = 0xFC;
- TL0 = 0x67;
- intinit();
- ET0 = 1;
- TR0 = 1;
- P0 = LedChar[0];
-
- while (1){
- for(i=0;i<4;i++){
- for(j=0;j<4;j++){
- if(backup[i][j] != KeySta[i][j]){
- if(backup[i][j] != 0){
- P0 = (LedChar[i*4+j-OptCnt]);
- }
- }
- }
-
- }
-
- }
- }
- void IterruptTimer0() interrupt 1{
- unsigned char i;
- static unsigned char keyout = 0;
- static unsigned char keybuf[4][4] = {
- {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
- };
- TH0 = 0xFC;
- TL0 = 0x67;
- keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;
- keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;
- keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;
- keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;
- for (i=0;i<4;i++){
- if ((keybuf[keyout][i] & 0x0F) == 0x00){
- KeySta[keyout][i] = 0;
- }
- else if ((keybuf[keyout][i] & 0x0F) == 0x0F){
- KeySta[keyout][i] = 1;
- }
- }
- keyout++;
- keyout = keyout & 0x03;
- switch(keyout){
- case 0:KEY_OUT_4 = 1;KEY_OUT_1 = 0;break;
- case 1:KEY_OUT_1 = 1;KEY_OUT_2 = 0;break;
- case 2:KEY_OUT_2 = 1;KEY_OUT_3 = 0;break;
- case 3:KEY_OUT_3 = 1;KEY_OUT_4 = 0;break;
- default: break;
- }
- }
- void chufa() interrupt 0{ /*需设置中断优先级,与数码管动态扫描区分*/
- IE0 = 0;
- OptCnt++;
- led=~led;
-
- }
复制代码
所有资料51hei提供下载:
51传送带设计.zip
(30.53 KB, 下载次数: 66)
|