本系统基于stm32f10x为核心,数码管显示计数值和目标数量,在软件中设置目标数量可设置的最大值。通过矩阵按键设置目标数量。按键计数设置传送带计数值,按键按下计数值数量加一,计数值与目标数量比较数量相等。计数值数量重置蜂鸣器报警,计数值和目标值不相等继续计数。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "stm32f10x.h"
- void GPIO_Config(void);
- void delay(uint32_t d){
- uint32_t i=0;
- uint32_t n=0;
- for(i=0;i<d;i++)
- for(n=0;n<800;n++);
- }
- uint8_t conveyor_scan(){
- if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9)==0){
- return 1;
- }
- return 0;
- }
- void keymat_line_set(uint8_t c){
- uint8_t bb[]={Bit_SET,Bit_SET,Bit_SET,Bit_SET};
- bb[c]=Bit_RESET;
- GPIO_WriteBit(GPIOC,GPIO_Pin_4, bb[0]);
- GPIO_WriteBit(GPIOC,GPIO_Pin_5, bb[1]);
- GPIO_WriteBit(GPIOC,GPIO_Pin_6, bb[2]);
- GPIO_WriteBit(GPIOC,GPIO_Pin_7, bb[3]);
- }
- uint8_t keymat_scan(){
- keymat_line_set(0);
- if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0)==0){
- return 1;
- }
- else if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1)==0){
- return 4;
- }
- else if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2)==0){
- return 7;
- }
- else if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)==0){
- return 0;
- }
- keymat_line_set(1);
- if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0)==0){
- return 2;
- }
- else if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1)==0){
- return 5;
- }
- else if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2)==0){
- return 8;
- }
- keymat_line_set(2);
- if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0)==0){
- return 3;
- }
- else if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1)==0){
- return 6;
- }
- else if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2)==0){
- return 9;
- }
- return 10;
-
- }
- uint8_t xtube[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void tube_show_one(uint8_t ti){
- //a
- if((ti&0x01)==0x01) GPIO_SetBits(GPIOA, GPIO_Pin_0);
- else GPIO_ResetBits(GPIOA, GPIO_Pin_0);
- //b
- if((ti&0x02)==0x02) GPIO_SetBits(GPIOA, GPIO_Pin_1);
- else GPIO_ResetBits(GPIOA, GPIO_Pin_1);
- //c
- if((ti&0x04)==0x04) GPIO_SetBits(GPIOA, GPIO_Pin_2);
- else GPIO_ResetBits(GPIOA, GPIO_Pin_2);
- //d
- if((ti&0x08)==0x08) GPIO_SetBits(GPIOA, GPIO_Pin_3);
- else GPIO_ResetBits(GPIOA, GPIO_Pin_3);
- //e
- if((ti&0x10)==0x10) GPIO_SetBits(GPIOA, GPIO_Pin_4);
- else GPIO_ResetBits(GPIOA, GPIO_Pin_4);
- //f
- if((ti&0x20)==0x20) GPIO_SetBits(GPIOA, GPIO_Pin_5);
- else GPIO_ResetBits(GPIOA, GPIO_Pin_5);
- //g
- if((ti&0x40)==0x40) GPIO_SetBits(GPIOA, GPIO_Pin_6);
- else GPIO_ResetBits(GPIOA, GPIO_Pin_6);
- //dp
- if((ti&0x80)==0x80) GPIO_SetBits(GPIOA, GPIO_Pin_7);
- else GPIO_ResetBits(GPIOA, GPIO_Pin_7);
-
- }
- void tube_open_place(uint8_t c){
- uint8_t bb[]={0,Bit_SET,Bit_SET,Bit_SET,Bit_SET};
-
- bb[c]=Bit_RESET;
- GPIO_WriteBit(GPIOA,GPIO_Pin_8, bb[1]);
- GPIO_WriteBit(GPIOA,GPIO_Pin_9, bb[2]);
- GPIO_WriteBit(GPIOA,GPIO_Pin_10, bb[3]);
- GPIO_WriteBit(GPIOA,GPIO_Pin_11, bb[4]);
- }
- void tube_show_data(uint8_t num,uint8_t max){
- uint8_t nmu_s=num/10;
- uint8_t num_g=num%10;
-
- uint8_t max_s=max/10;
- uint8_t max_g=max%10;
-
- tube_open_place(0);
- tube_show_one(xtube[nmu_s]);
- tube_open_place(1);
- delay(10);
- tube_open_place(0);
- tube_show_one(xtube[num_g]);
- tube_open_place(2);
- delay(10);
- tube_open_place(0);
- tube_show_one(xtube[max_s]);
- tube_open_place(3);
- delay(10);
-
- tube_open_place(0);
- tube_show_one(xtube[max_g]);
- tube_open_place(4);
- delay(10);
- }
- void beep_on(){
- GPIO_ResetBits(GPIOB, GPIO_Pin_6);
- }
- void beep_off(){
- GPIO_SetBits(GPIOB, GPIO_Pin_6);
- }
- uint8_t SYS_NUM=0;
- uint8_t SYS_MAX=99;
- uint8_t warn_num=0;
- uint8_t keymtv=0;
- uint8_t keymtv_last=10;
- uint8_t keyv=0;
- uint8_t keyv_last=0;
- uint8_t w_s_g_flg=0;
- int main(void)
- {
- uint8_t flag=0;
- GPIO_Config();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
传送带.7z
(103.36 KB, 下载次数: 101)
|