本系統(tǒng)基于stm32f10x為核心,數碼管顯示計數值和目標數量,在軟件中設置目標數量可設置的最大值。通過矩陣按鍵設置目標數量。按鍵計數設置傳送帶計數值,按鍵按下計數值數量加一,計數值與目標數量比較數量相等。計數值數量重置蜂鳴器報警,計數值和目標值不相等繼續(xù)計數。
仿真原理圖如下(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, 下載次數: 103)
2021-6-20 03:44 上傳
點擊文件名下載附件
|